|
前幾天因一個(gè)工程需要做了一個(gè)溫度采集,因還有好多庫(kù)存的MAX6675,所以用它,因原來(lái)用51單片機(jī)做的,現(xiàn)開始學(xué)32,所以用32做的,偷懶從網(wǎng)上找了個(gè)程序,如下所示:
//////////////////////////////
//u16 max6675_readRawValue(void)
//{
// u16 tmp=0;
// u16 i;
// MAX6675_CS_L;//cs低
// /*按位讀取電平*/
// for(i=0;i<16;i++)
// {
// /*創(chuàng)建一個(gè)沿,按沿讀取PB7的端口電平*/
// MAX6675_CK_H;
// delay_us(10);
// if(MAX6675_SO)tmp|=0x0001;
// //printf("tmp%d---:%d\n",i,tmp);/*這是為了檢查錯(cuò)誤時(shí)按位打印每個(gè)數(shù)*/
// tmp<<=1;//按位左移
// MAX6675_CK_L;
// delay_us(10);
// }
// MAX6675_CS_H;//cs高
// if (tmp&0x0004)
// {
// M2 = 1; //未檢測(cè)到熱電偶
// // printf("未檢測(cè)到熱電偶\n");//測(cè)試用
// }
// else
// {
// M2=0;
// tmp<<=1;//去掉D15位
// tmp>>=4;//去掉D0、1、2位
// }
// return tmp;
//}
//
//u16 max6675_readTemperature(void)
//{
// u16 d,a;
// float i,S;
// S=2.142857;//實(shí)驗(yàn)數(shù),用溫水和熱水 環(huán)境測(cè)得的一個(gè)實(shí)際差量
//// delay_ms(200);
// d=max6675_readRawValue();
// i=d*1023.75/4095/S;
// a=i;
// return a;
//}
這個(gè)程序總體來(lái)講,沒(méi)有多大的問(wèn)題,用起來(lái)也可以用,但實(shí)際上是有問(wèn)題的。
1,正常程序中不需要除所謂的系數(shù):如上所示產(chǎn)的S=2.142857,
2,斷線檢測(cè)不正常,可能好多朋友在做這個(gè)的時(shí)候,基本上沒(méi)有用到過(guò)斷線檢測(cè)。
經(jīng)過(guò)仔細(xì)分析,采用試的方法,發(fā)現(xiàn)了一個(gè)問(wèn)題,就是時(shí)序圖里的數(shù)據(jù)傳輸問(wèn)題,第一個(gè)數(shù)據(jù)實(shí)際上不需要CK-H,
就可以直接讀出來(lái),如果加上一個(gè)CK-H的話,就導(dǎo)致了整個(gè)數(shù)據(jù)往左多移了1個(gè)位,所以上面的程序中取采用tmp>>=4;//去掉D0、1、2位
D0-2總共3個(gè)位,卻要移4個(gè)位的原因, 同時(shí)還有,// tmp<<=1;//去掉D15位 這句話實(shí)際上把D14的值去掉了,實(shí)際值只有11位數(shù)據(jù)了,因?yàn)?br />
一般人用于低溫,根本不會(huì)發(fā)現(xiàn), 我在試開路檢測(cè)時(shí),輸出的數(shù)據(jù)不是最大值,而是個(gè)中間值就可以說(shuō)明這個(gè)問(wèn)題。
最重要的問(wèn)題是,D2值一直沒(méi)有變化,我做開路沒(méi)有反應(yīng),原來(lái)是D2的位置變到了D3的位置,接下來(lái)就可以修改了。
1, if (tmp&0x0004) 變?yōu)?if (tmp&0x0008)
2,// tmp<<=1;//去掉D15位 這句取消
3,S=2.142857;//實(shí)驗(yàn)數(shù),用溫水和熱水 環(huán)境測(cè)得的一個(gè)實(shí)際差量 這句也取消。
4,i=d*1023.75/4095/S; 改為i=d*1023.75/4095;
經(jīng)過(guò)測(cè)試,實(shí)際的溫度值與標(biāo)準(zhǔn)溫度計(jì)相差0.5度,斷線檢測(cè)有反應(yīng),達(dá)到設(shè)計(jì)要求。
增加PID,實(shí)際控溫可達(dá)到正負(fù)0.3度波動(dòng)。
|
評(píng)分
-
查看全部評(píng)分
|