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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32驅(qū)動MAX6675讀取溫度

          STM32驅(qū)動MAX6675讀取溫度

          作者: 時間:2016-12-03 來源:網(wǎng)絡(luò) 收藏
          MAX6675是帶冷端補償?shù)腒型熱電偶轉(zhuǎn)換芯片,SO-8封裝,精度12位,分辨率0.25℃,測量最高溫度1023.75℃。也就是1024/(2的12次方)=0.25℃。

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

          VCC-GND接3~5.5V電壓;

          T+,T-分別接K型熱電偶正負(fù)極;

          CS為片選,低電平有效;

          SCK為串行時鐘,需要由STM32提供;

          SO為數(shù)據(jù)串行輸出;

          接線方式:

          MAX6675的輸出方式是單片機輸入時鐘脈沖,MAX6675在時鐘的下跳沿在SO管腳上輸出數(shù)據(jù)。在數(shù)據(jù)手冊第5頁有時序說明,在6頁有時序圖,時序說明和時序圖有差別。本人在讀取數(shù)據(jù)過程中,發(fā)現(xiàn)按照時需說明操作,是正確的;而按時序圖操作讀取的數(shù)據(jù)有錯誤。MAX6675每次輸出一共是16位數(shù)據(jù),第一位也就是D15,是虛擬位;D14-D3,是12位的溫度MSB-LSB,也就是高位在前地位在后;D2是一個標(biāo)志,正常為0,一旦熱電偶開路,則為1;D1是ID,通常為0,不懂啥意思,反正我不管怎樣讀都為0;D0是三態(tài)輸出。

          Force CS low to output the first bit on the SO pin. Acomplete serial interface read requires 16 clock cycles.Read the 16 output bits on the falling edge of the clock.The first bit, D15, is a dummy sign bit and is alwayszero. Bits D14–D3 contain the converted temperature inthe order of MSB to LSB. Bit D2 is normally low andgoes high when the thermocouple input is open. D1 islow to provide a device ID for the MAX6675 and bit D0 is three-state.

          以上是時序說明,說的是在CS=0時,第一位就輸出了,可以直接讀取,不需要時鐘,也就是讀取16位數(shù)據(jù)只需要15個時鐘;

          而時序圖說的是CS=0之后,需要在第一個時鐘下降沿讀取第一位數(shù)據(jù),也就是16位數(shù)據(jù)16個時鐘;
          據(jù)我的實驗,第一個數(shù)據(jù)不需要時鐘,如果輸出時鐘,則所有數(shù)據(jù)左移一位。我的實驗過程是這樣的:
          首先我按照時序圖給出脈沖,結(jié)果輸出的16位數(shù)據(jù)范圍是1314,1330,1346,1362,1378,1394,1410,所有數(shù)據(jù)的最低四位都是0010;而我將熱電偶開路,返回值為65530,最低四位1010,根據(jù)手冊,熱電偶開路D2應(yīng)為1。而對1314,1330,1346,1362,1378,1394,1410這一系列數(shù)據(jù)進(jìn)行處理之后讀取出來的溫度為40℃左右,室溫大概為20℃左右,所以我猜想可能是采樣數(shù)據(jù)比實際數(shù)據(jù)左移了一位。這時我想起來D0是三態(tài)輸出,我之前配置STM32接SO的管腳為上拉輸入,所以輸入的D0應(yīng)為1,如果我將STM32與SO連接的管腳設(shè)為下拉輸入,D0應(yīng)該為0。不出我所料,果然,采集回來的數(shù)據(jù)變成1312,1296,1328,1280,正好是尾數(shù)變成了0000,也就驗證了我的想法,整體數(shù)據(jù)比實際數(shù)據(jù)左移了一位,這樣,我就修改程序,按照時序說明來寫入,這次所有數(shù)據(jù)都滿足要求,D2在正常時=0,熱電偶開路時=1,STM32管腳設(shè)為上拉輸入時D0=1,下拉輸入是D0=0;并且讀取回來的溫度大概是20℃左右。下面是我寫的讀取16位數(shù)據(jù)的程序:
          .......................宏定義部分
          #define Cs_L GPIOA->BRR=GPIO_Pin_5
          #define Cs_HGPIOA->BSRR=GPIO_Pin_5
          #define Clk_LGPIOA->BRR=GPIO_Pin_6
          #define Clk_HGPIOA->BSRR=GPIO_Pin_6
          #define So_HGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)
          ...................................讀取數(shù)據(jù)函數(shù)
          u16 Read_TC(void)
          {
          /**************定義變量****************/
          u16 Dat_Out=0;
          u8 Cyc=0;
          /****************程序******************/
          Cs_L;
          for(Cyc=0;Cyc<16;Cyc++)
          {
          /*第1位在CS被拉低之后產(chǎn)生,不需要時鐘,
          故在第1位將時鐘屏蔽
          */
          if(Cyc!=0)
          {
          Clk_H;
          Clk_L;
          }
          if(So_H)
          {
          Dat_Out++;
          }
          /*第15個時鐘之后不再移位*/
          if(Cyc!=15)
          {
          Dat_Out<<=1;
          }
          }
          Cs_H;
          return Dat_Out;
          }

          讀取的數(shù)據(jù)處理:

          u16 Tem_Handle(u16 TC_Num)
          {
          u16 Temp;
          if(TC_Num&4)
          {
          LcdString(3,3,"TC Open");//液晶顯示錯誤
          while(Read_TC()&4)
          {
          Delay(1000);
          }
          LcdString(3,3," ");//如果熱電偶恢復(fù)閉合,程序繼續(xù)運行
          }
          else
          {
          Temp=((TC_Num&0x7fff)>>3)*25;//提取D14-D3,12位數(shù)據(jù)
          }
          return Temp;
          }



          評論


          技術(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); })();