您的位置 首页 制造

STM32驱动MAX6675读取温度

MAX6675是带冷端补偿的K型热电偶转换芯片,SO-8封装,精度12位,分辨率0.25℃,测量最高温度1023.75℃。也就是1024/(2的12次方)=0.25℃。…

MAX6675是带冷端补偿的K型热电偶转化芯片,SO-8封装,精度12位,分辨率0.25℃,丈量最高温度1023.75℃。也便是1024/(2的12次方)=0.25℃。

VCC-GND接3~5.5V电压;

T+,T-别离接K型热电偶正负极;

CS为片选,低电平有用;

SCK为串行时钟,需要由STM32供给;

SO为数据串行输出;

接线方法:

MAX6675的输出方法是单片机输入时钟脉冲,MAX6675在时钟的下跳沿在SO管脚上输出数据。在数据手册第5页有时序阐明,在6页有时序图,时序阐明和时序图有不同。自己在读取数据进程中,发现依照时需阐明操作,是正确的;而按时序图操作读取的数据有过错。MAX6675每次输出一共是16位数据,第一位也便是D15,是虚拟位;D14-D3,是12位的温度MSB-LSB,也便是高位在前位置在后;D2是一个标志,正常为0,一旦热电偶开路,则为1;D1是ID,一般为0,不明白啥意思,横竖我不管怎样读都为0;D0是三态输出。

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位数据只需要15个时钟;

而时序图说的是CS=0之后,需要在第一个时钟下降沿读取第一位数据,也便是16位数据16个时钟;
据我的试验,第一个数据不需要时钟,假如输出时钟,则一切数据左移一位。我的试验进程是这样的:
首要我依照时序图给出脉冲,成果输出的16位数据规模是1314,1330,1346,1362,1378,1394,1410,一切数据的最低四位都是0010;而我将热电偶开路,返回值为65530,最低四位1010,依据手册,热电偶开路D2应为1。而对1314,1330,1346,1362,1378,1394,1410这一系列数据进行处理之后读取出来的温度为40℃左右,室温大约为20℃左右,所以我猜测可能是采样数据比实践数据左移了一位。这时我想起来D0是三态输出,我之前装备STM32接SO的管脚为上拉输入,所以输入的D0应为1,假如我将STM32与SO衔接的管脚设为下拉输入,D0应该为0。不出我所料,公然,收集回来的数据变成1312,1296,1328,1280,正好是尾数变成了0000,也就验证了我的主意,全体数据比实践数据左移了一位,这样,我就修正程序,依照时序阐明来写入,这次一切数据都满足要求,D2在正常时=0,热电偶开路时=1,STM32管脚设为上拉输入时D0=1,下拉输入是D0=0;而且读取回来的温度大约是20℃左右。下面是我写的读取16位数据的程序:
…………………..宏界说部分
#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)
……………………………..读取数据函数
u16 Read_TC(void)
{
/**************界说变量****************/
u16 Dat_Out=0;
u8 Cyc=0;
/****************程序******************/
Cs_L;
for(Cyc=0;Cyc<16;Cyc++)
{
/*第1位在CS被拉低之后发生,不需要时钟,
故在第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;
}

读取的数据处理:

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,” “);//假如热电偶康复闭合,程序持续运转
}
else
{
Temp=((TC_Num&0x7fff)>>3)*25;//提取D14-D3,12位数据
}
return Temp;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/252355.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部