OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2978|回复: 1

STM32F429的RT-Thread读取内部温度传感器注意事项

[复制链接]

22

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2014-4-30
在线时间
26 小时
发表于 2020-1-8 16:27:13 | 显示全部楼层 |阅读模式


    rt_adc_device_t adc_device = RT_NULL;
    adc_device = (rt_adc_device_t)rt_device_find("adc1");
    rt_adc_enable(adc_device,ADC_CHANNEL_TEMPSENSOR);

      ad = rt_adc_read(adc_device,ADC_CHANNEL_TEMPSENSOR)/4095.0f*3.3f; // 电压
      temp = (ad-0.76f)/0.0025f + 25.0f; //转换为温度值



以上代码直接运行会出现 "ADC channel must be between 0 and 18."

我已经尝试了把ADC_CHANNEL_TEMPSENSOR改为18 ,结果是:temp = -189.71 ℃,显然不对。

ADC_CHANNEL_TEMPSENSOR的宏定义是:
#define ADC_CHANNEL_TEMPSENSOR  ((uint32_t)ADC_CHANNEL_18 | ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT)


这里发现 《drv_adc.c 》中       static rt_uint32_t stm32_adc_get_channel(rt_uint32_t channel)
#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4)
    case 18:
        stm32_channel = ADC_CHANNEL_18;

    break;

很显然,RT-Thread的团队并没有考虑你会用ADC读取MCU内部温度这个问题,

简单粗暴的办法是在是把宏定义ADC_CHANNEL_TEMPSENSOR改为18,(使用18通道),把上面的代码改为
    case 18:
        stm32_channel = ADC_CHANNEL_18 | ADC_CHANNEL_DIFFERENCIATION_TEMPSENSOR_VBAT;

    break;



另一种方法是在上述代码之后加入:
    case ADC_CHANNEL_TEMPSENSOR:
        stm32_channel = ADC_CHANNEL_TEMPSENSOR;
        break;

在static rt_err_t stm32_get_adc_value(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value)
函数中把原来的  if (channel <= 18)改为
    if (channel <= 18 || channel== ADC_CHANNEL_TEMPSENSOR)



改好之后测试     temp = 30.13 ℃

不知道各位还有没有更好的办法。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10567
金钱
10567
注册时间
2017-2-18
在线时间
1913 小时
发表于 2020-1-9 12:58:43 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-11 13:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表