MLX90640+STM32F103实现USB版红外测温

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的硬件。
KEIL5版的源代码在我的空间,欢迎大家下载。
http://download.csdn.net/download/shidong01/12261517
有疑问,欢迎大家交流~

基于STM32F103RC和I2C接口的MLX90621工程是一个项目,通过串口输出将数据显示在PC工具上。在STM32单片机中,每个IO引脚的最大电流都是有限的。对于一些简单的单片机,例如STC89C51RC,可能没有集成上拉电阻或下拉电阻,需要在电路中额外添加。但是对于大多数高级控制芯片,例如STC15W408AS,都会集成上拉或下拉电阻。 关于MLX90640_STM32F103RC,你提到了一个不完整的名称,无法提供更多信息。如果你有具体的问题或需要更多细节,请提供完整的名称和具体的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32F103RC_MLX90621.rar](https://download.csdn.net/download/lwjian147/12200841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [stm32设置内部上拉电阻_比较全面的电阻上、下拉介绍](https://blog.csdn.net/wjy397/article/details/123068889)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值