打印
[应用相关]

CubeMX-使用ADC(16bit分辨率)模数转换器读取CPU的温度(串...

[复制链接]
911|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qcliu|  楼主 | 2021-9-4 17:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、前言

STM32H743内部集成了一个温度传感器,可以使用ADC3_INP18通道测量CPU当前的温度。

官方手册提供计算公式,值得注意的是,该公式成立的条件是参考电压为3.3V!!!!!!!!!!!!!
我使用的是硬石科技的H7开发板,外部参考电压是3.3V。如果芯片的外部参考电压是2.5V的话,我暂时也找不到方法计算MCU的温度!!!!!!!!!!!!!




使用特权

评论回复
沙发
qcliu|  楼主 | 2021-9-4 17:46 | 只看该作者
二、CubeMX
2.1、RCC


使用特权

评论回复
板凳
qcliu|  楼主 | 2021-9-4 17:47 | 只看该作者
2.2、SYS的配置


使用特权

评论回复
地板
qcliu|  楼主 | 2021-9-4 17:48 | 只看该作者
2.3、ADC的配置



使用特权

评论回复
5
qcliu|  楼主 | 2021-9-4 17:48 | 只看该作者
2.4、Clock Configuration



使用特权

评论回复
6
qcliu|  楼主 | 2021-9-4 17:50 | 只看该作者
四、代码
4.1、adc.c

函数void MX_ADC3_Init(void)下添加如下用户代码。


最后,在adc.c文件最底部编写函数float get_CPU_Temperature(uint32_t Timeout)。

float get_CPU_Temperature(uint32_t Timeout)

{


        uint16_t TS_CAL1;

        uint16_t TS_CAL2;


        HAL_ADC_Start(&hadc3);  /* 启动ADC3的转换 */


        if(HAL_OK == HAL_ADC_PollForConversion(&hadc3,Timeout))  /* 等待ADC3的转换,超时时间Timeout */

        {

                Temp_DC = HAL_ADC_GetValue(&hadc3);

        }

        else

        {

           printf("ADC Conversion failed! \n");

        }


        /* 根据参考手册给的公式计算温度值 */

    TS_CAL1 = *(__IO uint16_t *)(0x1FF1E820);

    TS_CAL2 = *(__IO uint16_t *)(0x1FF1E840);


    Temp_oC = ((110.0f - 30.0f) / (TS_CAL2 - TS_CAL1)) * (Temp_DC - TS_CAL1) + 30.0f;


    return Temp_oC;

}



使用特权

评论回复
7
qcliu|  楼主 | 2021-9-4 17:50 | 只看该作者
4.2、adc.h的代码


使用特权

评论回复
8
qcliu|  楼主 | 2021-9-4 17:51 | 只看该作者
4.3、main.h的代码


使用特权

评论回复
9
qcliu|  楼主 | 2021-9-4 17:52 | 只看该作者
4.4、main.c的代码



使用特权

评论回复
10
qcliu|  楼主 | 2021-9-4 17:54 | 只看该作者
五、DEBUG
5.1、Debug (printf)Viewer

顺利获取CPU的温度信息。


使用特权

评论回复
11
qcliu|  楼主 | 2021-9-4 17:55 | 只看该作者
5.2、观察实时变量


使用特权

评论回复
12
qcliu|  楼主 | 2021-9-4 17:56 | 只看该作者
六、细节补充
6.1、ADC的工作频率注意事项

网络上流传着ADC的工作频率不能超过80M,否则会不准。我认为大家可以注意一下这个问题。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

3308

帖子

4

粉丝