【AT-START-F435测评】硬件I2C读取MLX90640热成像
本帖最后由 goodjob 于 2023-1-6 10:56 编辑AT32系列单片机,SRAM普遍比较大,特别是新出的AT32F435/437系列,最大SRAM可达到512K,288MHz主频,可以用来处理稍复杂的图形。有幸收到F435的开发板,马上打样了一块测试板,在这里先测试一下硬件I2C、大容量SRAM的图形性能。
测试板带了一个ST7789的屏,分辨率为320*240,因SRAM充足,直接使用双帧缓冲,占用300K(SRAM大就是爽,想怎么玩就怎么玩)。
https://www.bilibili.com/video/BV1NG4y127FE/?vd_source=832b774887fb3f7ff0db5d51b91c64ac
热成像用的MLX90640,使用I2C通信,在这里使用了I2C2,引脚为PH2和PH3。
I2C读写非常简单,直接使用I2C例程中的i2c_application即可。特别赞一下,官方AN0091文档提供了一个I2C时钟配置工具,非常方便。
MLX90640驱动也很简单,直接将I2C读写函数插入即可:
int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress,uint16_t nMemAddressRead, uint16_t *data)
{
uint8_t sa;
int ack = 0;
int cnt = 0;
int i = 0;
char cmd = {0,0};
char i2cData = {0};
uint16_t *p;
p = data;
u16 len=nMemAddressRead*2;
ack=i2c_memory_read(&hi2cx,I2C_MEM_ADDR_WIDIH_16,slaveAddr<<1,startAddress,(uint8_t *)i2cData,nMemAddressRead<<1,I2C_TIMEOUT);
if(ack != 0)
{
return -1;
}
for(cnt=0; cnt < nMemAddressRead; cnt++)
{
i = cnt << 1;
*p++ = (int)i2cData*256 + (int)i2cData;
}
return 0;
}
int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data)
{
uint8_t sa;
int ack = 0;
u8 cmd = {0,0,0,0};
static uint16_t dataCheck;
cmd = data >> 8;
cmd = data & 0x00FF;
ack=i2c_memory_write(&hi2cx,I2C_MEM_ADDR_WIDIH_16,slaveAddr<<1,writeAddress,cmd,2,I2C_TIMEOUT);
if(ack != 0)
{
return -1;
}
MLX90640_I2CRead(slaveAddr,writeAddress,1, &dataCheck);
if ( dataCheck != data)
{
return -2;
}
else return 0;
}然后在main函数中初始化MLX90640,之后 直接读取数据即可。
MLX90640_Init();MLX90640_GetData();因为MLX90640分辨率为32*24,为了显示更清楚,充分利用AT32F435的高主频优势,将图像线性放大了8倍,最终实现了约16帧每秒的刷新速度。
因图像显示部分涉及本人项目,分享的代码中不含色卡及显示部分,仅提供读取温度数据相关代码。使用时需要将官方BSP包里面的相关文件夹按下图放在一起。
。
在之前有使用GD32F303,刷新有点慢,这个后续我也实现下 MLX90640的测量速率最高可以达到 64Hz? MLX90640价格并不便宜 MLX90640是 经济高效的替代方案。 测量的精度是如何实现的? MLX90640最大的测量距离是多少? 这个驱动的效果一般呢. 怎么显示热力图哪种形势呢? 快的速率时的噪声会越大,导致灵敏度下降 MLX90640怎么开发成为测温传感器? 可以实现无接触测量问题吗? 这个可以做测量问题的吗? MLX90640热成像怎么显示呢? 怎么实现人体识别呢? 使用iic+dma可以驱动MLX90640吗? 32*24怎么铺满所有的 lcd呢? MLX90640的有效探测距离大约多少? MLX90640红外摄像头模块怎么连F435 jtracy3 发表于 2023-2-4 09:19
怎么显示热力图哪种形势呢?
我用的是色卡查表。比如把要显示的温度段分成255级,再建一个255级的色卡,直接查表显示对应颜色
页:
[1]
2