![]() |
pt100接一個tl431恒流源再接2個運放加調(diào)零出來就是電壓的變化再接個tl1543AD轉(zhuǎn)換接到單片機里計算電阻值在計算溫度temp_r=((float)temp)*5000/(1024*20)+100; //計算電阻值。[img]C:\Users\asus\Desktop\E13DA9FA454BBB6930F3639E5E9D33EE.pngC:\Users\asus\Desktop\4700A418B4F82E4F6F6DE1ED1AB49134.png[/img] |
這個電路不妨用麵包板,試做看看(或是用仿真軟體模擬看看)...例如測試範圍從 0到 100度 輸出Vo從0到4.92 這個電路就可以用 |
pingguotu 發(fā)表于 2016-10-29 15:26 熱敏電阻3950的測溫單片機里程序 code uint VOL[]和code uint Temper[]中的數(shù)據(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; //片選信號 CE=0; //初始化,關閉數(shù)據(jù)采集 CS=0; A0=0; RC=0; CE=1;//CE=1,CS=0,RC=0,A0=0啟動12位溫度轉(zhuǎn)換 _nop_(); while(STS==1); //等待數(shù)據(jù)采集結束 CE=0; //芯片使能關閉 RC=1; A0=0; CE=1;//CE=1,CS=0,RC=1,12/8=1,A0=0 允許高八位數(shù)據(jù)并行輸出 _nop_(); temp1=P0; //讀取轉(zhuǎn)換結果的高八位 CE=0; //芯片使能關閉 RC=1; A0=1; CE=1;//CE=1,CS=0,RC=1,12/8=0,A0=1 允許低四位數(shù)據(jù) 并行輸出 _nop_(); temp2=P0; //讀取轉(zhuǎn)換結果的第四位 temp=((temp1<<4)|(temp2&0X0F)); //高位和低位合成實際溫度,temp2為PO口的高四位 return (temp); //還回轉(zhuǎn)換結果,右移四位是因為temp2為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點陣,8位數(shù)據(jù)接口 w_cmd(0x0C); // 顯示器開、光標開、光標允許閃爍 w_cmd(0x06); // 文字不動,光標自動右移 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ù)組織查邊獲取溫度值,首先熱敏電阻便宜,電阻簡單,查表方便,相應的江都不高一般是0.1攝氏度吧! |
yzwzfyz 發(fā)表于 2016-10-26 00:06 我昨天認真的看了你給我的那個圖,看分析不是很明白,我又不敢問你了,你說你說的已經(jīng)夠多了,哎,人傻了,不過還是很謝謝你給我的指點啦^_^ |
劉海龍 發(fā)表于 2016-10-26 22:47 剛剛老師又回復我了說A/D轉(zhuǎn)換電路不一定用0809,看自己的需求 |
劉海龍 發(fā)表于 2016-10-26 22:47 (⊙o⊙)哦,是這樣啊,不過我剛剛問了老師,他老古董,只準用89C51單片機,可能A/D 0809轉(zhuǎn)換電路還要重新單獨做,我們最后得仿真然后焊接出來,所以現(xiàn)在正在確定電路,因為老是被打下來,說太簡單,不準用模塊,心塞 |
七顆星星 發(fā)表于 2016-10-26 21:58 stc單片機就是51單片機,只不過是增強型51單片機(把ADC轉(zhuǎn)換器PWM模塊等集成到了單片機內(nèi)部) 我寫的NTC10k測溫系統(tǒng)的程序其實就是利用單片機內(nèi)部的ADC轉(zhuǎn)換器將模擬信號轉(zhuǎn)化為數(shù)字信號顯示出來的,完全符合你們老師的要求。 |
劉海龍 發(fā)表于 2016-10-25 21:35 我看了大神的,那個單片機可不可以用51單片機呀?還有我覺得老師的意思好像是還要我利用A/D轉(zhuǎn)換器然后將模擬信號變成數(shù)字信號,然后顯示出來 |
劉海龍 發(fā)表于 2016-10-25 21:35 哇噻噻~真的是大神吶~崇拜,星星眼(☆_☆) |
謝謝分享 |
“二極管測溫范圍有限,0~60“? 理論上,二極管特性與溫度有關,并不受溫度限制,只要二極管不壞(超高溫引起的物理損壞)。 所以低于0.高于60都能用于測溫! |
順便提一下,二極管測溫范圍有限,0~60。太高了,不好。 |
實例67 LCD1602顯示屏顯示 先Proteus仿真一下,確認有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1 書中電路和程序設計有詳細說明,程序語句條條有注解。 |
本帖最后由 zl2168 于 2016-10-25 09:53 編輯 實例84 ADC0832串行A-D(虛擬CLK) 先Proteus仿真一下,確認有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1 書中電路和程序設計有詳細說明,程序語句條條有注解。 |
本帖最后由 zl2168 于 2016-10-25 09:54 編輯 給你提供幾個參考案例 實例83 ADC0832串行A-D(TXD輸出CLK) 先Proteus仿真一下,確認有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1 書中電路和程序設計有詳細說明,程序語句條條有注解。 |
本帖最后由 zl2168 于 2016-10-25 09:41 編輯 樓主選擇測溫元件可以選二極管,也可選擇熱敏電阻抑或其他測溫元件。但橋式取樣電路是經(jīng)典的,其連接方式應根據(jù)測溫元件屬正溫度系數(shù)還是負溫度系數(shù)。正溫度系數(shù)測溫元件可按我上傳的電路形式連接,若是負溫度系數(shù)測溫元件,與運放連接應交換輸入端,否則輸出電壓為負極性。 |
本帖最后由 zl2168 于 2016-10-25 09:31 編輯 測溫元件的非線性幾乎是不可避免的,無論是二極管、熱敏電阻抑或其他元件,修正的簡單方法就是查表,預先測得真實溫度與非線性測溫元件的一一對應數(shù)表,然后在程序中查表修正。 我上文所提及的非線性是指放大電路的非線性,例如,對溫度信號Ut與基準電壓之間差值的非線性:Uo1=91Ut-90Uref。還有對接近電源電壓+5V時的運放飽和區(qū)非線性,接近0電壓時的運放截止區(qū)非線性,等等。 |
逝者如斯夫。 |
不要以為不線性,就對測溫有影響了。其實沒有電阻與成線性關系的。不線性也無關系,計算機就是干這個活的! 定定心心來做,哪一種方式都可以實現(xiàn)。 做復雜了,可以多積累一點經(jīng)驗。做簡單了,完成的勝算多一點。不必糾結。開工吧。 做這個題目,你跳不掉做一個查表的程序。除非老師不考你“對非線性的處理及不規(guī)則曲線的處理” |
熱敏電阻測溫可以實現(xiàn),根據(jù)電阻特性解方程t=(Rt-B)/K就可以得到溫度了 |
zl2168 發(fā)表于 2016-10-24 21:38 謝謝你了^_^我會好好看你的資料和分析的。讓你費心了,主要我又不太有設計理念,就想照搬一下,做出東西來 |
本帖最后由 zl2168 于 2016-10-25 09:34 編輯 給你的電路不看,自己找一個不太好的電路。 你自己找的電路可勉強用,但不太好,有問題。 第一級運放,差動放大,Uo1=91Ut-90Uref,其中Ut為溫度信號,Uref為基準電壓。這種91Ut-90Uref的差動比例放大,本身就是非線性的 第二級運放,反相放大,Uo1=2Ut-Uref 你用的運放為LM358,雙運放,但加的電源電壓是單極性的,那么0點及最高點5V處會產(chǎn)生非線性放大,你除了測溫元件非線性,放大電路也是非線性的。 優(yōu)點是取樣電路電源電壓比較穩(wěn)定,由431穩(wěn)壓。但意義不是很大,因電源電壓略有波動對Ut和Uref作用是相同的。具有共模性質(zhì),被運放抑制。 我給你介紹的電路與你的電路結構基本相同,但細節(jié)好得多。 ![]() 橋式取樣。由R4、D1分壓取得溫度信號Ut,不過測溫元件是二極管;由R5、R7、RP1分壓取得基準電壓Uref,這個Uref是可調(diào)的,RP1用于調(diào)節(jié)零度基準(對應于AD轉(zhuǎn)換器的最小值00H),而且為了防止電位器噪聲,加了一個濾波電容。 第一級運放,差動放大。由于4個10k,組成減法器,Uo1=Uref-Ut。 第二級運放,反相放大,Uo2=Au*Uo1,Au可調(diào),RP2用于調(diào)節(jié)滿度(AD最大值FFH) 為了是運放放大有較好的線性度,運放正電源電壓比AD轉(zhuǎn)換器的電源電壓略高,取6.2V;運放負電源電壓取-0.7V。就避免了你電路0V和5V處的非線性。 再有,你只需一路AD,用不著8路AD 0809,0809是并行AD,太龐大復雜,沒必要。用只有2路AD的串行AD,足夠了,體積小,成本低,編程相對方便。 好了,不說了,我已經(jīng)對你說得太多了。 |
1062298577 發(fā)表于 2016-10-24 07:52 是滴嘞,老師說數(shù)字傳感器里面已經(jīng)是一個模塊了,除了自己要做一個最小系統(tǒng)自己什么都不用干,哪能這么簡單,我也是要暈了~ |
PT100測溫范圍廣,耐高溫,是溫敏電阻是比較高級的傳感器,就是價格高。Pt是貴金屬。 |
我有上面提到的方式,是我們產(chǎn)品應用的實例,硬件上就是兩個電阻分壓(一個是熱敏),采樣分壓值。已是最簡單了。溫度表格的計算稍麻煩一點,不過用EXCEL計算也很方便。單片機程序就是采樣、查表、溫度的小數(shù)部分,做個插值就OK了。 |
PT100貴! 電路差別不大,因為都屬于電阻轉(zhuǎn)電壓。 對照表的生成,在PC機上完成,復制到單片機中即可。 |
用pt100吧,這個器件的線性很好 以下代碼是我擬合了PT100,cu50,BA1,BA2的曲線,你可以參考使用。
|
你老師意思肯定是不能用數(shù)字傳感器咯 |
yzwzfyz 發(fā)表于 2016-10-23 22:48 很感謝大神,我明白你的思路,不過讓我設計電路圖想想小女子就汗顏,藍瘦。不過嘛我在想是用PT100還是其他你這個熱敏電阻電路會簡單些 |
發(fā)一部分計算值給你參考,3950是熱敏電阻的型號 |
溫度℃ 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ù)(指兩個相鄰數(shù)據(jù)之間的數(shù)據(jù)),無法直接取得溫度值,可以用插值的方法估算得到。 |
采樣電壓變化的原因,是“10K的熱敏阻”阻值的變化,將“熱敏阻”阻值與溫度的關系特性(與生產(chǎn)商索取)進行計算(計算:與10電阻分壓后的電壓),制成一個:“分壓采樣值”與“溫度”關系的表格,將此表格放在程序中,采樣、查表后就達成樓主的目的了。 |
本帖最后由 zl2168 于 2016-10-23 22:49 編輯 二極管測溫 智能型即熱式熱水器控制實例(已實用于產(chǎn)品) 水溫檢測和A/D轉(zhuǎn)換電路 ![]() 由R4、D1、R5、R7、RP1組成橋式水溫檢測電路,經(jīng)IC5、IC6變換放大,輸入ADC 0832 CH0通道進行串行A/D轉(zhuǎn)換,RP1和RP2可分別調(diào)節(jié)零度和滿度兩點A/D值為00H和FFH。 以上摘自張志良編著《單片機原理與控制技術——雙解匯編和C51》第2版 ISBN7-111-08314-8 機械工業(yè)出版社 10.6 智能型即熱式熱水器控制實例 有問題,可email咨詢。zzlls@126.com |
比如用“標稱值為10K的熱敏阻”,與一個溫漂小的“10K電阻”串聯(lián)。則當溫度變化時,其分壓值會隨溫度變化。采樣這個電壓,就能得到對應這個電壓值的溫度。 |
尚尚123 發(fā)表于 2016-10-23 20:25 好像不行哎,要做一個測溫系統(tǒng) |
熱敏電阻一般都有一個溫度對應的線段吧,如果有公式的話,可以選擇用公式的方法算出溫度,不然用一個碼表,把對應溫度的AD輸出的值對應出來就可以了吧。 |
Powered by 單片機教程網(wǎng)