一、基础概念
1、概念
ADC将真实世界的例如温度、压力、声音或者图像等的模拟信号转换为更容易储存、处理和发射的数字形式。
2、分类
间接ADC:先将输入模拟电压转化为时间/频率等数字信号,例如双积分型ADC
直接ADC:直接转化为数字量,例如并联比较型,逐次逼近型ADC
3、ADC的处理
采样、保持、量化、编码
4、ADC的主要特点
ADC主要特点为采样率和位分辨率,采样率是ADC信号从模拟转换为数字的速度;位分辨率是ADC将信号从模拟转换为数字的精度。
5、DAC 模数转换器
一般使用DAC驱动电压,目前DAC主要用于波形生成领域
6、ADC的开关
通过在ADC_CR2寄存器上设置ADON位来上电,当第一次设置ADON时,它将ADC从power-down模式唤醒。
当设置SWSTART或者JSWSTART位开始转换
可以通过清除ADON位来停止转换并将ADC置于下电模式,这种模式下ADC几乎不消耗功率
7、温度传感器与VBAT内部共享连接在ADC1-IN18通道,一次只能选择一个转换器
8、ADC的常规应用的操作步骤
(1)使能ADC相关时钟
(2)指定ADC通道
(3)配置工作模式
(4)使能ADC
(5)进行模/数转换
二、功能需求
微处理器系统构成的测控设备通过USART串口与用户设备(上位机)相连。测控设备通过ADC1读取内置温度传感器,每隔1s获取一次芯片的内部温度,ADC1完成A/D转换,并将转换后的数字信号回传到上位机。
三、设计思路
管脚PA2和PA3分别为USART的TX和RX信号。ADC1选择内助温度通道,每隔1s软件触发一次单次转换,获取内部温度的数字信号后通过USART上传上位机。
四、代码实现
(1)ADC通道配置
配置ADC参数:ADC1转换通道采用内部温度传感器通道ADC_IN18,时钟源采用HCLK,利用软件触发,采用单次转换模式,转换精度为8bit,数据对齐方式为右对齐方式,
void AdcInit(void)
{
RCC->APB2ENR|=1<<8; // 使能ADC1的时钟
ADC->CCR|=(1<<23); // 使能内部温度传感器的参考电源
ADC1->SMPR1|=0x7<<18; // 设置转换时间
ADC1->SQR1&=~(0xF<<20); // 设置常规通道序列长度为1
ADC1->SQR3=(ADC1->SQR3&~(0x1F))|18; // 设置常规通道0为ADC_IN18
ADC1->CR1=(2<<24)|(1<<11); //设置常规转换为非连续模式,转换精度为8bit,通道数为1
ADC1->CR2=1; //设置常规转换为单次模式,右对齐,非外部触发,使能ADC
}
(2)ADC启动函数
void AdcRun()
{
ADC1->SR&=~2;
ADC1->CR2|=1<<30; //开始A/D转换
return;
}
(3)ADC数据获取函数
int AdcGet(unsigned char*pdat)
{
if(!(ADC1->SR&2))
return 0; // 未完成转换,返回失败
*pdat=(unsigned char)ADC1->DR; // 转换完成,读取转换值
return 1; //返回成功
}