前几天因一个工程需要做了一个温度采集,因还有好多库存的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度波动。
|