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