STM32
直播中

孙奕

7年用户 855经验值
私信 关注
[问答]

如何去实现基于MLX90640+STM32F103的红外测温硬件设计呢

如何去实现基于MLX90640+STM32F103的红外测温硬件设计呢?有哪些操作步骤?

回帖(1)

沈铿僖

2021-11-5 15:28:48
  1、背景
  上周完成了基本测试以后,发现了一个问题,串口虽然好用,但是现在的计算机支持力度不够好,另外,速度也慢,楼主想尽量把它做完善一点,用USB2.0, 115200以上的中速实现MLX90640红外数据传输,来重新实现这个32*24的红外测温硬件,经过一天努力,终于做好了,整体效果如下。
  2、USB 驱动
  对于这个东西,USB的驱动还是比较容易的,首先打开STM32CUBEMX, 选择USB设备,MIDDLEWARE中选择USB,选CDC,其他我都默认的,然后就是安装驱动包,测试,正常通过~
  
  3、USB 驱动程序
  接下来详细讲下怎么实现下位机的,为了实现USB版本的程序,我主要做了两件事,
  其一,去官方下载了MLX90640的开发包文件mlx90640-library-master.zip,解压后,发现其实这个是提供了两个版本的,要筛检,MLX90640_I2C_Driver.h对应的两个C文件,一个是硬件IIC,一个是模拟IIC,大家都知道,STM32F103是模拟的IIC, 所以,我选择了MLX90640_SWI2C_Driver.cpp, 改为MLX90640_SWI2C_Driver.c,然后建立了工程如下图:
  
  最难的一步到了,就是改配置:找到MLX90640_i2c_driver.h,修改IIC的那些宏变量段落,否则程序就找不到北了,甚至连个IICStart()都启动不起来,由于我的是F103的,GBIOB的变量里没有那么多高级货,我就直接按照标准库的例子开始一个函数一个函数对应修改了,基本如下:
  #define SCL_PIN GPIO_PIN_6
  #define SCL_GPIO_PORT GPIOB
  #define SDA_PIN GPIO_PIN_7
  #define SDA_GPIO_PORT GPIOB
  #define SCL_HIGH HAL_GPIO_WritePin(SCL_GPIO_PORT , SCL_PIN, GPIO_PIN_SET)
  #define SCL_LOW HAL_GPIO_WritePin(SCL_GPIO_PORT , SCL_PIN, GPIO_PIN_RESET)
  #define SDA_HIGH HAL_GPIO_WritePin(SDA_GPIO_PORT , SDA_PIN, GPIO_PIN_SET)
  #define SDA_LOW HAL_GPIO_WritePin(SDA_GPIO_PORT , SDA_PIN, GPIO_PIN_RESET)
  #define SCL_read HAL_GPIO_ReadPin(SCL_GPIO_PORT , SCL_PIN)
  #define SDA_read HAL_GPIO_ReadPin(SDA_GPIO_PORT , SDA_PIN)
  有了这段定义,STM32F103驱动mlx90640的关键就搞定了,你如果示波器跟踪的话,就可以看见SCL&SDA的交互脉冲了。
  当然,接下来收尾:
  代码跟前面的类似:
  。..。..。..。..。..。..。..。
  while (1)
  {
  MLX90640_GetFrameData(MLX_I2C_ADDR, frame);
  Ta = MLX90640_GetTa(frame, &mlx90640);
  tr = Ta - TA_SHIFT;
  MLX90640_CalculateTo(frame, &mlx90640, emissivity, tr, mlx90640To);
  //LSB first, MSB behind
  CheckCode=0x5A5A;
  CheckCode+=0x0602;
  for(i=0;i《768;i++)
  {
  UsartBuff[i*2+4]= (uint16_t)(mlx90640To[i]*100)&0xFF;
  UsartBuff[i*2+5]= ((uint16_t)(mlx90640To[i]*100)》》8)&0xFF;
  CheckCode+=(uint16_t)(mlx90640To[i]*100);
  }
  UsartBuff[1540]= (uint16_t)(Ta*100)&0xFF;
  UsartBuff[1541]= ((uint16_t)(Ta*100)》》8)&0xFF;
  CheckCode+=(uint16_t)(Ta*100);
  UsartBuff[1542]= (uint16_t)CheckCode&0xFF;
  UsartBuff[1543]= ((uint16_t)CheckCode》》8)&0xFF;
  CDC_Transmit_FS(UsartBuff, 1544);
  LEDFlash(1);
  }
  。..。..。..。..。..。..。..。
  通过USB CDC通信,也就是CDC_Transmit_FS(UsartBuff, 1544),你可以发现,像MLX90640类似的数据量传输起来太容易了,速度快串口好多,另外就是便携多了,像我第一张图那样,感觉整个小装置很清爽,下一步,我看看能否再在上面驱动个普通的摄像头和FLASH,充分利用STM32的硬件。
1 举报

更多回帖

发帖
×
20
完善资料,
赚取积分