STM8使用pwm接口调试GDS06灰尘传感器

news/2024/12/28 3:44:07/

背景

刚好有项目使用GDS06这款传感器,这里简单做个记录。

GDS06接口如下,这里支持串口和PWM的输出到MCU,由于项目采用STM8S003F3P6,资源极其有限。

所以硬件设计的时候,就考虑采用PWM的接口方式,这样只是消耗掉STM8S003F3P6一个管脚而已。

 原理图

如下图所示CN7连接粉尘传感器,PA3对应GDS06的对应管脚PWM 

PWM 输出
传感器通过 PWM 口(第 4 脚)输出 PWM 信号,该 PWM 周期为 1 秒,按低电平的宽度计算灰尘浓度值。引脚输出的脉冲宽度对应粉尘浓度的平均值。
低脉冲时间与粉尘浓度的关系:1ms = 1ug/m3
例如低电平宽度为 100 ms,则对应灰尘浓度为 100 ug/m3。 浓度输出范围为 1~999 ug/m3。 该浓度值内部进行了软件滤波处理,跳动幅度相对较小。

PWM 通信
传感器通过 PWM 口输出 PWM 信号,按低电平宽度计算灰尘浓度值。
PWM 输出周期: 1 秒
测量值输出范围: 1~999 ug/m³
低电平与测量值对应关系:测量值(ug/m³)= 低电平时间(毫秒)

软件设计

STM8S003F3P6使用PA3管脚,采用定时器2捕获模式,配置如下图所示


u16 gds06_value;
u8  gds06_Sta;//红外遥控初始化
//设置IO以及TIM2_CH1的输入捕获
void GDS06_Init(void)    			  
{		/* Set PA.3 TIM2_CH3 pin *////GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);GPIO_DeInit(GPIOA);//恢复指定端口GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);//设置PA3为浮空输入无中断TIM2_DeInit();/* Time base configuration */      //TIM2_TimeBaseInit(TIM2_PRESCALER_2048, 65535);//TIM2_TimeBaseInit(TIM2_PRESCALER_1, 999);//2Mhz///TIM2_TimeBaseInit(TIM2_PRESCALER_1, 1999);//1Mhz//TIM2_TimeBaseInit(TIM2_PRESCALER_16, 10000 - 1);//1MhzTIM2_TimeBaseInit(TIM2_PRESCALER_16384, 2000 - 1);//976 hzTIM2_ARRPreloadConfig(ENABLE);//TIM2_ClearFlag(TIM2_FLAG_UPDATE);//清除更新标志TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);//允许更新/溢出中断TIM2_Cmd(ENABLE);//开启定时器enableInterrupts(); //开启中断/* Prescaler configuration *////TIM2_PrescalerConfig(TIM2_PRESCALER_2048, TIM2_PSCRELOADMODE_IMMEDIATE);//TIM2_ICInit(TIM2_CHANNEL_3, TIM2_ICPOLARITY_RISING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_DIV1, 3);TIM2_ICInit(TIM2_CHANNEL_3, TIM2_ICPOLARITY_FALLING, TIM2_ICSELECTION_DIRECTTI, TIM2_ICPSC_DIV1, 0);TIM2_ITConfig(TIM2_IT_CC3 , ENABLE);//中断配置与使能函数TIM2_ClearITPendingBit(TIM2_IT_CC3);TIM2_ClearFlag(TIM2_FLAG_CC3);//TIM2_CCxCmd(TIM2_CHANNEL_2, ENABLE);//输入捕获/比较输出使能}

 定时器2的中断如下

主要是探测出来低电平的长度

 //定时器2输入捕获中断服务程序	 INTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler, 14){/* In order to detect unexpected events during development,it is recommended to set a breakpoint on the following instruction.*/BitStatus bs;bs = GPIO_ReadInputPin(GPIOA, GPIO_PIN_3);//读PA3的输入电平状态//if(TIM2_GetITStatus(TIM2_IT_CC3)==SET) //处理捕获(CC1IE)中断if(bs)//上升沿捕获{gds06_value = TIM2_GetCounter();//读取CCR2也可以清CC2IF捕获标志位TIM2_OC3PolarityConfig(TIM2_OCPOLARITY_LOW); //CC1P=0	设置为上升沿捕获//gds06_Sta |= 0X10;					//标记上升沿已经被捕获}else //下降沿捕获{TIM2_OC3PolarityConfig(TIM2_OCPOLARITY_HIGH);		//CC1P=1 设置为下降沿捕获TIM2_SetCounter(0x0000);	   	//清空定时器值}				 		     	    					   TIM2_ClearITPendingBit(TIM2_IT_CC3);  //清除中断标志位 }


http://www.ppmy.cn/news/93963.html

相关文章

【数学建模】矩形桌子能放平(初等模型)

把一把四只脚的椅子往不平的地面上一放,通常只有三只脚着地,放不稳,然而只要稍挪动几次,就可以四脚着地,放稳了。如何解释这种现象? 1 模型假设 椅子四条腿一样长,椅脚与地面接触可视为一个点&…

《操作系统》期末客观题梳理

《操作系统》复习(1-9) 文章目录 《操作系统》复习(1-9)Ⅰ知识点概念第一章操作系统导论第二章进程描述与控制第三章处理机调度死锁第四章进程同步第五章存储器管理第六章虚拟存储器第七章输入输出系统第八章文件管理第九章磁盘存…

ORBBEC(奥比中光)AstraPro相机在ROS2下的标定与D2C(标定与配准)

文章目录 1.rgb、depth相机标定矫正1.1.标定rgb相机1.2.标定depth相机1.3.rgb、depth相机一起标定(效果重复了,但是推荐使用)1.4.取得标定结果1.4.1.得到的标定结果的意义 1.5.IR、RGB相机分别应用标定结果1.5.1.openCV应用标定结果1.5.2.ros…

【Netty】Netty 编码器(十三)

文章目录 前言一、MessageToByteEncoder 抽象类二、MessageToMessageEncoder 抽象类总结 前言 回顾Netty系列文章: Netty 概述(一)Netty 架构设计(二)Netty Channel 概述(三)Netty ChannelHan…

WordPress判断当前页是否为首页的方法

在WordPress建站中,可以利用is_home()判断当前页是否为首页,如果不起作用,大致有如下两个常见原因: 第一种 当你的首页不是默认的index.php的时候,而是在后台指定了一个page页面。这种情况下is_home()会失效&#xf…

PyTorch修改为自定义节点

1 要将网络修改为自定义节点,需要在该节点上实现新的操作。在 PyTorch 中,可以使用 torch.onnx 模块来导出 PyTorch 模型的 ONNX 格式,因此我们需要修改 op_symbolic 函数来实现新的操作。 首先,创建一个新的 OpSchema 对象&…

【Docker】- 02 Docker-Compose

Docker-Compose Docker-Compose1 下载并安装Docker-Compose1.1 下载Docker-Compose1.2 设置权限1.3 配置环境变量1.4 测试 2 Docker-Compose管理MySQL和Tomcat容器3 使用docker-compose命令管理容器4 docker-compose配合Dockerfile使用4.1 docker-compose文件4.2 Dockerfile文件…

Goby 漏洞更新|锐捷网络 NBR路由器 webgl.data 信息泄露漏洞

漏洞名称:锐捷网络 NBR路由器 webgl.data 信息泄露漏洞 English Name:Ruijie NBR Router webgl.data information CVSS core: 7.5 影响资产数:204290 漏洞描述: 锐捷网络NBR700G路由器是锐捷网络股份有限公司的一款无线路由设…