ARM之ADC模数转换器的实现

需求:转动FS4412电阻(蓝色小旋钮),在超级终端显示采集到的电压值

ADC模数转换器:采集电压数据
模拟量-》数据量,电压值-》机器内部能够理解的数值    如:1V-》100        5V-》500
脚:特定功能脚、通用的IO脚、多功能脚(GPIO控制器配置)    精度:12位

备注:

红色:外部管脚(仅仅是名字,与硬件一一对应)    

蓝色:芯片内部管脚  连接内部的控制器,也可连接到第3方控制芯片    

特定功能脚:专门实现一种功能的管脚,例如:ADC模数转换器所使用的管脚,XadcAINn
通用管脚:GPIO、PIO、IO开头的管脚

多功能脚:一根管脚可以实现多个功能,以 '/' 连接,如LCD灯的XvSYS_OE

XvSYS_OE/GPF3_5        多功能管脚/普通IO脚


数值V: 1024/4096 == V/1.8    难点:裸机不支持浮点操作、但需要显示浮点值
解决办法:放大,手动标小数点
ADC模块的选择:General(通用) ADC and MTCADC_ISP    0x10010118  [16]  0
转换模式:ADCCON(ADC控制寄存器) 初始化后,    ADCDAT(数据转换寄存器) read
待命模式:TSADCCON0寄存器的TSSEL位为0、STANDBY位为1,转换数据停止,TSDATXn寄存器保存数据
编程模式:中断和轮询,轮询是 read ADCDATXn寄存器、检查最末端的ADCCONn标志位
ADCCONn标志位启动读时需要设置为1,边读边转换
阅读文档后,初步寄存器筛选:ADCCON ADCDLY(启动或者延时) ADCDAT ADCMUX(指定模拟输入通道)
不确定的便设置为默认,厂家一般给出的默认数值普通适应性都是最好的
ADCCON -》Base Address: 0x126C0000 [16]    1
    1、选择ADC模块:ADCCFG 0x1001_0118  [16]   0 : General ADC
    2、设置为转换模式: ADCCON
    3、转换后数据存储寄存器: ADCDAT
    4、不需要standy mode 
    5、adc poll(轮询)

    寄存器筛选:
    ADCCFG 0x10010118  [16]   0 : General ADC
    ADCCON 0x126C0000  0x1<<16 | 0x1<<14 | 0xff<<6 
    ADCDLY 0x126C0008  X 
    ADCDAT 0x126C000c  read..
    ADCMUX 0x126C001c  0x3

 main.c:

#include "uart.h"
//ADC模块寄存器器
#define ADCCFG   *(unsigned int volatile*)0x10010118
//控制寄存器
#define ADCCON   *(unsigned int volatile*)0x126C0000
//数据寄存器
#define ADCDAT  *(unsigned int volatile*)0x126C000c
//指定模拟输入通道寄存器
#define ADCMUX   *(unsigned int volatile*)0x126C001c
//分频寄存器
#define ADCDLY   *(unsigned int volatile*)0x126C0008

//自定义睡眠函数
void delay(){
    int t = 0xfffff*3;
    while(t--);
}
void adc_init()
{
    ADCCFG = ADCCFG & ~(0x1<<16);
    ADCCON = 0x1<<16 | 0x1<<14 | 0xff<<6 ;
    ADCMUX = 0x3;
    ADCCON = ADCCON | (0x1<<1);
}

int adc_read()
{
    return ADCDAT&0xfff;
}

void main()
{
    adc_init();
    while(1)
    {
        int data = adc_read();
        int v = data*18/4096;
        uart_send(v/10 +'0');
        uart_send('.');
        uart_send(v%10+'0');
        uart_send('\n');
        delay();
    }
}

Makefile、myadd.S、test.lds、uart.c、uart.h:ARM之串口的RTC时钟实现_承诺$枷锁的博客-CSDN博客

效果:

## Starting application at 0x41000000 ...
0.0
   1.2
      1.2
         1.2
            1.2
               1.2
                  1.2
                     1.2
                        1.2
                           1.0
                              0.6
                                 0.2
                                    0.0
                                       0.0
                                          0.5
                                             1.0
                                                1.5
                                                   1.7
                                                      1.7
                                                         1.7
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值