1 背景
疫情蔓延,在家无事,看着别人玩动态测温挺好玩,自己也试着玩一把,160*120的红外热电堆太贵,就拿MLX90640试试吧,终于,在一个星期忙碌后,完成了基于MLX90640和STM32的动态测温,包括上位机的调试,在这里给大家分享下。
2硬件调试
我采用的是STM32F103的核心版,买来很早了,便宜,把传感器插到I2C1上,PB6&PB7,vcc和GND 也分别接上去,就可以调试了,在此比较郁闷的是MLX90640的资料太少了,没办法只能看英文,勉勉强强搞定了,推介大家如果STM32 用的版本比较老,还是用固件好一些,STM32CUBEMX太坑了,我差点死在USB驱动上,后来才发现,还是串口好用。。。接下来就分享下代码吧:
int main(void)
{
int i;
static uint16_t eeMLX90640[832];
uint16_t frame[834];
float Ta,tr;
float emissivity=0.95;
static float mlx90640To[768];
u32 CheckCode;
paramsMLX90640 mlx90640;
char szMsg[64];
/test led/
LEDFlash(2);
/end test led/
//UART1_PutStr(USART1, “@Start to Run…\r\n”);
MLX90640_SetRefreshRate(MLX_I2C_ADDR, RefreshRate);
//UART1_PutStr(USART1, "@1..\r\n");
MLX90640_SetChessMode(MLX_I2C_ADDR);
//UART1_PutStr(USART1, "@2..\r\n");
MLX90640_DumpEE(MLX_I2C_ADDR, eeMLX90640);
//UART1_PutStr(USART1, "@3..\r\n");
MLX90640_ExtractParameters(eeMLX90640, &mlx90640);
//UART1_PutStr(USART1, "@4..\r\n");
for(i=0;i<3;i++)
{
MLX90640_GetFrameData(MLX_I2C_ADDR, frame);
delay_ms(500);
}
delay_ms(1000);
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]= (u16)(mlx90640To[i]*100)