STM32驅(qū)動(dòng)MAX6675讀取溫度
VCC-GND接3~5.5V電壓;
T+,T-分別接K型熱電偶正負(fù)極;
CS為片選,低電平有效;
SCK為串行時(shí)鐘,需要由STM32提供;
SO為數(shù)據(jù)串行輸出;
接線方式:
MAX6675的輸出方式是單片機(jī)輸入時(shí)鐘脈沖,MAX6675在時(shí)鐘的下跳沿在SO管腳上輸出數(shù)據(jù)。在數(shù)據(jù)手冊(cè)第5頁有時(shí)序說明,在6頁有時(shí)序圖,時(shí)序說明和時(shí)序圖有差別。本人在讀取數(shù)據(jù)過程中,發(fā)現(xiàn)按照時(shí)需說明操作,是正確的;而按時(shí)序圖操作讀取的數(shù)據(jù)有錯(cuò)誤。MAX6675每次輸出一共是16位數(shù)據(jù),第一位也就是D15,是虛擬位;D14-D3,是12位的溫度MSB-LSB,也就是高位在前地位在后;D2是一個(gè)標(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.
以上是時(shí)序說明,說的是在CS=0時(shí),第一位就輸出了,可以直接讀取,不需要時(shí)鐘,也就是讀取16位數(shù)據(jù)只需要15個(gè)時(shí)鐘;
#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)
/**************定義變量****************/
u16 Dat_Out=0;
u8 Cyc=0;
/****************程序******************/
Cs_L;
for(Cyc=0;Cyc<16;Cyc++)
{
/*第1位在CS被拉低之后產(chǎn)生,不需要時(shí)鐘,
故在第1位將時(shí)鐘屏蔽
*/
if(Cyc!=0)
{
Clk_H;
Clk_L;
}
{
Dat_Out++;
}
/*第15個(gè)時(shí)鐘之后不再移位*/
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");//液晶顯示錯(cuò)誤
while(Read_TC()&4)
{
Delay(1000);
}
LcdString(3,3," ");//如果熱電偶恢復(fù)閉合,程序繼續(xù)運(yùn)行
}
else
{
Temp=((TC_Num&0x7fff)>>3)*25;//提取D14-D3,12位數(shù)據(jù)
}
return Temp;
}
評(píng)論