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