总结——调试STM32F103ZET6及外围传感器_MH-Z14A二氧化碳传感器

来源:互联网 发布:nzt62数据 编辑:程序博客网 时间:2024/04/25 12:16

1.概述

模块为MH-Z14A二氧化碳传感器,UART输出,使用USART2。

2.接线

正极(引脚1)接P5的3脚5V,负极(引脚3)接P5的5脚GND,RXD(引脚11)接P5的6脚TXD,TXD(引脚19)接P5的7脚RXD。

3.调试关键问题

(1)波特率9600,数据位8位,停止位1位,校验位无。
(2)通信方式:STM32通过US2_TX发送读取CO2浓度的指令,传感器通过US2_RX返回浓度数据。
(3)读取气体浓度值命令

0xFF  0x01  0x86  0x00  0x00  0x00  0x00  0x00  0x79

返回值

0xFF  0x86  HIGH  LOW    -        -         -         -     校验值

气体浓度值= HIGH * 256 + LOW

(4)校验和计算

<1>从Byte1 加至Byte7: 0x01 + 0x86 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 = 0x87

<2>取反:0xFF - 0x87 = 0x78

<3>对取反后加1:0x78 + 0x01 = 0x79

char getCheckSum(char *packet){char i, checksum;for( i = 1; i < 8; i++){checksum += packet[i];}checksum = 0xff – checksum;checksum += 1;return checksum;}

(5)一开始使用USART_SendData函数向串口发送命令数据:

    for(i = 0; i < 9; i++)//发送读取CO2气体浓度指令,发送完一个字节后必须延时一段时间传感器才能正确接收到指令    {USART_SendData(USART2,CO2TxBuffer[i]);delay_ms(100);    }

发现发送读取CO2气体浓度指令,发送完一个字节后必须延时一段时间传感器才能正确接收到指令,共发送9字节。

后来发现有专门的发送数据函数USART_SendData_Length(USART2,CO2TxBuffer,9):

void USART_SendData_Length(USART_TypeDef* USARTx, u8* Data,u16 length){  /* Check the parameters */u16 i;for(i=0;i<length;i++){USART_SendData(USARTx, Data[i]);//向串口发送数据while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);//等待发送结束}    
(6)串口2中断处理函数,更新CO2气体浓度数据CO2Data:

void USART2_IRQHandler(void)                //串口2中断服务程序{char i, checksum = 0;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断{USART_RX_BUF_2[USART2Count++]  = USART_ReceiveData(USART2);//读取9字节到USART_RX_BUF_2if(USART2Count == 9)USART2Count = 0;//当接收到第9个字符后,从数组USART_RX_BUF_1的开头开始写//计算校验和//1、从Byte1 加至Byte7: 0x01 + 0x86 + 0x00 + 0x00 + 0x00 + 0x00 + 0x00 = 0x87//2、取反:0xFF - 0x87 = 0x78//3、对取反后加1:0x78 + 0x01 = 0x79for( i = 1; i < 8; i++){checksum += USART_RX_BUF_2[i];}checksum = 0xff - checksum;checksum += 1;}if(checksum == USART_RX_BUF_2[8])//证明接收到的数据是正确的CO2Data = USART_RX_BUF_2[2] * 256 + USART_RX_BUF_2[3];}
(7)代码地址

4.MH-Z14A二氧化碳传感器资料













2 0
原创粉丝点击