STM32的HAL库开发---ADC

一、ADC简介

1、ADC,全称:Analog-to-Digital Converter,指模拟/数字转换器

把一些传感器的物理量转换成电压,使用ADC采集电压,然后转换成数字量,经过单片机处理,进行控制和显示。

 2、常见的ADC类型

3、并联比较型工作示意图

 假如VREF参考电压为8v,那么从下到上电压为1V,2V、、8V,Vx为模拟电压输入,假如输入电压为1V,那最下边的比较器就会给编码器输出电压,然后编码器经过编码,就是输出001,代表1V。如果输出为3V,则第三个比较器输出给编码器,输出011,代表3V。这个编码器输出是3位的,称为ADC的分辨率。

优点:转换速度快

缺点:成本高、功耗高、分辨率低,成本高主要是需要2的分辨率次方个电阻,这里分辨率为3,所以需要8个电阻,7个比较器。如果是12位的分辨率,需要4096个电阻和4095个比较器。

4、逐次逼近型工作示意图

首先是数码寄存器进行编码,一般是先把高位定位1,也就是100,然后经过D/A转换器转换成模拟电压,连接到比较器上边,输入电压Vx与这个电压进行比较,如果输入电压大于等于比较电压,控制电路会把数码寄存器的最高位锁存下来,然后第二轮把次高位置为1,当还是输入电压大,就把第二位也保存下来,将最低位设置为1,进行第三轮比对,如果输入电压还是比比较电压大,就超过了量程范围了,如果比比较电压小,就说明此时输入电压与比较电压接近,次数数码寄存器的值就是ADC的值了,采集也是接近,不是准确的。 

类似于天平,一点点的加大电压。

特点:分辨率和采样速度相互矛盾,分辨率越高,采样速率越低

优点:结构简单、低功耗

缺点:转换速度较慢

5、ADC的特性参数

分辨率:表示ADC能辨别的最小模拟量,用二进制位数表示,比如:8、10、12、16位等。可以理解为刻度划分,以12位为例,如果参考电压为3.3V,就会把3.3V平分为4096份。
转换时间:表示完成一次A/D转换所需要的时间,转换时间越短,采样率就可以越高,如果一次转换时间为200ms,则1s可以转换5次。
精度:最小刻度基础上叠加各种误差的参数,精度受ADC性能、温度和气压等影响
量化误差:用数字量近似表示模拟量,采用四舍五入原则,此过程产生的误差为量化误差。假设最小分辨率为1V,当输入电压为0.8V的时候,四舍五入被ADC采集后是1V,量化误差就是0.2V。

6、STM32各系列ADC的主要特性


二、ADC工作原理 

2.1 ADC框图简介

F1系列:

参考电压/模拟部分电压,其中VDDA和VSSA就是供电电源,VREF+和VREF-是参考电压。

输入通道,总共有16个通道,都是来自IO口的复用。可以看到图中ADC通道总共有18个,16个为IO口,还有两个通道,一个通道连接温度传感器,另一个连接内部参考电压VREFINT。

转换序列,决定18个通道怎么分组进行转换的。

触发源,一个是规则组触发,一个是注入组触发。规则组触发来自下面部分,首先需要将图中EXTRIG位置1。然后看图发现,由EXTSEL位决定。如果选择外部中断线11或者定时器8的,还需要多设置一个选择器。注入组触发跟规则组是类似的。只是触发源不一样。左边是ADC1和ADC2的触发源,右边的是ADC3的触发源。

转换时间,由ADC时钟影响。

数据寄存器,ADC转换结果会放到数据寄存器里边,有注入通道数据寄存器和规则通道数据寄存器。其中注入通道数据寄存器有4个,每个注入通道各对应一个寄存器。而规则通道数据寄存器只有一个,所以16个通道公用一个寄存器。由于公用可能导致数据丢失,所以下方有DMA请求,开启相应的DMA请求,让DMA帮助搬运数据,防止数据丢失。

⑦</

### 如何使用 STM32 ADC HAL 读取温度传感器 为了通过 STM32ADC HAL 来读取内置温度传感器的数据,需先初始化 ADC 并配置 DMA 来传输数据。下面是一个完整的示例代码展示如何设置并读取温度值。 #### 初始化函数 在 `main` 函数之前定义必要的全局变量用于存储 ADC 转换后的数值以及最终计算得到的温度: ```c // 定义全局变量以保存ADC转换结果和计算出的温度 uint32_t CPU_Temp_AD = 0; double cpu_temp = 0.0; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_ADC1_Init(void); int main(void) { /* Reset of all peripherals, Initializes the Flash interface and Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); while (1) { // 计算获取温度 cpu_temp = CalcCPUTemp(&hadc1); // 执行其他操作... HAL_Delay(1000); // 延迟一秒再继续下一次循环 } } ``` #### 温度计算函数 创建一个名为 `CalcCPUTemp()` 的辅助函数来进行多次采样平均化处理,并基于特定公式将 ADC 数字量转化为实际摄氏度温度[^3]: ```c /** * @brief Calculate temperature from ADC value. * * @param hadc Pointer to a ADC_HandleTypeDef structure that contains * the configuration information for the specified ADC module. * @return Calculated temperature as floating point number. */ double CalcCPUTemp(ADC_HandleTypeDef* hadc) { double temp = 0; // 开始DMA传输并将第一个样本放入CPU_Temp_AD中 HAL_ADC_Start_DMA(hadc, (uint32_t*)&CPU_Temp_AD, 1); HAL_Delay(5); // 短暂等待确保完成第一次采样 // 进行额外九次采样求均值减少误差影响 for(uint8_t i = 0; i < 9; ++i){ temp += CPU_Temp_AD; HAL_Delay(2); // 每两次之间稍作停顿 // 启动新的DMA请求覆盖旧值 HAL_ADC_Start_DMA(hadc, (uint32_t*)&CPU_Temp_AD, 1); HAL_Delay(5); // 继续等待新样本到来 } // 加上最后一次未计入循环内的初始样本 temp += CPU_Temp_AD; // 将总和除以十获得平均值后应用线性方程转换成温度单位 return ((1.43 - (temp / 10000)) + 25); } ``` 此方法利用了 STM32 内置的温度传感器特性,通过 ADC 测量 Vrefint 引脚上的电压水平从而推导出当前芯片的工作环境温度。注意这里的具体参数可能因不同的 MCU 版本而有所差异,请参照官方文档调整适用范围内的系数[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值