官方直营淘宝店铺:=a1z09.5.0.0.4mLru6&id=255845280011灰尘传感器GP2Y1010AU0F使用说明GP2Y1010AU0F是日本夏普公司开发的一款光学灰尘浓度检测传感器。此传感器内部成对脚分布的红外发光管和光电晶体管,利用光敏原理来工作。用于检测特别细微的颗粒,如香烟颗粒、细微灰尘。依靠输出脉冲的高度来判断颗粒浓度。传感器的特点:1.尺寸:(46.0x30x17.6mm)2.最大工作电流:20mA3.单脉冲即可检测出颗粒浓度。(待工作稳定)4.工作温度:-10~65℃5.安全无害应用实例:检测空气中颗粒浓度,用于空气净化器、空气监测器说明:具体尺寸、引脚说明、内部电路读者可以参考datasheet,本文侧重说明传感器应用的具体电路,使用中存在的注意事项,以及相应的开发代码。1GP2Y1010AU0F与MSP430F149的使用说明:1.1电路连接图:1.2电路说明:电阻R2起到限流的作用,晶体管Q1可以增加3号脚的驱动能力。R2建议10K,Q1建议2SC1815(npn晶体管)官方直营淘宝店铺:=a1z09.5.0.0.4mLru6&id=255845280012430的P1.2作为脉冲的输入脚,为传感器提供输入信号传感器的引脚按照datasheet中典型电路来接,R1、C1分别为150Ω和220uF的电解电容P6.5为430内部ADC的5号模拟输入脚R3和R4起分压作用,分别为10K,因为对于430单片机,驱动电压为3.2V,而对于传感器而言,需要提供5V的电压,输出电压有可能会超过3.2V,当然这不仅仅取决于此。对应的A5进行采样时设定的参考电压正好为3.2V的缘故,对于430单片机,是有相应的引脚作为输入参考电压的。因此分压模块的设置非常灵活。如果不采用分压模块,最好在5号输出接一只大值电阻到地电路最好采取焊接的方式,因为面包板搭建的电路会因为面包板分布电容的原因与最终结果出现偏差1.3信号与结果:对于输入信号的几点说明:输入信号采用周期为10ms±1ms;输入高脉冲的宽度为0.32ms±0.02ms。对于采样信号,需要等待输入信号出现高脉冲以后计时0.28ms进行采样。具体板子搭建成功后的信号示意图如下图所示。图二输入输出信号示意图图中黄色的信号线是输入信号,可以看到其波形频率大概为100HZ,也就是周期为10ms,另外可以看到输出分压以后的波形(红线),当输入高脉冲过后不久,便出现了红色输出的高脉冲。官方直营淘宝店铺:=a1z09.5.0.0.4mLru6&id=255845280013为了更加清晰的观测红色输出波形,我们可以来观察图三。图三采样及输出的具体波形图三反应了具体的输出波形,可以从时间轴测量,在输入上升沿到输出的峰值,时间大概是0.28ms左右,这与datasheet上的说明相符。其中蓝色的线代表AD采样的时刻,但是由于示波器触发设置的原因,导致蓝色的线条在输入信号的下降沿才发生跳变,其实这里相当于滞后了,读者可以心领神会。1.4代码说明:由于参考代码过多,在此对于常见的代码不予讲解,下面对于核心代码进行说明。430单片机特点:16位处理器,低功耗,8M的主系统时钟决定单指令周期为0.125us,内部集成众多外设,包括12位ADC,定时器A,定时器B。强调一点是,由于此传感器要求采样时序较为精确,因此像430这种中端的微处理器或者更高端的处理器比较适合开发此传感器,也就是说指令的处理速度越快越好。430单片机带动传感器工作一次的时间大概为1.5s,工作期间不间断提供输入脉冲,大概到1s左右,此时传感器的工作已经稳定,因此可以开始采样了,连续采样4次,然后将数据取平均值,这就是一次工作的整个流程。这样的设计思路既可以保证传感器的读值稳定性,又可以做到低功耗。输入信号由定时器A产生,P1.2(TA1)输出,ADC采样时序的控制由定时器B控制,使用片内12位的ADC进行采样,采样的参考电压是系统电压3.2V(做法比较粗糙),采样后直接转成模拟信号的表达形式,最后输出的是电压值,对于电压转换到PM2.5的值,在1.5节有简单说明。#includemsp430x14x.h#defineucharunsignedchar#defineuintunsignedintuintcount_A=0;//对count_A进行计数,当count_A100,即传感器稳定后进行采样ucharcount_B=0;//单独工作一次ADC采样的次数,当count_B=4时完成一组工作uintPM2_5;//PM2.5的数字值ucharptr[3];//PM2.5的模拟值官方直营淘宝店铺:=a1z09.5.0.0.4mLru6&id=255845280014//这一模块可以更改输入信号的端口,读者可以在自己的系统取合适端口,在此取P1.2口也//就是TA1,因为我们是利用定时器A来产生传感器输入信号的#definePWMBIT2voidPWM_IO(){P1SEL|=PWM;//P1.2为PWM波形的输出口P1DIR|=PWM;}//----------------------GP2Y1010AU-----------------------------------------------------------------------------------////*****************************************************************************//函数名:timerA_start_PWM()//输入:无//输出:无//功能描述:产生PWM波形//****************************************************************************voidtimerA_start_PWM(void){TACTL|=TACLR;PWM_IO();//使P1.2为PWM的输出口TACTL|=TASSEL1+ID1+ID0+MC0;//选择子系统时钟且分频,时钟为SMCLK/8;加计数模式CCTL1|=OUTMOD0+OUTMOD1;//置位/复位模式CCTL0|=CCIE;//开启捕获比较中断CCR0=10000;//周期为10msCCR1=9680;//高电平时间为0.32ms}//******************************************************************************//函数名:timerB_start_996()//输入:无//输出:无//功能描述:确定ADC启动采样的时间,为定时器A中断后,定时器B定时9.96ms//******************************************************************************voidtimerB_start_996(){TBCTL|=TBCLR;TBCTL|=TBSSEL1+ID1+ID0+MC0;//选择子系统时钟且分频,时钟为SMCLK/8;加计数模式TBCCR0=9950;//经过实验调整,9.95ms采样最好,其一是启动定时器会耗费一定时间,//其二是由于本身产品存在的一定误差,因此这个值可以由读者自己实践确定TBCCTL0|=CCIE;//开启比较捕获中断}//******************************************************************************官方直营淘宝店铺:=a1z09.5.0.0.4mLru6&id=255845280015//函数名:GP2Y1010AU_work()//输入:无//输出:无//功能描述:使传感器开始工作,并且经过ADC采样//******************************************************************************voidGP2Y1010AU_work(){timerA_start_PWM();//开启定时器A并产生PWM波}//******************************************************************************//函数名:ADC_Int()//输入:无//输出:无//功能描述:ADC设置的初始化//******************************************************************************voidADC_Int(){ADC12CTL0|=SHT0_2+ADC12ON;//采样保持时间选为16个ADC12CLK,打开ADCADC12CTL1|=SHP+ADC12SSEL0+ADC12SSEL1;//SAMPCON采用时序电路产生的信号,时钟SMCLKADC12MCTL0|=INCH0+INCH2;//选择AVCC和AVSS作为参考电压,选择A5通道ADC12IE|=BIT0;//允许ADC12MEM0中断ADC12CTL0|=ENC;//使能转换P6SEL|=BIT5;//P6.5为模拟信号输入端}//******************************************************************************//函数名:Tran_Val(uintHex_Val)//输入:数字量//输出:模拟量//功能描述:ADC数字量向模拟量转变//******************************************************************************voidTran_Val(uintHex_Val)//为了不出现浮点数的计算,整个对电压放大100倍进行计算{unsignedlongcaltmp;uintCurr_Volt;uchart1;caltmp=Hex_Val;caltmp=(caltmp5)+Hex_Val;//caltmp=Hex_Val*33caltmp=(caltmp3)+(caltmp1);//caltmp=caltmp*10官方直营淘宝店铺:=a1z09.5.0.0.4mLru6&id=255845280016Curr_Volt=caltmp12;ptr[0]=Curr_Volt/100;//Hex-DEC变换,百位t1=Curr_Volt-(ptr[0]*100);ptr[1]=t1/10;//十位ptr[2]=t1-(ptr[1]*10);//各位}voidmain(){WDTCTL=WDTPW+WDTHOLD;//禁止看门狗InitSys();//系统初始化P3DIR|=BIT0;//P3.0为输出P3.0和P3.1在此均做测试用,因为这两个引脚分别接有两个//LED灯P3DIR|=BIT1;//P3.1为输出P3OUT&=~BIT1;P3OUT&=~BIT0;LCD_IO_set();LcdReset();//LCD初始化FYTOOJASK3000();ADC_Int();_EINT();//使能中断,这是一个C编译器支持的内部过程while(1){GP2Y1010AU_work();Delay2s();//延时2秒,延时至少超过一次传感器的