【GD32F310G-START】ADC获取片内温度并显示
<p><a href="https://bbs.eeworld.com.cn/thread-1201841-1-1.html">【GD32F310G-START】HELLO WORLD - GD32 MCU - 电子工程世界-论坛 (eeworld.com.cn)</a></p><p><a href="https://bbs.eeworld.com.cn/thread-1201927-1-1.html">【GD32F310G-START】OLED之HELLO EEWORLD——硬件I2C - GD32 MCU - 电子工程世界-论坛</a></p>
<p><a href="https://bbs.eeworld.com.cn/thread-1202153-1-1.html">【GD32F310G-START】SPI驱动ST7735 - GD32 MCU - 电子工程世界-论坛 (eeworld.com.cn)</a></p>
<p><a href="https://bbs.eeworld.com.cn/thread-1202166-1-1.html">【GD32F310G-START】硬件SPI驱动ST7735 - GD32 MCU - 电子工程世界-论坛 (eeworld.com.cn)</a></p>
<p> </p>
<p>adc 是常用的外设之一,今天根据例程获取片内温度值,并用LCD屏显示:</p>
<p>1、初始化ADC:</p>
<pre>
<code>/*!
\brief 初始化ADC
\paramnone
\param none
\retval none
*/
void my_adc_init(void)
{
/* 开启时ADC时钟 */
rcu_periph_clock_enable(RCU_ADC);
/* config ADC clock */
rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);
/* ADC channel length config */
adc_channel_length_config(ADC_INSERTED_CHANNEL, 2U);
/* ADC temperature sensor channel config */
adc_inserted_channel_config(0U, ADC_CHANNEL_16, ADC_SAMPLETIME_239POINT5);
/* ADC internal reference voltage channel config */
adc_inserted_channel_config(1U, ADC_CHANNEL_17, ADC_SAMPLETIME_239POINT5);
/* ADC trigger config */
adc_external_trigger_source_config(ADC_INSERTED_CHANNEL, ADC_EXTTRIG_INSERTED_NONE);
/* ADC data alignment config */
adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
/* ADC SCAN function enable */
adc_special_function_config(ADC_SCAN_MODE, ENABLE);
/* ADC temperature and Vrefint enable */
adc_tempsensor_vrefint_enable();
adc_external_trigger_config(ADC_INSERTED_CHANNEL, ENABLE);
/* enable ADC interface */
adc_enable();
delay_1ms(1U);
/* ADC calibration and reset calibration */
adc_calibration_enable();
}</code></pre>
<p>2、获取温度:</p>
<p>float get_gd32f310g_temper(void)<br />
{<br />
float temperature;<br />
adc_software_trigger_enable(ADC_INSERTED_CHANNEL);</p>
<p> /* value convert */<br />
temperature = (1.45f - ADC_IDATA0 * 3.3f / 4096) * 1000 / 4.3f + 25;<br />
return temperature;</p>
<p>}</p>
<p>3、在主循环里获取温度并刷到LCD屏上:</p>
<p>main.c</p>
<pre>
<code>#include "gd32f3x0.h"
#include "gd32f310g_eval.h"
#include "my_i2c.h"
#include "systick.h"
#include "ssd1306.h"
#include "lcd.h"
#include "lcd_init.h"
#include "adc.h"
uint8_t i2c_transmitter;
/*!
\brief main function
\paramnone
\param[out none
\retval none
*/
int main(void)
{
float temper_val;
uint8_t str_temper;
systick_config();
//my_i2c0_init();
// oled_display_test();
LCD_Init();//LCD初始化
LCD_Fill(0,0,LCD_W,LCD_H,BLUE);
LCD_ShowString(12,0,"GD32F320G",WHITE,BLUE,32,0);
LCD_ShowString(18,36,"EEWORDL",WHITE,BLUE,32,0);
LCD_ShowString(16,72,"2022-5-7",BLACK,BLUE,32,0);
LCD_ShowString(12,100,"gd32f310g_adc_demo",RED,BLUE,16,0);
my_adc_init();
/* infinite loop */
while(1)
{
temper_val = get_gd32f310g_temper();
sprintf(str_temper,"T:%.2f",temper_val);
LCD_ShowString(18,36,str_temper,WHITE,BLUE,32,0);
delay_1ms(500);
}
}
</code></pre>
<p>显示效果:</p>
<p>【总结】通过ADC的例程可以轻松的搞定,但是片内温度只反映MCU的温度,跟外环境的温度不成正比,所以还外用外置传感器来获取温度才行。</p>
<p><iframe allowfullscreen="true" frameborder="0" height="510" src="https://training.eeworld.com.cn/shareOpenCourseAPI?isauto=true&lessonid=33370" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
</p>
<p>1</p> 马尾さん 发表于 2022-5-8 00:26
1
<p>你好,谢谢我的观赏。给您提个建议,认真回复20个字以上有积分奖励,还有威望分。</p>
<p>赞!私以为加一个EOIC标志位的判定更加合理,但是实际上,对于此处温度测量已经能够实现效果了!</p>
javnson 发表于 2022-5-22 20:35
赞!私以为加一个EOIC标志位的判定更加合理,但是实际上,对于此处温度测量已经能够实现效果了!
<p>问了兆易的,说这个温度只能反映片内温度,测量外界的温度没有实际意义。</p>
lugl4313820 发表于 2022-5-22 20:47
问了兆易的,说这个温度只能反映片内温度,测量外界的温度没有实际意义。
<p>确实</p>
页:
[1]