目錄
?
前言
一、查表函數(shù)
二、ADC采集? ? ? ?
三、查表
四、數(shù)據(jù)濾波
前言
記錄一些我在工作和學(xué)習(xí)過(guò)程中遇到的問(wèn)題。
NTC:在淘寶隨便買(mǎi)的
單片機(jī)型號(hào):STM32G030C8T6
目的:用單片機(jī)采集NTC溫度
代碼是小學(xué)生水平!
? ? ? ? 電路設(shè)計(jì)可以參考https://blog.csdn.net/qq_45217932/article/details/127513686?spm=1001.2014.3001.5501
一、查表函數(shù)
? ? ? ? NTC就是隨溫度變化阻值變化的傳感器,所以在硬件上只要計(jì)算出他現(xiàn)在是什么阻值就能得到他的溫度了,什么阻值對(duì)應(yīng)什么溫度。也就是阻值隨溫度變化的對(duì)照表。我在淘寶隨便買(mǎi)的隨便問(wèn)的,我買(mǎi)了兩個(gè)型號(hào)反正RT表是大差不差,可以參考一下。
? ? ? ? ?得到RT表只是第一步,還要把你測(cè)量的溫度范圍對(duì)應(yīng)的阻值打到軟件上,這樣才能形成這個(gè)表,純手打的有沒(méi)有打錯(cuò)我也沒(méi)一個(gè)一個(gè)對(duì)比,反正用到現(xiàn)在也是沒(méi)出錯(cuò)就對(duì)了。
#define NTCTABNum 251
float NTCTAB_2[NTCTABNum] = {
32.660,31.040,29.500,28.060,26.680,25.400,24.180,23.020,21.920,20.880, //0 -
19.900,18.970,18.090,17.260,16.460,15.710,15.000,14.320,13.680,13.070, //10 - 19
12.490,11.940,11.420,10.920,10.450,10.000,7.574 ,9.166 ,8.778 ,8.408 , //20 - 29
8.058 ,7.722 ,7.404 ,7.098 ,6.808 ,6.532 ,6.268 ,6.016 ,5.776 ,5.546 , //30 - 39
5.326 ,5.118 ,4.918 ,4.726 ,4.544 ,4.368 ,4.202 ,4.042 ,3.888 ,3.742 , //40 - 49
3.602 ,3.468 ,3.340 ,3.216 ,3.098 ,2.986 ,2.878 ,2.774 ,2.674 ,2.580 , //50 - 59
2.488 ,2.400 ,2.316 ,2.234 ,2.158 ,2.082 ,2.012 ,1.942 ,1.876 ,1.813 , //60 - 69
1.751 ,1.693 ,1.637 ,1.582 ,1.530 ,1.480 ,1.432 ,1.385 ,1.341 ,1.289 , //70 - 79
1.256 ,1.216 ,1.178 ,1.141 ,1.105 ,1.071 ,1.038 ,1.006 ,0.975 ,0.9452, //80 - 89
0.9164,0.8888,0.862 ,0.8364,0.8114,0.7874,0.7642,0.7418,0.7202,0.6994, //90 - 99
};
二、ADC采集? ? ? ?
????????在介紹采集之前,我想說(shuō)一下關(guān)于ADC+DMA,我想大家大部分都是用的這個(gè)采集的,我現(xiàn)在還是會(huì)用的階段。我就簡(jiǎn)單說(shuō)下我的理解吧,ADC全稱Analog-to-Digital Converter,模數(shù)轉(zhuǎn)換器顧名思義將模擬量轉(zhuǎn)換成數(shù)字量,在這里就是我們采集到的溫度(模擬量)經(jīng)過(guò)單片機(jī)的ADC轉(zhuǎn)換成0和1的數(shù)字量進(jìn)行數(shù)據(jù)分析。
? ? ? ? 而DMA全稱Direct Memory Access,直接儲(chǔ)存器訪問(wèn),在這里配合ADC實(shí)現(xiàn)了將ADC采集到的數(shù)據(jù)通過(guò)DMA傳輸?shù)街付ǖ膬?nèi)存空間,我們程序直接訪問(wèn)這個(gè)內(nèi)存空間就可以得到想要的數(shù)據(jù)了。這個(gè)挺重要的哦,新手不知道怎么配置移步百度一下先,后面我把他了解透透了也會(huì)出一個(gè)ADC+DMA的博文的。
? ? ? ? 好的,那么我們保證ADC+DMA配置順利,要準(zhǔn)備開(kāi)始采集了 。關(guān)于NTC的采集硬件設(shè)計(jì)在我之前的博文有更過(guò)大家可以參考一些,今天主要介紹軟件設(shè)計(jì)。
? ? ? ? 來(lái)!ADC采集數(shù)據(jù),并轉(zhuǎn)換成電阻
/***********************************************************************
功 能:將ADC采到的值轉(zhuǎn)換成電阻
參 數(shù):channel:指定的ADC通道
返回值:電阻值
*************************************************************************/
float GetResValue(void)
{
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC_Value, 1); //開(kāi)啟ADC DMA傳輸
float adc_v,res;
adc_v = (float)(ADC_Value[0]&0xFFF)*3.275/4096; //將采集到值轉(zhuǎn)換成電壓
res = 10 /( 4.096/adc_v - 1); //電壓轉(zhuǎn)換成電阻
return res;
}
三、查表
得到電阻值就可以對(duì)照查溫度了:
/***********************************************************************
功 能:查表函數(shù)
參 數(shù):1.tableNum :表格的元素的個(gè)數(shù)
2.*p:表格
返回值:當(dāng)前阻值下的溫度值
*************************************************************************/
float GetADCTemperature(float *p,uint8_t tableNum)
{
uint8_t i,index = 0;
float v1,v2,v3;
float tem;
float resdata;
resdata = GetResValue(); //電阻值
/*查表*/
for(i=0;i<(tableNum-1);i++)
{
if((resdata<p[i]) && (resdata>p[i+1]))
index = i;
}
v1 = p[index] - resdata;
v2 = p[index] - p[index+1];
v3 = v1/v2;
tem = v3+index;
return tem;
}
四、數(shù)據(jù)濾波
????????濾波還是很有必要的,我用的是比較傳統(tǒng)的濾波方式:掐頭去尾取平均值。經(jīng)過(guò)濾波和不經(jīng)過(guò)濾波數(shù)據(jù)還是區(qū)別蠻大的。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-534311.html
/***********************************************************************
功 能:掐頭去尾取平均值
參 數(shù):無(wú)
返回值:平均值
*************************************************************************/
#define NUM 30
#define NTCTABNum 102 //表內(nèi)數(shù)據(jù)個(gè)數(shù)
int ave_temp1[NUM+1];
int GetMedian_Temperature(void)
{
int i,j;
int tmp;
int ave_temp;
uint32_t sum1=0;
for(i=0;i<NUM;i++)
{
ave_temp1[i] = GetADCTemperature(NTCTAB_1,NTCTABNum)*10; //將測(cè)得的溫度值放大10倍存在int型數(shù)組中,方便后面上傳有人云
// HAL_Delay(100);
}
for(i=0;i<NUM-1;i++) //排序
{
for(j=0;j<(NUM)-i;j++)
{
if(ave_temp1[j]<ave_temp1[j+1])
{
tmp = ave_temp1[j];
ave_temp1[j] = ave_temp1[j+1];
ave_temp1[j+1] = tmp;
}
}
}
for(i=5;i<NUM-5;i++) //掐頭去尾取平均值
{
sum1 += ave_temp1[i];
}
ave_temp = sum1/(NUM-10);
return ave_temp;
}
? ? ? ? 我的數(shù)據(jù)最后是需要上云的,所以對(duì)數(shù)據(jù)要求有些特殊,大家如果也有特殊的顯示就要考慮數(shù)據(jù)的格式了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-534311.html
到了這里,關(guān)于STM32 熱敏電阻NTC的軟件設(shè)計(jì)(ADC采集)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!