【ARM】Tiny4412裸板编程之ADC

00. 目录

文章目录

    • 00. 目录
    • 01. 开发环境
    • 02. ADC概述
    • 03. ADC特性
    • 04. ADC模块图
    • 05. ADC寄存器
    • 06. ADC电路连接
    • 07. 程序示例
    • 08. 附录

01. 开发环境

  • 开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」
  • 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
  • 平台:Ubuntu 20.04

02. ADC概述

10位或12位CMOS再循环式模拟数字转换器,它具有10通道输入,并可将模拟量转换至10位或12位二进制数。5Mhz A/D 转换时钟时,最大1Msps的转换速度。A/D转换具备片上采样保持功能,同时也支持待机工作模式。

03. ADC特性

ADC接口包括如下特性。

1)10bit/12bit输出位可选。

2)微分误差 1.0LSB。

3)积分误差 2.0LSB。

4)最大转换速率5Msps.

  1. 功耗少,电压输入1.8V。

6)电压输入范围 0~1.8V。

7)支持偏上样本保持功能。

8)通用转换模式。

04. ADC模块图

4412A/D转换器的控制器接口框图如下:
【ARM】Tiny4412裸板编程之ADC_第1张图片

05. ADC寄存器

5.0 A/D寄存器
【ARM】Tiny4412裸板编程之ADC_第2张图片

5.1 A/D控制寄存器ADCCON
【ARM】Tiny4412裸板编程之ADC_第3张图片

5.2 A/D转换数据寄存器ADCDAT0
【ARM】Tiny4412裸板编程之ADC_第4张图片

5.3 A/D转换的转换时间计算

例如: PCLK为66MHz,PRESCALER = 65 ;所有12位转换时间为

66MHz/(65+1) = 1MHz

转化时间为1/(1MHz/5 cycles) = 5us。

完成一次A/D转换需要5个时钟周期。A/D转换器的最大工作时钟为5MHz,所以最大采样率可以达到1Mit/s.

06. ADC电路连接

利用一个电位计输出电压到4412的AIN0管脚。输入的电压范围为0~1.8V。
【ARM】Tiny4412裸板编程之ADC_第5张图片

07. 程序示例

adc.h文件

#ifndef __ADC_H__
#define __ADC_H__

#include "gpio.h"

//ADC
#define ADC_CFG *(U32*)0x10010118
#define ADCCON *(U32*)0x126C0000
#define ADCDAT *(U32*)0x126C000C
#define ADCMUX *(U32*)0x126C001C

//ADC初始化
void adc_init(void);

//启动ADC转化
void adc_start(void);

int adc_end(void);

//获取ADC转化的值
U32 adc_get(void);

#endif/*__ADC_H__*/

adc.c文件

#include "adc.h"

//ADC初始化
void adc_init(void)
{
    ADC_CFG &= ~(0x1 << 16);

    //ADC输入通道选择  AIN0
    //ADCMUX &= ~0xf;

    // 100M/(19 + 1)
    ADCCON &= ~(0xff << 6);
    ADCCON = ADCCON | (19 << 6) | (1 << 14) | (1 << 16);

    //正常模式
    ADCCON &= ~(1 << 2);

}

//启动ADC转化
void adc_start(void)
{
    ADCCON |= 0x1;

}

//获取结束标志
int adc_end(void)
{

    return (ADCCON >> 15) & 0x1;
}

//获取ADC转化的值
U32 adc_get(void)
{
    return ADCDAT & 0xfff;
}

test.c文件

#include 
#include 

    

void (*udelay)(unsigned int) = (void*)0x43e26480;
int (*print)(const char *format, ...) = (void*)0x43e11a2c;

int main(void)
{
    //ADC初始化
    adc_init();

    print("main start\n");

    adc_start(); 

    while(1)
    {

        if (adc_end())
        {
            print("val = %d\n", adc_get());
        
            adc_start();    
        }
        
        delay(200000);
        
    }

    print("main end\n");

    return 0;
}

测试结果

val = 389
val = 384
val = 385
val = 380
val = 386
val = 395
val = 386
val = 365
val = 395
val = 383
val = 374
val = 390
val = 385
val = 381
val = 387
val = 372
val = 384
val = 384
val = 392
val = 384
val = 383
val = 383
val = 390
val = 379
val = 389
val = 374
val = 391
val = 367

08. 附录

Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf

你可能感兴趣的:(ARM)