設計Pt100鉑電阻測量溫度的電路,溫度測量范圍是0-100攝氏度,要求LCD顯示。畫出電路圖,標注元器件參數,簡單說明測量原理和調節方式。根據要求,本設計的測溫模擬電路使用熱電阻Pt100溫度傳感器利用其感溫效應,熱電阻隨環境溫度的變化而變化,在電路圖中將電阻值的變化轉換成電壓的變化,再將電壓值作為輸入信號輸入至AD轉換器中進行模擬信號到數字信號的轉換,其輸出端接單片機,向單片機內依據公式寫入源程序,將被測溫度在顯示器上顯示出來: 測量溫度范圍0℃~100℃; 分辨率為0.1℃; LCD數碼直讀顯示。 本設計系統包括了溫度測量單元,信號處理單元,A/D 轉換模塊,數據處理與控制模塊,溫度顯示五個部分。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
結構圖.png (890.73 KB, 下載次數: 108)
下載附件
2020-6-23 14:58 上傳
100度仿真結果示意圖.png (192.78 KB, 下載次數: 116)
下載附件
仿真電路圖
2020-6-23 14:58 上傳
仿真電路圖.png (103.01 KB, 下載次數: 123)
下載附件
100攝氏度仿真結果圖
2020-6-23 14:58 上傳
單片機源程序如下:
- #include <mega8.h>
- //#include <delay.h>
- #include <stdlib.h>
- #include <string.h>
- // Alphanumeric LCD Module functions
- #asm
- .equ __lcd_port=0x18 ;PORTB
- #endasm
- #include <lcd.h>
- #include <delay.h>
- #define ADC_VREF_TYPE 0xC0
- #define MCPCS PORTD.0
- #define MCPSCK PORTD.1
- #define MCPDATA PIND.2
- #define A 3.9083e-3
- #define B -5.775e-7
- #define C -4.183e-12
- unsigned long read_spi(void);
- float CalTem(float PT100R)
- {
- double fT,fR,fT0;
- char i=0;
- fR=PT100R;
- fT0=(fR/100-1)/A;
- return fT0;
- };
- unsigned long read_mcp(void)
- {
- long a[]={0,0,0,0,0};
- long x=0;
- char i=0;
- char k=5; // 數組大小 -1
- for (i=0;i<5;i++)
- {
- a[i]=read_spi(); // 連續3次讀出數據
- delay_us(5);
- }
- //中值濾波
- while (k>0)
- {
- for (i=0;(i<(k-1));i++) // 從低到高排序
- {
- if (a[i]>a[i+1])
- {
- x=a[i+1];
- a[i+1]=a[i];
- a[i]=x;
- };
- };
- k--;
- };
- return a[2]; // 舍棄最大數據和最小數據。
- }
- unsigned long read_spi(void)
- {
- volatile char i=0;
- volatile long int result=0,x=0;
- MCPCS=0;// CS 先一個100us 低電平脈沖
- delay_us(100);
- MCPCS=1;
- delay_ms(80); // 高電平等待80ms 等待轉換完成
- MCPCS=0; // 置 CS 低電平 開始發生 sck 脈沖
- for (i=0; i<24;i++) // 24 位數據
- {
- MCPSCK=0; // sck 脈沖下降沿
- delay_us(1); // 等5us 等待穩定
- //result=result<<1;
- x=MCPDATA; // 讀出一位
- while (MCPDATA!=x) // 抖動處理 2次讀出電平相同說明數據穩定
- {
- delay_us(1);
- x=MCPDATA;
- };
- result<<=1;
- result|=x;//(x<<(23-i));
- delay_us(5);
- MCPSCK=1; // 發送sck 上升沿
- delay_us(10);
- };
- MCPCS=1; // cs=1
- return result>>6;
- }
- // Read the AD conversion result
- unsigned int read_adc(unsigned char adc_input)
- {
- ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
- // Delay needed for the stabilization of the ADC input voltage
- delay_us(10);
- // Start the AD conversion
- ADCSRA|=0x40;
- // Wait for the AD conversion to complete
- while ((ADCSRA & 0x10)==0);
- ADCSRA|=0x10;
- return ADCW;
- }
- // 校準溫度計查表 沒20度一個校準,
- // -50 -30 -10 10 30 50 70 90 110 130 150
- const float CAL_Tem[]={4.7 ,4.65,4.65,4.6,4.6 ,4.55,4.55,4.50,4.45,4.45,4.45};
- const int ADCSTEP[]={ 1 ,96 ,189 ,282, 374,466 ,557 ,648,738,827 ,916};
- float CalcuTem(int ADC) // 溫度校準計算 沒有使用
- {
- int i=0;
- float r;
- for (i=0; i<10;i++)
- {
- if ((ADC<ADCSTEP[i+1])&&(ADC>=ADCSTEP[i])) break;
- };
- r=(ADC-ADCSTEP[i]);
- r=r/CAL_Tem[i];
- r=r-50;///CAL_Tem[i]-50+i*20+;
- r=r+i*20.0;
- return r;
- }
- volatile char stradc[15]="\0";
- void main(void)
- {
- // Declare your local variables here
- volatile long int MCPADC=0;
- volatile unsigned int adc=0;
- volatile float fadc=0;
- // Input/Output Ports initialization
- // Port B initialization
- // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
- // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
- PORTB=0x00;
- DDRB=0x00;
- // Port C initialization
- // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
- // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
- PORTC=0x00;
- DDRC=0x00;
- // Port D initialization
- // Func7=out Func6=out Func5=out Func4=out Func3=out Func2=int Func1=out Func0=out
- // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=1
- PORTD=0x07;
- DDRD=0xFB;
- // Timer/Counter 0 initialization
- // Clock source: System Clock
- // Clock value: Timer 0 Stopped
- TCCR0=0x00;
- TCNT0=0x00;
- // Timer/Counter 1 initialization
- // Clock source: System Clock
- // Clock value: Timer 1 Stopped
- // Mode: Normal top=FFFFh
- // OC1A output: Discon.
- // OC1B output: Discon.
- // Noise Canceler: Off
- // Input Capture on Falling Edge
- // Timer 1 Overflow Interrupt: Off
- // Input Capture Interrupt: Off
- // Compare A Match Interrupt: Off
- // Compare B Match Interrupt: Off
- TCCR1A=0x00;
- TCCR1B=0x00;
- TCNT1H=0x00;
- TCNT1L=0x00;
- ICR1H=0x00;
- ICR1L=0x00;
- OCR1AH=0x00;
- OCR1AL=0x00;
- OCR1BH=0x00;
- OCR1BL=0x00;
- // Timer/Counter 2 initialization
- // Clock source: System Clock
- // Clock value: Timer 2 Stopped
- // Mode: Normal top=FFh
- // OC2 output: Disconnected
- ASSR=0x00;
- TCCR2=0x00;
- TCNT2=0x00;
- OCR2=0x00;
- // External Interrupt(s) initialization
- // INT0: Off
- // INT1: Off
- MCUCR=0x00;
- // Timer(s)/Counter(s) Interrupt(s) initialization
- TIMSK=0x00;
- // Analog Comparator initialization
- // Analog Comparator: Off
- // Analog Comparator Input Capture by Timer/Counter 1: Off
- ACSR=0x80;
- SFIOR=0x00;
- // ADC initialization
- // ADC Clock frequency: 125.000 kHz
- // ADC Voltage Reference: Int., cap. on AREF
- ADMUX=ADC_VREF_TYPE & 0xff;
- ADCSRA=0x86;
- // LCD module initialization
- lcd_init(16);
- while (1)
- {
-
-
- MCPADC=0;
- MCPADC=read_mcp();
- // memset(stradc,' ',15);
- // lcd_gotoxy(0,0);
- // lcd_puts(stradc);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png (11.05 KB, 下載次數: 105)
下載附件
2020-6-23 20:04 上傳
所有資料51hei提供下載:
Pt100仿真程序.zip
(89.83 KB, 下載次數: 35)
2020-6-23 14:59 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|