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 / 4096 - 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

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐