lugl4313820 发表于 2022-5-7 20:44

【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&mdash;&mdash;硬件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>&nbsp;</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 />
&nbsp; &nbsp; float temperature;<br />
&nbsp; &nbsp; adc_software_trigger_enable(ADC_INSERTED_CHANNEL);</p>

<p>&nbsp; &nbsp; /* value convert */<br />
&nbsp; &nbsp; temperature = (1.45f - ADC_IDATA0 * 3.3f / 4096) * 1000 / 4.3f + 25;<br />
&nbsp; &nbsp; 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&amp;lessonid=33370" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
&nbsp;</p>

马尾さん 发表于 2022-5-8 00:26

<p>1</p>

lugl4313820 发表于 2022-5-8 07:55

马尾さん 发表于 2022-5-8 00:26
1

<p>你好,谢谢我的观赏。给您提个建议,认真回复20个字以上有积分奖励,还有威望分。</p>

javnson 发表于 2022-5-22 20:35

<p>赞!私以为加一个EOIC标志位的判定更加合理,但是实际上,对于此处温度测量已经能够实现效果了!</p>

lugl4313820 发表于 2022-5-22 20:47

javnson 发表于 2022-5-22 20:35
赞!私以为加一个EOIC标志位的判定更加合理,但是实际上,对于此处温度测量已经能够实现效果了!

<p>问了兆易的,说这个温度只能反映片内温度,测量外界的温度没有实际意义。</p>

javnson 发表于 2022-5-24 09:25

lugl4313820 发表于 2022-5-22 20:47
问了兆易的,说这个温度只能反映片内温度,测量外界的温度没有实际意义。

<p>确实</p>
页: [1]
查看完整版本: 【GD32F310G-START】ADC获取片内温度并显示