zoukankan      html  css  js  c++  java
  • STM32F412应用开发笔记之四:与远红外炭氢传感器通讯

    远红外炭氢传感器是在多组分气体传感器中用来检测甲烷和丙烷浓度的,采用单总线串行通讯,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值。

  • 相关阅读:
    日积月累--小技巧之四
    深入理解object C中复制对象的用法(二)
    状压dp-poj-1170-Shopping Offers
    linux printk函数学习
    I.MX6 WIFI wireless_tools 移植
    I.MX6 AW-NB177NF WIFI 驱动移植问题
    VS 一些配置设置
    I.MX6 boot from Micro SD
    Android studio 构建太慢
    Android gif 录屏
  • 原文地址:https://www.cnblogs.com/foxclever/p/6217104.html
Copyright © 2011-2022 走看看