远红外炭氢传感器是在多组分气体传感器中用来检测甲烷和丙烷浓度的,采用单总线串行通讯,TTL电平。所以我们需要用到UART口来实现与远红外炭氢传感器的通讯。
远红外传感器就是这个样子的:
再来一张进气和出气口的照片:
我们设计的是使用USART1和USART3,但由于NUCLEO-F412ZG试验板上USART1的引脚PA9和PA10已经用于USB端口,USART3的引脚PD8和PD9也已经用于连接ST-LINK的串行通讯,所以我们使用了USART2和USART6。
查看NUCLEO-F412ZG原理图后我们发现USART2和USART6也正好引到CN7和CN9方便接线。USART2所使用的引脚为PD5(CN9_6)和PD6(CN9_4),USART6所使用的引脚为PC6(CN7_1)和PC7(CN7_11)。如下图红框部分:
在STM32CubeMX中配置好后,首先配置串口通讯的参数,远红外炭氢传感器要求波特率2400,8位数据位,偶校验,1位停止位,配置为输入输出双向。配置界面如下:
然后可以配置一下GPIO引脚,我们给他们起一个我们自己认为好辨认的名字,然后保存更新源码:
配置完成在源码中如下:
huart2.Instance = USART2;
huart2.Init.BaudRate = 2400;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_EVEN;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart6.Instance = USART6;
huart6.Init.BaudRate = 2400;
huart6.Init.WordLength = UART_WORDLENGTH_8B;
huart6.Init.StopBits = UART_STOPBITS_1;
huart6.Init.Parity = UART_PARITY_EVEN;
huart6.Init.Mode = UART_MODE_TX_RX;
huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart6.Init.OverSampling = UART_OVERSAMPLING_16;
配置好后开始编写元红外传感器的通讯函数,该通讯数据描述如下:
//0x00C0 Modbus_address 模块当前Modbus地址 可读写
//0x0080到0x0083 DeviceType 设备的型号 可读写
//0x0084到0x0085 SoftwareVersion 软件版本 只读
//0x0086到0x0089 Internal device number 设备序列号 只读
//0x0005 MOD 气体浓度设置值 只读
//0x000A Concentration 气体浓度 只读
//0x0003 T_module (0.1x°C) 传感器内部温度 只读
//0x0045 Alarm_Level 主报警限值 可读写
//0x0044 Warn_Level 预报警限值 可读写
//0x0047 IR_4tagneu 零点的强度测量 可读写
//0x0009 Statusflags 状态信息 只读
//Flag 0 Testflag value ?1“ with device test
//值“1”表示仪器处于测试状态
//Flag 1 Warmup value ?1“ approx. 10s after start
//值“1”表示启动后大约10秒预热
//Flag 2 Syserr value ?1“ System Error
//值“1”表示系统错误
//Flag 3 Alarm value ?1“ if main gas alarm warning
//值“1”表示气体主报警开始工作
//Flag 4 Warn value ?1“ if gas pre-alarm warning
//气体预报警开始工作
//Flag 5 Startup value ?1“ in the start-up phase (less than 90sec)
//值“1”表示处于启动阶段(至少90秒)
//Flag 6 Korr value ?1“ if S-MODULE is temperature-compensated
//值“1”表示S-MODULE提供温度补偿功能
//Flag 7 mw_ok value ?1“ if zero point was set
//值“1”表示零点已设定
根据上述描述我哦们便写相关函数,由于元吗较多再次不做过多描述,编完调试改错,最后运行成功。如下是调试运行界面。
再来一张在终端中显示数据结果的截图:
由于传感器是暴露在空气中试验,也没有添加校准过程,所以显示数据接近于0值。