需求:转动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