stm32驱动max6675温度采集程序

stm32驱动max6675温度采集程序,第1张

  意法半导体 (STMicroelectronics) 集团于1987年6月成立,是由意大利的SGS 微电子公司和法国Thomson 半导体公司合并而成。1998年5月,SGS-THOMSON Microelectronics 将公司名称改为意法半导体有限公司,意法半导体是世界最大的半导体公司之一。从成立之初至今,ST 的增长速度超过了半导体工业的整体增长速度。自1999年起,ST 始终是世界十大半导体公司之一。据最新的工业统计数据,意法半导体 (STMicroelectronics) 是全球第五大半导体厂商,在很多市场居世界领先水平。例如,意法半导体是世界第一大专用模拟芯片和电源转换芯片制造商,世界第一大工业半导体和机顶盒芯片供应商,而且在分立器件、手机相机模块和车用集成电路领域居世界前列。

  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核(ST‘s product portfolio contains a comprehensive range of microcontrollers, from robust, low-cost 8-bit MCUs up to 32-bit ARM-based Cortex®-M0 and M0+, Cortex®-M3, Cortex®-M4 Flash microcontrollers with a great choice of peripherals. ST has also extended this range to include an ultra-low-power MCU platform) 。按内核架构分为不同产品:

  其中STM32F系列有:

  STM32F103“增强型”系列

  STM32F101“基本型”系列

  STM32F105、STM32F107“互联型”系列

  增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,相当于0.5mA/MHz。

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

  stm32驱动max6675温度采集程序,stm32驱动max6675温度采集程序,第2张

  VCC-GND接3~5.5V电压; T+,T-分别接K型热电偶正负极; CS为片选,低电平有效;

  SCK为串行时钟,需要由STM32提供; SO为数据串行输出; 接线方式:

  stm32驱动max6675温度采集程序,stm32驱动max6675温度采集程序,第3张

  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个时钟;

  stm32驱动max6675温度采集程序,stm32驱动max6675温度采集程序,第4张

  而时序图说的是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_H GPIOA-》BSRR=GPIO_Pin_5

  #define Clk_L GPIOA-》BRR=GPIO_Pin_6

  #define Clk_H GPIOA-》BSRR=GPIO_Pin_6

  #define So_H GPIO_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; }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2596832.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-09
下一篇 2022-08-09

发表评论

登录后才能评论

评论列表(0条)

保存