<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁 > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 基于MSP430內(nèi)嵌溫度傳感器的溫度告警系統(tǒng)

          基于MSP430內(nèi)嵌溫度傳感器的溫度告警系統(tǒng)

          作者: 時(shí)間:2009-11-30 來源:網(wǎng)絡(luò) 收藏
          A/D轉(zhuǎn)換引入的誤差
          由芯片資料可見,對(duì)于12位A/D,因漏電流引入的誤差1LSB,這個(gè)誤差可以忽略不記。但是由于布線技術(shù)和電源和地線等的不良而導(dǎo)致的電源線、地線上的紋波和噪聲脈沖對(duì)轉(zhuǎn)換結(jié)果的影響卻不能不考慮。如圖1所示,如果數(shù)字地DVss和模擬地AVss是分開供電的,則可以在這兩點(diǎn)之間接入反相并接的二極管對(duì),以消除700mV的電壓差。另外如果參考電壓(VR+ - VR-)較小,那么紋波的影響會(huì)變得更明顯,從而影響轉(zhuǎn)換精度。因此,電源的清潔無噪聲對(duì)A/D轉(zhuǎn)換的精度有很大的影響。當(dāng)然在可能的情況下還是要盡量采用較大的(VR+ - VR- )。還有就是盡量不要采用內(nèi)部參考,內(nèi)部參考不太穩(wěn)定,會(huì)影響轉(zhuǎn)換的精度。仔細(xì)安排各自接地點(diǎn)的旁路電容對(duì)于減小噪聲的影響也是很有用的。圖1給出了一種典型的退耦電容配置方式,在芯片的電源以及外接參考電壓(圖中沒有畫出)的引腳上并接一個(gè)10uF的鉭電容和一個(gè)0.1uF的瓷片電容能夠較好的起到抑制噪聲的作用。

          本文引用地址:http://www.ex-cimer.com/article/163459.htm

          采用內(nèi)嵌測(cè)量,要受到很多方面的影響。除了上面討論的方法,還有減小誤差的一般方法,比如多次測(cè)量取平均等。所以要綜合考慮各方面的因素,才能取得滿意的效果。

          4. 軟件描述
          另一個(gè)突出優(yōu)點(diǎn)就是用C語言編寫程序簡(jiǎn)捷而且編譯效率很高。下面就以F449為例來簡(jiǎn)要描述這個(gè)的軟件實(shí)現(xiàn)。圖3為程序流程。

          #include msp430x44x.h // 包含頭文件
          #include math.h> //包含數(shù)學(xué)運(yùn)算頭文件
          #define Trt 25 //預(yù)先測(cè)量到的室溫
          #define Th 50 //高溫告警
          #define Tl 0 //低溫告警溫度
          int i=0, k=0,Vrt; //定義全局變量
          int ADC_Result[16];
          float T; //測(cè)量到的溫度
          void init(void); //初始化函數(shù)
          void ADC12(void); //A/D轉(zhuǎn)換函數(shù)
          void Alarm(float t); //告警處理函數(shù)
          void init(void)
          {
          TACTL=TASSEL1+TACLR+MC_1; //定時(shí)器初始化,工作在up模式
          CCTL0|=CCIE; //使能CCR0中斷
          CCR0=0x0FF; //設(shè)定定時(shí)值
          _EINT(); //打開中斷
          P2DIR|=BIT0+BIT1; //P2.0和P2.1為告警輸出;
          }
          void ADC12(void)
          {
          ADC12CTL0 =~ ENC; //在進(jìn)行設(shè)置時(shí)首先復(fù)位ADC的轉(zhuǎn)換使能
          ADC12CTL0 = ADC12ON+REF2_5V+SHT0_8; //采用內(nèi)部2.5V參考,打開通道10REFON自動(dòng)打開
          ADC12CTL1 = SHP+ADC12SSEL_2; //上升沿采樣,主時(shí)鐘,MEM0
          ADC12MCTL0 = EOS + INCH_10+SREF_1; //選擇通道10,Vref+為參考電壓,進(jìn)行溫度測(cè)量
          ADC12CTL0 |= ENC;
          ADC12CTL0 |= ADC12SC; // 開始轉(zhuǎn)換
          if ((ADC12IFG BIT0)==1) //如果轉(zhuǎn)換完畢,讀走數(shù)據(jù)
          ADC_Result[i]=ADC12MEM0;
          }
          void Alarm(float t)
          {
          if(t>=Th)
          P2OUT|=BIT1; //高溫告警
          else if(t=Tl)
          P2OUT|=BIT0; //低溫告警
          else
          P2OUT=~(BIT0+BIT1); //無告警
          }
          interrupt[TIMERA0_VECTOR] void Timer_A (void) //中斷處理子程序//
          {
          int ADC_Sum=0;
          float Vst;
          for (i=0;i++;i16) //連續(xù)進(jìn)行16次轉(zhuǎn)換,提高精度
          {
          ADC12();
          ADC_Sum +=ADC_Result[i]; //求和
          i++;
          }
          ADC_Sum>>=4; //將ADC_Sum右移4位,相當(dāng)于除以16.得到平均的結(jié)果;
          Vst=( ADC_Sum /4095.0)*2500; //完成轉(zhuǎn)換,得到電壓值
          k++;
          #ifndef Trt
          T=(Vst-986)/3.35; //測(cè)出用0度作基準(zhǔn)的溫度
          #else
          if (k==1) Vrt=Vst; //如果定義Trt,則將第一次的轉(zhuǎn)換結(jié)果作為室溫下的Vrt
          T=(Vst-Vrt)/3.35+Trt; //測(cè)出用室溫作基準(zhǔn)時(shí)的溫度
          #endif
          Alarm(T); //告警處理
          }
          void main (void)
          {
          init(); //初始化
          LPM1; //進(jìn)入低功耗模式1;
          }

          5. 結(jié)束語
          本文只是對(duì)告警部分進(jìn)行了描述,若是再加上液晶就可以實(shí)時(shí)顯示溫度,加上鍵盤就可以對(duì)室溫、告警溫度進(jìn)行預(yù)設(shè),再對(duì)上述程序進(jìn)行一些改進(jìn)就是一個(gè)實(shí)用的了。因這兩部分相對(duì)比較簡(jiǎn)單和成熟,文中沒有進(jìn)行進(jìn)一步討論。


          上一頁 1 2 下一頁

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();