本帖最后由 正点原子运营 于 2024-4-30 09:25 编辑
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板
2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版
6)正点原子STM32技术交流QQ群:725095144
本章介绍使用ADC采集STM32F103内部温度传感器输出的电压值,并根据该电压值计算出STM32F103芯片的大致温度。通过本章的学习,读者将学习到ADC、内部温度传感器的使用。 本章分为如下几个小节: 36.1 硬件设计 36.2 程序设计 36.3 下载验证
36.1 硬件设计 36.1.1 例程功能 1. LCD上不断刷新显示温度 2. LED0闪烁,提示程序正在运行
36.1.2 硬件资源 1. LED LED0 - PB5 2. 正点原子2.8/3.5/4.3/7/10寸TFTLCD模块 3. ADC1 Channel16
36.1.3 原理图 本章实验使用的内部温度传感器为STM32F103的片上资源,因此没有对应的连接原理图。
36.2 程序设计 36.2.1 HAL库的ADC驱动 本章实验与第三十五章“单通道ADC采集实验”十分相似,第三十五章实验中使用ADC2的Channel1采集PA1引脚上的电压,而本章实验是使用ADC1的Channel16采集STM32F103片内温度传感器的输出电压,因此大部分的内容都是相似的,以及操作ADC的方式都一样,因此请见第35.2.1小节中HAL库的ADC驱动的相关内容。
36.2.2 ADC驱动 本章实验的ADC驱动主要负责向应用层提供ADC的初始化以及获取内部温度传感器温度的函数。本章实验中,ADC的驱动代码包括adc.c和adc.h两个文件。 因为本章实验的ADC驱动与第三十五章“单通道ADC采集实验”的ADC驱动代码十分相似,因此请参考第35.2.1小节ADC驱动的相关内容,本小节仅讲解获取内部温度传感器温度的函数,如下所示: - /**
- *@brief 获取内部温度传感器结果
- *@param 无
- *@retval 内部温度传感器结果(扩大100倍)
- */
- int16_t adc_get_temperature(void)
- {
- uint16_t result;
- double voltage;
- double temperature;
- int16_t temperature_x100;
-
- result =adc_get_result_average(ADC_CHANNEL_TEMPSENSOR, 10);
- voltage = ((double)result * 3.3) / 4095;
- temperature = (1.43 - voltage) / 0.0043 + 25;
- temperature_x100 = (int16_t)(temperature * 100);
-
- return temperature_x100;
- }
复制代码从上面的代码中可以看到,在获取温度传感器的输出电压后,需要将电压值转换为实际的温度值,转换公式涉及内部温度传感器的物理特性,由芯片的设计厂家给出。
36.2.3 实验应用代码 本章实验的应用代码,如下所示: - int main(void)
- {
- int16_t temperature;
-
- HAL_Init(); /* 初始化HAL库 */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
- delay_init(72); /* 初始化延时 */
- usart_init(115200); /* 初始化串口 */
- led_init(); /* 初始化LED */
- lcd_init(); /* 初始化LCD */
- adc_temperature_init(); /* 初始化ADC采集内部温度传感器 */
-
- lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
- lcd_show_string(30, 70, 200, 16, 16, "TemperatureTEST", RED);
- lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
-
- lcd_show_string(30, 110, 200, 16, 16, "TEMPERATE:00.00C", BLUE);
-
- while (1)
- {
- /* 获取内部温度传感器结果 */
- temperature = adc_get_temperature();
-
- /* 显示温度 */
- if (temperature < 0)
- {
- temperature = -temperature;
- lcd_show_string(30 + 10 * 8, 110, 16, 16, 16, "-", BLUE);
- }
- else
- {
- lcd_show_string(30 + 10 * 8, 110, 16, 16, 16, " ", BLUE);
- }
- lcd_show_xnum(30 + 11 * 8, 110, temperature / 100, 2, 16, 0, BLUE);
- lcd_show_xnum(30 + 14 * 8, 110, temperature % 100, 2, 16, 0x80, BLUE);
-
- LED0_TOGGLE();
-
- delay_ms(100);
- }
- }
复制代码本章实验的应用代码很简单,在完成包括ADC之内的初始化后,便重复通过函数adc_get_temperature()获取内部温度传感器采集的温度值,并在LCD上实时显示。
36.3 下载验证 在完成编译和烧录操作后,便可看到LCD上不断地刷新显示STM32F103内部温度传感器采集到的温度值。 |