1.简介
热成像仪是利用黑体辐射定律,物体的温度越高,所发出的红外辐射能力越强, 经过芯片处理得到温度数据。应用建筑检测,电气维护,安全监控,工厂测试,如机器温升测试等场合,能够提供非接触式的温度测量,帮助监测热异常和预防故障。本次使用RA6T2开发板读取MLX90640红外测温传感器的温度,显示在LCD屏幕上,便于测试设备的温度。
2.实现
mlx90640有两种方式读取数据,即串口( TTL 电平)或者 I2C(芯片本身)通信方式。该产品测温点阵数量多,像素高。能在一般的环境分辨出人体型。串口的波特率有 9600bps 与 115200bps和 460800bps,有连续输出与询问输出两种方式,可适应不同的工作环境。模块保留了 MLX90640 芯片本身的 I2C 接口,把模块 PS 接 GND 或者 SET 点焊接上,模块本身 MCU 不工作,可以经过 I2C 直接操作 MLX90640。本次使用的是串口的方式,需要接RX,TX,以及电源即可。
出格式:
模块输出格式,每帧包含 1544 个字节(十六进制):
数据计算:
本次使用的是RA6T2的开发板,基于keil开发,使用的传感器为MLX90640,显示设备为2.8寸LCDTFT,通过串口的方式与MLX90640进行通讯。硬件连接:
PC10 USART3 TX 接MLX90640 RX
PC11 USART3 RX接MLX90640 TX
串口回调处理:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
static uint16_t i=0;
static uint16_t receiveLength=0;
if (huart->Instance == USART_UX)
{
#if USART_EN_RX
if((g_usart_rx_sta & 0x8000) == 0)
{
if(g_usart_rx_sta & 0x4000)
{
if(g_rx_buffer[0] != 0x0A)
{
g_usart_rx_sta = 0;
}
else
{
g_usart_rx_sta |= 0x8000;
}
}
else
{
if(g_rx_buffer[0] == 0x0D)
{
g_usart_rx_sta |= 0x4000;
}
else
{
g_usart_rx_buf[g_usart_rx_sta & 0x3FFF] = g_rx_buffer[0];
g_usart_rx_sta++;
if(g_usart_rx_sta > (USART_REC_LEN - 1))
{
g_usart_rx_sta = 0;
}
}
}
}
HAL_UART_Receive_IT(&g_uart1_handle, g_rx_buffer, sizeof(g_rx_buffer));
#endif
}
else if(huart->Instance == USART3_UX)
{
if(i<1550)
{
rebuf[i] = g_usart3_rx_buf[0];
i++;
}
if(rebuf[0]!=0x5a)
{
i=0;
}
if((i==2)&&(rebuf[1]!=0x5a))
{
i=0;
}
if(i==4&&(rebuf[3]==0x06))
{
receiveLength=((uint16_t )rebuf[3]<<8)|rebuf[2];
}
if(i>4)
{
if(i==receiveLength+6)
{
memcpy(RX_BUF,rebuf,i);
i=0;
}
}
HAL_UART_Receive_IT(&g_uart3_handle, (uint8_t *)g_usart3_rx_buf, 1);
}
}
温度计算:
uint8_t CHeck(uint8_t *data)
{
uint16_t sum=0,length=0,i=0;
uint16_t temp=0;
length=((uint16_t )RX_BUF[3]<<8)|RX_BUF[2]+6;
if(length>1544)
return 0;
for(i=0; i<length-2; i=i+2)
{
temp=((uint16_t )RX_BUF[i+1]<<8)|RX_BUF[i];
sum+=temp;
}
temp=((uint16_t )RX_BUF[1543]<<8)|RX_BUF[1542];
if(sum==temp)
{
memcpy(data,RX_BUF,length);
return 1;
}
else
return 0;
}
最大值,最小值,平均值计算:
void update_com_reg(float ta)
{
float min=300,max=0;
float aver=0;
com_reg.com_R0= (uint16_t)(mlx90640To[383]*100);
com_reg.com_R1 = (uint16_t)(ta*100);
for(uint16_t i=0;i<768;i++)
{
if(min>mlx90640To[i])
{
min=mlx90640To[i];
}
if(max<mlx90640To[i])
{
max=mlx90640To[i];
}
aver=aver+mlx90640To[i];
}
com_reg.com_R2 =(uint16_t)(max*100);
com_reg.com_R3 =(uint16_t)(min*100);
com_reg.com_R4 =(uint16_t)(aver/768*100);
temperature.min=com_reg.com_R3*1.0/100;
temperature.max=com_reg.com_R2*1.0/100;
temperature.aver=com_reg.com_R4*1.0/100;
}
主函数处理:
while (1)
{
if(CHeck(data_buf))
{
for(uint16_t y=0; y<24; y++)
{
for(uint16_t x=4; x<64+4; x=x+2)
{
temp2=((int16_t)data_buf[x+1+64*y]<<8|data_buf[x+64*y]);
RGBBuf[y][x/2-2] = temp2;
Temperature=(float)temp2/100;
printf(" %.2f", Temperature);
}
printf(" \r\n");
}
printf(" \r\n");
}
for(uint16_t i = 0;i<768;i++)
{
frame[i] = data_buf[i];
}
for(uint16_t i = 0; i<24;i++)
{
for(uint16_t j =0;j<32;j++)
{
mlx90640To[i*32+j] = RGBBuf[i][j]/100;
}
}
princess();
}
}
3.演示
使用串口助手查看温度计算值:
屏幕显示,手掌形状