文章目录
- 1.配置
- 2.实现
- 3.实验
- 交流
ADC 双通道 DMA 收集内部温度和内部参考电压
1.配置
开启连续转换模式
转换通道数为2,通道1为温度传感器通道,通道2参考电压通道 配置DMA为字数据位宽为循环传输,外设到存储器,存储器传输地址指针增加(增量值取决于所选数据宽度)
2.实现
结构体数组存储和收集值在主函数中定义
#define AVMAX 10 struct {
uint16_t temp; uint16_t vref; } AdcValue[AVMAX];
开启采集,HAL_ADCEx_Calibration_Start一定要在HAL_ADC_Start_DMA使用前,校准收集的电压值,否则误差很大
HAL_ADCEx_Calibration_Start(&hadc1); HAL_ADC_Start_DMA(&hadc1, (uint32_t *)&AdcValue, sizeof(AdcValue) / sizeof(uint16_t));
计算收集电压的平均值。这里的平均值类型必须有符号数
int32_t temp = 0.0, vref = 0.0; for (uint8_t i = 0; i < AVMAX; i ) {
temp = AdcValue[i].temp; vref = AdcValue[i].vref; } temp /= AVMAX; vref /= AVMAX;
打印计算温度,计算公式: 温度(℃)= (当前电压值 - 25℃时间电压值)/平均斜率 25
查阅数据手册,在温度传感器特性表中获取25℃注意计算单位的电压值和平均斜率
printf("MCU Temperature : %.5f\r\n", ((temp * 3300.0 / - 1410) / 4.2 + 25));
打印内部参考电压
printf("Vrefint value = %1.3fV \r\n", vref * 3.3f / 4096);
3.实验
✔正确操作: 通过校准后,符合实际温度数值
❌错误操作: 当注释掉校准,测量值偏差较大
当启动后校准,数值完全错误
交流
项目仓库:https://github.com/dissor/F1-Link.git
git clone https://github.com/dissor/F1-Link.git
cd F1-Link
git reset --hard aa91d96983ab290c8fb13207b22920ced71a73e5
微信公众号:物联指北 B站:物联指北 千人企鹅群:658685162