熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2016-10-23 15:40
正文摘要:大家有沒有用PT100或是熱敏電阻還是其他溫度傳感器做測(cè)溫系統(tǒng),請(qǐng)奉上思路與圖,感謝萬分⊙﹏⊙ |
pt100接一個(gè)tl431恒流源再接2個(gè)運(yùn)放加調(diào)零出來就是電壓的變化再接個(gè)tl1543AD轉(zhuǎn)換接到單片機(jī)里計(jì)算電阻值在計(jì)算溫度temp_r=((float)temp)*5000/(1024*20)+100; //計(jì)算電阻值。[img]C:\Users\asus\Desktop\E13DA9FA454BBB6930F3639E5E9D33EE.pngC:\Users\asus\Desktop\4700A418B4F82E4F6F6DE1ED1AB49134.png[/img] |
這個(gè)電路不妨用麵包板,試做看看(或是用仿真軟體模擬看看)...例如測(cè)試範(fàn)圍從 0到 100度 輸出Vo從0到4.92 這個(gè)電路就可以用 |
pingguotu 發(fā)表于 2016-10-29 15:26 熱敏電阻3950的測(cè)溫單片機(jī)里程序 code uint VOL[]和code uint Temper[]中的數(shù)據(jù)是怎么計(jì)算查表得到的。 result=(uint)((res/2048.0-1.0)*500.0); temp1=abs(result-VOL[0]); for(i=1;i<150;i++) { temp2=abs(result-VOL); if(temp1>=temp2) { temp1=temp2; flag=i; } 這一段程序是什么意思呢? :#include <reg52.h> #include <intrins.h> #include <math.h> typedef unsigned char uchar; typedef unsigned int uint; code uint VOL[]={ 343, 339, 339, 335, 332, 332, 328, 324, 320, 320, 316, 312, 312, 308, 304, 300, 300, 296, 292, 292, 289, 285, 285, 281, 277, 273, 273, 269, 265, 265, 261, 257, 257, 253, 250, 250, 246, 242, 242, 238, 234, 234, 230, 230, 226, 222, 222, 218, 218, 214, 210, 210, 207, 207, 203, 199, 199, 195, 195, 191, 191, 187, 187, 183, 179, 179, 175, 175, 171, 171, 167, 167, 164, 164, 160, 160, 160, 156, 156, 152, 152, 148, 148, 144, 144, 140, 140, 140, 136, 136, 132, 132, 132, 128, 128, 125, 125, 125, 121, 121, 121, 117, 113, 109, 109, 105, 101, 101, 97, 97, 93, 89, 89, 85, 85, 82, 82, 78, 78, 74, 74, 70, 70, 66, 66, 66, 62, 62, 58, 58, 58, 54, 54, 54, 50, 50, 50, 46, 46, 46, 42, 42, 42, 42, 39, 39, 39, 39, 35, 35}; code uint Temper[]={ 100, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500, 1550 1600, 1650, 1700, 1750, 1800, 1850, 1900, 1950, 2000, 2050, 2100, 2150, 2200, 2250, 2300, 2350, 2400, 2450, 2500, 2550, 2600, 2650, 2700, 2750, 2800, 2850, 2900, 2950, 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350, 3400, 3450, 3500, 3550, 3600, 3650, 3700, 3750, 3800, 3850, 3900, 3950, 4000, 4050, 4100, 4150, 4200, 4250, 4300, 4350, 4400, 4450, 4500, 4550, 4600, 4650, 4700, 4750, 4800, 4850, 4900, 4950, 5000, 5050, 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000, 6100, 6200, 6300, 6400, 6500, 6600, 6700, 6800, 6900, 7000, 7100, 7200, 7300, 7400, 7500, 7600, 7700, 7800, 7900, 8000, 8100, 8200, 8300, 8400, 8500, 8600, 8700, 8800, 8900, 9000, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, 10000}; sbit STS=P1^0; sbit CE = P1^1; sbit CS=P1^2; sbit A0=P1^3; sbit RC=P1^4; sbit RS=P1^5 ; sbit RW=P1^6 ; sbit EN=P1^7 ; void delay_ms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } uint AD1674_Read(void) { uint temp; uchar temp1,temp2; CS=1; //片選信號(hào) CE=0; //初始化,關(guān)閉數(shù)據(jù)采集 CS=0; A0=0; RC=0; CE=1;//CE=1,CS=0,RC=0,A0=0啟動(dòng)12位溫度轉(zhuǎn)換 _nop_(); while(STS==1); //等待數(shù)據(jù)采集結(jié)束 CE=0; //芯片使能關(guān)閉 RC=1; A0=0; CE=1;//CE=1,CS=0,RC=1,12/8=1,A0=0 允許高八位數(shù)據(jù)并行輸出 _nop_(); temp1=P0; //讀取轉(zhuǎn)換結(jié)果的高八位 CE=0; //芯片使能關(guān)閉 RC=1; A0=1; CE=1;//CE=1,CS=0,RC=1,12/8=0,A0=1 允許低四位數(shù)據(jù) 并行輸出 _nop_(); temp2=P0; //讀取轉(zhuǎn)換結(jié)果的第四位 temp=((temp1<<4)|(temp2&0X0F)); //高位和低位合成實(shí)際溫度,temp2為PO口的高四位 return (temp); //還回轉(zhuǎn)換結(jié)果,右移四位是因?yàn)閠emp2為P0口的高四位 } /*** 寫數(shù)據(jù)***/ void w_dat(unsigned char dat) { RS = 1; //EN = 0; P2 = dat; delay_ms(5); RW = 0; EN = 1; EN = 0; } /*** 寫命令***/ void w_cmd(unsigned char cmd) { RS = 0; // EN = 0; P2 = cmd; delay_ms(5); RW = 0; EN = 1; EN = 0; } /*** 發(fā)送字符串到LCD***/ void w_string(unsigned char addr_start, unsigned char *p) { unsigned char *pp; pp = p; w_cmd(addr_start); while (*pp != '\0') { w_dat(*pp++); } } /*** 初始化1602****/ void Init_LCD1602(void) { EN = 0; w_cmd(0x38); // 16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口 w_cmd(0x0C); // 顯示器開、光標(biāo)開、光標(biāo)允許閃爍 w_cmd(0x06); // 文字不動(dòng),光標(biāo)自動(dòng)右移 w_cmd(0x01); // 清屏 } void process(uint date,uchar add) { uchar A[7]; A[0]=date/1000%10+'0'; A[1]=date/100%10+'0'; A[2]='.'; A[3]=date/10%10+'0'; A[4]=date%10+'0'; A[5]='C'; w_string(add,A); } void main() { uchar i,flag=0; uint result,temp1,temp2; float res; Init_LCD1602(); w_string(0x80,"Temper:"); while (1) { res=(float)(AD1674_Read()); result=(uint)((res/2048.0-1.0)*500.0); temp1=abs(result-VOL[0]); for(i=1;i<150;i++) { temp2=abs(result-VOL); if(temp1>=temp2) { temp1=temp2; flag=i; } } process(Temper[flag],0x80+7); } |
通過熱敏電阻的阻值變化,通過MCU的ADC獲取熱敏電阻的兩端電壓變化,計(jì)算出相應(yīng)的電阻值,根據(jù)組織查邊獲取溫度值,首先熱敏電阻便宜,電阻簡(jiǎn)單,查表方便,相應(yīng)的江都不高一般是0.1攝氏度吧! |
yzwzfyz 發(fā)表于 2016-10-26 00:06 我昨天認(rèn)真的看了你給我的那個(gè)圖,看分析不是很明白,我又不敢問你了,你說你說的已經(jīng)夠多了,哎,人傻了,不過還是很謝謝你給我的指點(diǎn)啦^_^ |
劉海龍 發(fā)表于 2016-10-26 22:47 剛剛老師又回復(fù)我了說A/D轉(zhuǎn)換電路不一定用0809,看自己的需求 |
劉海龍 發(fā)表于 2016-10-26 22:47 (⊙o⊙)哦,是這樣啊,不過我剛剛問了老師,他老古董,只準(zhǔn)用89C51單片機(jī),可能A/D 0809轉(zhuǎn)換電路還要重新單獨(dú)做,我們最后得仿真然后焊接出來,所以現(xiàn)在正在確定電路,因?yàn)槔鲜潜淮蛳聛,說太簡(jiǎn)單,不準(zhǔn)用模塊,心塞 |
七顆星星 發(fā)表于 2016-10-26 21:58 stc單片機(jī)就是51單片機(jī),只不過是增強(qiáng)型51單片機(jī)(把ADC轉(zhuǎn)換器PWM模塊等集成到了單片機(jī)內(nèi)部) 我寫的NTC10k測(cè)溫系統(tǒng)的程序其實(shí)就是利用單片機(jī)內(nèi)部的ADC轉(zhuǎn)換器將模擬信號(hào)轉(zhuǎn)化為數(shù)字信號(hào)顯示出來的,完全符合你們老師的要求。 |
劉海龍 發(fā)表于 2016-10-25 21:35 我看了大神的,那個(gè)單片機(jī)可不可以用51單片機(jī)呀?還有我覺得老師的意思好像是還要我利用A/D轉(zhuǎn)換器然后將模擬信號(hào)變成數(shù)字信號(hào),然后顯示出來 |
劉海龍 發(fā)表于 2016-10-25 21:35 哇噻噻~真的是大神吶~崇拜,星星眼(☆_☆) |
謝謝分享 |
“二極管測(cè)溫范圍有限,0~60“? 理論上,二極管特性與溫度有關(guān),并不受溫度限制,只要二極管不壞(超高溫引起的物理損壞)。 所以低于0.高于60都能用于測(cè)溫! |
順便提一下,二極管測(cè)溫范圍有限,0~60。太高了,不好。 |
實(shí)例67 LCD1602顯示屏顯示 先Proteus仿真一下,確認(rèn)有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil C和Proteus》清華大學(xué)出版社ISBN 978-7-302-41682-1 書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。 |
本帖最后由 zl2168 于 2016-10-25 09:53 編輯 實(shí)例84 ADC0832串行A-D(虛擬CLK) 先Proteus仿真一下,確認(rèn)有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil C和Proteus》清華大學(xué)出版社ISBN 978-7-302-41682-1 書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。 |
本帖最后由 zl2168 于 2016-10-25 09:54 編輯 給你提供幾個(gè)參考案例 實(shí)例83 ADC0832串行A-D(TXD輸出CLK) 先Proteus仿真一下,確認(rèn)有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil C和Proteus》清華大學(xué)出版社ISBN 978-7-302-41682-1 書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。 |
本帖最后由 zl2168 于 2016-10-25 09:41 編輯 樓主選擇測(cè)溫元件可以選二極管,也可選擇熱敏電阻抑或其他測(cè)溫元件。但橋式取樣電路是經(jīng)典的,其連接方式應(yīng)根據(jù)測(cè)溫元件屬正溫度系數(shù)還是負(fù)溫度系數(shù)。正溫度系數(shù)測(cè)溫元件可按我上傳的電路形式連接,若是負(fù)溫度系數(shù)測(cè)溫元件,與運(yùn)放連接應(yīng)交換輸入端,否則輸出電壓為負(fù)極性。 |
本帖最后由 zl2168 于 2016-10-25 09:31 編輯 測(cè)溫元件的非線性幾乎是不可避免的,無論是二極管、熱敏電阻抑或其他元件,修正的簡(jiǎn)單方法就是查表,預(yù)先測(cè)得真實(shí)溫度與非線性測(cè)溫元件的一一對(duì)應(yīng)數(shù)表,然后在程序中查表修正。 我上文所提及的非線性是指放大電路的非線性,例如,對(duì)溫度信號(hào)Ut與基準(zhǔn)電壓之間差值的非線性:Uo1=91Ut-90Uref。還有對(duì)接近電源電壓+5V時(shí)的運(yùn)放飽和區(qū)非線性,接近0電壓時(shí)的運(yùn)放截止區(qū)非線性,等等。 |
逝者如斯夫。 |
不要以為不線性,就對(duì)測(cè)溫有影響了。其實(shí)沒有電阻與成線性關(guān)系的。不線性也無關(guān)系,計(jì)算機(jī)就是干這個(gè)活的! 定定心心來做,哪一種方式都可以實(shí)現(xiàn)。 做復(fù)雜了,可以多積累一點(diǎn)經(jīng)驗(yàn)。做簡(jiǎn)單了,完成的勝算多一點(diǎn)。不必糾結(jié)。開工吧。 做這個(gè)題目,你跳不掉做一個(gè)查表的程序。除非老師不考你“對(duì)非線性的處理及不規(guī)則曲線的處理” |
熱敏電阻測(cè)溫可以實(shí)現(xiàn),根據(jù)電阻特性解方程t=(Rt-B)/K就可以得到溫度了 |
zl2168 發(fā)表于 2016-10-24 21:38 謝謝你了^_^我會(huì)好好看你的資料和分析的。讓你費(fèi)心了,主要我又不太有設(shè)計(jì)理念,就想照搬一下,做出東西來 |
本帖最后由 zl2168 于 2016-10-25 09:34 編輯 給你的電路不看,自己找一個(gè)不太好的電路。 你自己找的電路可勉強(qiáng)用,但不太好,有問題。 第一級(jí)運(yùn)放,差動(dòng)放大,Uo1=91Ut-90Uref,其中Ut為溫度信號(hào),Uref為基準(zhǔn)電壓。這種91Ut-90Uref的差動(dòng)比例放大,本身就是非線性的 第二級(jí)運(yùn)放,反相放大,Uo1=2Ut-Uref 你用的運(yùn)放為L(zhǎng)M358,雙運(yùn)放,但加的電源電壓是單極性的,那么0點(diǎn)及最高點(diǎn)5V處會(huì)產(chǎn)生非線性放大,你除了測(cè)溫元件非線性,放大電路也是非線性的。 優(yōu)點(diǎn)是取樣電路電源電壓比較穩(wěn)定,由431穩(wěn)壓。但意義不是很大,因電源電壓略有波動(dòng)對(duì)Ut和Uref作用是相同的。具有共模性質(zhì),被運(yùn)放抑制。 我給你介紹的電路與你的電路結(jié)構(gòu)基本相同,但細(xì)節(jié)好得多。 ![]() 橋式取樣。由R4、D1分壓取得溫度信號(hào)Ut,不過測(cè)溫元件是二極管;由R5、R7、RP1分壓取得基準(zhǔn)電壓Uref,這個(gè)Uref是可調(diào)的,RP1用于調(diào)節(jié)零度基準(zhǔn)(對(duì)應(yīng)于AD轉(zhuǎn)換器的最小值00H),而且為了防止電位器噪聲,加了一個(gè)濾波電容。 第一級(jí)運(yùn)放,差動(dòng)放大。由于4個(gè)10k,組成減法器,Uo1=Uref-Ut。 第二級(jí)運(yùn)放,反相放大,Uo2=Au*Uo1,Au可調(diào),RP2用于調(diào)節(jié)滿度(AD最大值FFH) 為了是運(yùn)放放大有較好的線性度,運(yùn)放正電源電壓比AD轉(zhuǎn)換器的電源電壓略高,取6.2V;運(yùn)放負(fù)電源電壓取-0.7V。就避免了你電路0V和5V處的非線性。 再有,你只需一路AD,用不著8路AD 0809,0809是并行AD,太龐大復(fù)雜,沒必要。用只有2路AD的串行AD,足夠了,體積小,成本低,編程相對(duì)方便。 好了,不說了,我已經(jīng)對(duì)你說得太多了。 |
1062298577 發(fā)表于 2016-10-24 07:52 是滴嘞,老師說數(shù)字傳感器里面已經(jīng)是一個(gè)模塊了,除了自己要做一個(gè)最小系統(tǒng)自己什么都不用干,哪能這么簡(jiǎn)單,我也是要暈了~ |
PT100測(cè)溫范圍廣,耐高溫,是溫敏電阻是比較高級(jí)的傳感器,就是價(jià)格高。Pt是貴金屬。 |
我有上面提到的方式,是我們產(chǎn)品應(yīng)用的實(shí)例,硬件上就是兩個(gè)電阻分壓(一個(gè)是熱敏),采樣分壓值。已是最簡(jiǎn)單了。溫度表格的計(jì)算稍麻煩一點(diǎn),不過用EXCEL計(jì)算也很方便。單片機(jī)程序就是采樣、查表、溫度的小數(shù)部分,做個(gè)插值就OK了。 |
PT100貴! 電路差別不大,因?yàn)槎紝儆陔娮柁D(zhuǎn)電壓。 對(duì)照表的生成,在PC機(jī)上完成,復(fù)制到單片機(jī)中即可。 |
用pt100吧,這個(gè)器件的線性很好 以下代碼是我擬合了PT100,cu50,BA1,BA2的曲線,你可以參考使用。
|
你老師意思肯定是不能用數(shù)字傳感器咯 |
yzwzfyz 發(fā)表于 2016-10-23 22:48 很感謝大神,我明白你的思路,不過讓我設(shè)計(jì)電路圖想想小女子就汗顏,藍(lán)瘦。不過嘛我在想是用PT100還是其他你這個(gè)熱敏電阻電路會(huì)簡(jiǎn)單些 |
發(fā)一部分計(jì)算值給你參考,3950是熱敏電阻的型號(hào) |
溫度℃ 3950電阻K 采樣電壓 AD值 AD取整 -20 98.26 2.995178275 928.95908 929 -19 92.74 2.978800857 923.879599 924 -18 87.55 2.961711943 918.5794464 919 -17 82.69 2.943974539 913.0781638 913 -16 78.12 2.925510667 907.351566 907 -15 73.83 2.906346177 901.4076703 901 -14 69.8 2.886466165 895.2418546 895 -13 66.01 2.865846599 888.8466649 889 -12 62.45 2.844513458 882.2301587 882 -11 59.1 2.822431259 875.3813314 875 -10 55.95 2.799620925 868.3066717 868 -9 52.98 2.776024135 860.9880915 861 -8 50.19 2.751736169 853.4551421 853 -7 47.57 2.726784784 845.7164322 846 -6 45.09 2.700980214 837.7131058 838 -5 42.76 2.674526156 829.5083397 830 -4 40.56 2.647310127 821.0672468 821 -3 38.49 2.619447309 812.4255517 812 -2 36.53 2.590780142 803.5343864 804 -1 34.68 2.561414503 794.4265891 794 0 32.94 2.531485794 785.1441546 785 1 31.3 2.500968523 775.6791768 776 2 29.74 2.469602416 765.9509311 766 3 28.28 2.437931034 756.1280042 756 4 26.89 2.405448631 746.0535375 746 5 25.58 2.372512648 735.8383924 736 6 24.34 2.339021549 725.4510775 725 7 23.17 2.305125113 714.9380464 715 8 22.06 2.270679975 704.2548347 704 9 21.01 2.235827153 693.445179 693 10 20.01 2.200366544 682.4470177 682 11 19.07 2.164809082 671.4188166 671 12 18.18 2.128956707 660.2991483 660 13 17.33 2.092535675 649.0031101 649 14 16.53 2.056125141 637.7103279 638 15 15.77 2.019441211 626.3327513 626 16 15.05 1.982634731 614.9171657 615 17 14.37 1.945876077 603.5164136 604 18 13.72 1.908768971 592.0075885 592 19 13.1 1.871428571 580.4264069 580 20 12.52 1.834635879 569.0150977 569 21 11.96 1.79726776 557.4253188 557 22 11.43 1.76010266 545.8985068 546 23 10.93 1.723315815 534.489011 534 24 10.45 1.686308068 523.0110024 523 25 10 1.65 511.75 512 26 9.569 1.613659359 500.4788952 500 |
表格不必做得很密,表格之間的數(shù)據(jù)(指兩個(gè)相鄰數(shù)據(jù)之間的數(shù)據(jù)),無法直接取得溫度值,可以用插值的方法估算得到。 |
采樣電壓變化的原因,是“10K的熱敏阻”阻值的變化,將“熱敏阻”阻值與溫度的關(guān)系特性(與生產(chǎn)商索。┻M(jìn)行計(jì)算(計(jì)算:與10電阻分壓后的電壓),制成一個(gè):“分壓采樣值”與“溫度”關(guān)系的表格,將此表格放在程序中,采樣、查表后就達(dá)成樓主的目的了。 |
本帖最后由 zl2168 于 2016-10-23 22:49 編輯 二極管測(cè)溫 智能型即熱式熱水器控制實(shí)例(已實(shí)用于產(chǎn)品) 水溫檢測(cè)和A/D轉(zhuǎn)換電路 ![]() 由R4、D1、R5、R7、RP1組成橋式水溫檢測(cè)電路,經(jīng)IC5、IC6變換放大,輸入ADC 0832 CH0通道進(jìn)行串行A/D轉(zhuǎn)換,RP1和RP2可分別調(diào)節(jié)零度和滿度兩點(diǎn)A/D值為00H和FFH。 以上摘自張志良編著《單片機(jī)原理與控制技術(shù)——雙解匯編和C51》第2版 ISBN7-111-08314-8 機(jī)械工業(yè)出版社 10.6 智能型即熱式熱水器控制實(shí)例 有問題,可email咨詢。zzlls@126.com |
比如用“標(biāo)稱值為10K的熱敏阻”,與一個(gè)溫漂小的“10K電阻”串聯(lián)。則當(dāng)溫度變化時(shí),其分壓值會(huì)隨溫度變化。采樣這個(gè)電壓,就能得到對(duì)應(yīng)這個(gè)電壓值的溫度。 |
尚尚123 發(fā)表于 2016-10-23 20:25 好像不行哎,要做一個(gè)測(cè)溫系統(tǒng) |
熱敏電阻一般都有一個(gè)溫度對(duì)應(yīng)的線段吧,如果有公式的話,可以選擇用公式的方法算出溫度,不然用一個(gè)碼表,把對(duì)應(yīng)溫度的AD輸出的值對(duì)應(yīng)出來就可以了吧。 |
Powered by 單片機(jī)教程網(wǎng)