lugl4313820 发表于 2022-5-9 20:30

【GD32F310G-START】NTC温度计

<p><a href="https://bbs.eeworld.com.cn/thread-1202376-1-1.html">【GD32F310G-START】电压表 - GD32 MCU - 电子工程世界-论坛 (eeworld.com.cn)</a></p>

<p>在获取电压后,得到它的电压十分的准确,接上NTC后,立马变成温度计了:</p>

<p>原理图:</p>

<p></p>

<p>1、程序,在ADC获到电压的基础之上增加电阻获取与温度转换:</p>

<p>&nbsp;</p>

<pre>
<code>/*10K NTC 温度与阻值对应表 X轴代表温度Y轴代表阻值*/
int X_Temp = {-30,-20,-15,-10,-3,-2,-1,0,6,12,18,25,31,37,45,50,57,63,70,76,83,89,94,100};
int Y_Res = {1706211,938797,707223,537697,371848,35241,33567,31908,23698,17794,13498,9900,7625,5925,4288,3529,2709,2177,1701,1386,1101,909,778,649};

/*************************************************
*函数名称:OneDimensionalEquation                                 
*功    能:解一元一次方程   给出两点坐标和第三点的x值或y值得出第三点y值或x值                        
*参    数:                                    
*返 回 值:                                    
*************************************************/
float OneDimensionalEquation(int x1,int y1,int x2,int y2,int Unkown_x,int Unkown_y)
{
        float k = 0;
        float b = 0;
       
        k = (((int32_t)y1-(int32_t)y2)/((int32_t)x1-(int32_t)x2));
        b = y1-x1*k;
       
        if(0 == Unkown_x)//如果unknown_x设为0 就是求x的值 否则求y值
                return ((float)Unkown_y-b)/k;
        else
                return ((float)Unkown_x*k+b);
}
/*************************************************
*函数名称:uint8_t Res_To_Temperature(uint16_t NTC_Res)                  
*功    能:计算真实温度            
*参    数:NTC当前阻值                           
*返 回 值:温度值                           
*************************************************/
float Res_To_Temperature(uint16_t NTC_Res)
{
        uint8_t Loop = 0;
        uint8_t StartPoint = 0;
        float RealTemp = 0;
       
        /*查找阻值所对应的区间*/
        for(Loop = 0;Loop &lt; 17;Loop++)
        {
                if(NTC_Res &gt; Y_Res)
                {
                        StartPoint = Loop;
                        break;
                }
        }

        RealTemp = (float)OneDimensionalEquation(X_Temp,Y_Res,X_Temp,Y_Res,0,NTC_Res);

        return RealTemp;
}

float get_temper(uint8_t channel)
{
uint16_t value,R_value;
float R;
value = adc_Channel_Average(ADC_CHANNEL_9);
R_value = (value * 10000)/(4096-value);
return Res_To_Temperature(R_value);
}</code></pre>

<p>主程序:</p>

<pre>
<code>vref_value = get_temper(ADC_CHANNEL_9);
sprintf(show_adc_str,"%.2f C",vref_value);
LCD_ShowString(18,36,show_adc_str,WHITE,BLUE,32,0);
</code></pre>

<p><iframe allowfullscreen="true" frameborder="0" height="510" src="https://training.eeworld.com.cn/shareOpenCourseAPI?isauto=true&amp;lessonid=33372" style="background:#eee;margin-bottom:10px;" width="700"></iframe><br />
这样一个温度计可以了,一下步用无线串口发送给RVB2601,完成温度采样。</p>

okhxyyo 发表于 2022-6-16 22:31

<p>温度计误差有做校准处理吗</p>

lugl4313820 发表于 2022-6-17 07:10

okhxyyo 发表于 2022-6-16 22:31
温度计误差有做校准处理吗

<p>这个只是做示例吧,没有量产的准备,所以没有考虑标定。</p>
页: [1]
查看完整版本: 【GD32F310G-START】NTC温度计