历史上的今天
今天是:2025年05月08日(星期四)
2019年05月08日 | GP2Y10驱动含PM2.5和AQI(STM32)
2019-05-08 来源:eefocus
一、前期准备
单片机:STM32F103ZET6
开发环境:MDK5.14
库函数:标准库V3.5
GP2Y10模块:淘宝有售

二、实验效果


三、驱动原理
主要就是采集AD电压,对应转换公式做相关的转换。
需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。
四、驱动代码
gp2y10.h
#ifndef __GP2Y10_H__
#define __GP2Y10_H__
#include "stm32f10x.h"
#include "gpio.h"
#include "delay.h"
#include "uart.h"
#define GP2Y10_CONTROL PAout(0)
#define GP2Y10_PIN GPIO_Pin_0
#define GP2Y10_CLKLINE RCC_APB2Periph_GPIOA
#define GP2Y10_PORT GPIOA
extern void GP2Y10Configuraiton(void);
extern void GetGP2Y10Value(uint16_t *AQI, uint16_t *PM25);
#endif
gp2y10.c
#include "gp2y10.h"
void GP2Y10Configuraiton(void)
{
GPIO_InitTypeDef GPIO;
//Enable APB2 Bus
RCC_APB2PeriphClockCmd(GP2Y10_CLKLINE, ENABLE);
//Register IO
GPIO.GPIO_Pin = GP2Y10_PIN;
GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GP2Y10_PORT, &GPIO);
GP2Y10_CONTROL = 0;
}
void GetGP2Y10Value(uint16_t *AQI, uint16_t *PM25)
{
uint16_t tmp[10] = {0}, max, min;
uint32_t value = 0;
uint8_t i, pMax = 0, pMin = 0;;
for(i = 0; i < 10; i ++)
{
GP2Y10_CONTROL = 0;
DelayUs(280);
tmp[i] = ADC_GetConversionValue(ADC1);
DelayUs(22);
GP2Y10_CONTROL = 1;
DelayUs(9680);
}
max = min = tmp[0];
for(i = 0; i < 10; i ++)
{
if (min > tmp[i])
{
min = tmp[i];
pMin = i;
}
if (max < tmp[i])
{
max = tmp[i];
pMax = i;
}
}
tmp[pMax] = 0;
tmp[pMin] = 0;
for (i = 0; i < 10; i ++)
{
value += tmp[i];
}
value = (uint16_t)((float)value / 10.0);
//printf("Volatge = %0.2f!rn", (float)(((float)value) / 4096.0 * 3.3));
*PM25 = (uint16_t)(((float)(((float)value) / 4096.0 * 3.3) * 0.17 - 0.1) * 1000.0);
if (*PM25 > 0 && *PM25 <= 35)
{
*AQI = (uint16_t)(50.0/35.0*(float)(*PM25 - 0) + 0);
}
if (*PM25 > 35 && *PM25 <= 75)
{
*AQI = (uint16_t)(50.0/40.0*(float)(*PM25 - 35) + 35.0);
}
if (*PM25 > 75 && *PM25 <= 115)
{
*AQI = (uint16_t)(50.0/40.0*(float)(*PM25 - 75) + 75.0);
}
if (*PM25 > 115 && *PM25 <= 150)
{
*AQI = (uint16_t)(50.0/35.0*(float)(*PM25 - 115) + 115.0);
}
if (*PM25 > 150 && *PM25 <= 250)
{
*AQI = (uint16_t)(100.0/100.0 * (float)(*PM25 - 150) + 150.0);
}
if (*PM25 > 250 && *PM25 <= 350)
{
*AQI = (uint16_t)(100.0/100.0*(float)(*PM25 - 250) + 250.0);
}
if (*PM25 > 350 && *PM25 <= 500)
{
*AQI = (uint16_t)(100.0/150.0*(float)(*PM25 - 350) + 350.0);
}
}
史海拾趣
|
怎么用KITL技术来调试WINCE内核啊,不是很懂这个,望高人指点一二啊! 怎么用KITL技术来调试WINCE内核啊,不是很懂这个,望高人指点一二啊! 能像VC++6.0里面调试应用程序那样吗?可以单步,断点,运行什么的吗?但关键是NK不能在本地(PC)上运行,必须在远端(设备)上运行,这个要进行单步,断点,运行调试是怎么一 ...… 查看全部问答> |
|
采用WINCE6.0,编译内核时添加了组建“.net compact framework 2.0”。PC上开发环境为VS.NET2005,并且安装了定制的SDK,可是在运行C#写的代码时出错,提示如下: An unhandled exception of type \'System.MissingMethodException\' occurred i ...… 查看全部问答> |
|
ARM默认不是单字节对齐,必须要在结构体前加__packed修饰符才能将结构体设置为单字节对齐。但是结构体中包含了double就不能用__packed修饰符了,编译报错。请问各位高手如何解决?这个结构体是用来读库文件中的记录的,因为库文件中记录是单字节对 ...… 查看全部问答> |
|
大家在做LED测试时应该会发现当以高频电流驱动器,经常会出现烧黑现象,最终导致死灯。具体表现在金线周围胶体因持续高温下硅胶碳化烧黑,这是由于高频下阻抗远高于直流阻抗,阻抗的升高使金线发热更加严重使胶体烧黑,产生这一现象的原因就是集肤 ...… 查看全部问答> |
|
430的SPI和UART使用同一个寄存器发送数据?能同时应用么/ 要同时应用SPI和UART,看了一下,好象是同一个寄存器发送数据啊,怎么SPI发送数据还要设置UART的拨特率啊?请高手\\解释~!谢谢!… 查看全部问答> |




