前言
说到ADC都不陌生,没用过也听说过,ADC全称Analog-to-Digital Converter。
Analog,模拟;Digital,数字;Converter,转换器;Analog-to-Digital Converter模拟数字转换器, 是一种将模拟信号转换为数字信号的设备或电路。
简介
ADC转换分两种转换方式,一种是常规转换,一种是非常规转换。
-
常规转换:也称为连续转换或自动转换。在常规转换模式下,ADC按照预先配置的设置连续地对输入信号进行采样和转换。它可以持续地转换多个通道的数据,并在每次转换完成后自动更新结果。常规转换模式适用于需要连续监测或采集多个通道数据的应用,例如数据采集系统、实时监测系统等。
-
非常规转换:也称为单次转换或手动转换。在非常规转换模式下,ADC只在触发信号的作用下进行单次转换。转换结果仅在转换完成后可用,需要手动读取。非常规转换模式适用于需要按需采集或触发特定事件时才进行转换的应用,例如传感器触发、外部触发控制等。
非常规转换
ADC特点
特点以stm32f103为例:
1、f103的ADC具有12位分辨率。两个字节是16位,也就是说会有4位是0,是没有数据的,这时候就需要设置ADC的12位数据是靠左对齐,还是靠右对齐。
正如你所想,左对齐就是0bxxxx xxxx xxxx 0000,右对齐:0b0000 xxxx xxxx xxxx
2、数据对齐
3、带自校准。由于在使用中,ADC的性能总会受到一些外界的干扰。
在芯片手册上没有详细介绍怎么个校准法,我个人理解是,主要防止供电偏移影响,比如:单片机理论供电3.3V,但是在实际中,很难保证单片机的供电维持在3.3V这个点上,有可能是3.5,也有可能是3.1,当然实际上偏低的情况比较多,经常玩单片机的就知道,3.1V其实还算好的了,有时候甚至供电连3V都没有。以3.1V供电为例,如果没有校准,单片机仍然以3.3V为基准,ADC的精度自然也就差异比较大,误差将近30%。
了解之后,直接进入正题,stm32cubeMX走起。
硬件配置
非常规转换比较简单,如图,只需要选择好通道之后,配置这两个地方就好了。
软件
哪里需要调用到哪里,是不是很方便。
float Temp;
uint8_t ADC_val(uint8_t cnt) //cnt均值滤波次数
{
HAL_ADC_Start(&hadc2); //开始adc采集
HAL_ADC_PollForConversion(&hadc2, 0xff); //校准
for(uint8_t i=0;i<cnt;i++)
{
Temp+= HAL_ADC_GetValue(&hadc2);
}
HAL_ADC_Stop(&hadc2); //关闭adc
Temp=Temp/cnt/40950.0*3.3; //
return Temp;
}
✳ 抱歉,手搓的,这电脑没下载keil,也没东西测试,打开cnds发现这篇草稿好几个月了,一直没时间写完,没有验算过,不过因该没什么问题。