在线时间1537 小时
UID258281
注册时间2014-12-6
NXP金币0
TA的每日心情 | 开心 2020-1-12 00:23 |
---|
签到天数: 745 天 连续签到: 1 天 [LV.9]以坛为家II
金牌会员
 
- 积分
- 6868
- 最后登录
- 2020-7-15
|
本帖最后由 lising 于 2016-9-16 18:35 编辑
马不停蹄的忙了半天,总算是把程序抄全了。 SHARP的GP2Y1010AU0F应该是最便宜的一款灰尘传感器了,也就是好奇拿来玩玩。程序同样是抄网友的,在此表示感谢!程序中还有许多的问题需要完善:GP2Y1010AU0F的工作电压接了5V,Vo输出电压值0v~3.4v,应该用电阻对该电压进行分压后再采集;程序中没有使用ADC校准功能。这些问题要继续完善。
主要代码:
- void PM25_sampling(void)
- {
- DHT22_DATA_OUT(0);
- DelayUs(280);
- adc_to_v();
- DelayUs(40);
- DHT22_DATA_OUT(1);
- DelayUs(9680);
- }
- //ADC代码/初始化ADC功能能.
- void adc_init(void)
- {
- SIM->SCGC6|=(1<<27);//使能 ADC0时钟;
- ADC0->CFG1|=0x0c|0x01|(3<<5); //16BIT|BUSCLK/2|8分频
- ADC0->CFG2&=~(1<<4); //A chanle .即adc se 4a
- ADC0->SC2&=~(1<<6); //软件触发,ref选择 Vrefh脚电压.
- ADC0->SC3|= ( ADC_SC3_AVGE_MASK | ADC_SC3_AVGS(3) ); //多次采样平均值
- ADC0->SC1[0]=(ADC0->SC1[0]&0x04); //ch4 开始转换.
- while((ADC0->SC1[0]&ADC_SC1_COCO_MASK)==0); //等待转换结束.
- adc_hex_value_temp=ADC0->R[0]; //读取ADC值;
- }
- //排序函数qsort()用到的辅助函数.
- int cmp ( const void *a , const void *b)
- {
- return *(int *)a - *(int *)b;
- }
- //使能20次ADC转换,排序,然后舍弃最低5个,最高5个,
- //并把值改成十进制.,然后存在adc_v_value_temp;
- void adc_to_v(void)
- {
- unsigned int adc_value[20]; //多次采样值;
- unsigned int adc_avg_value; //平均值
- unsigned char x;
-
- for(x=0; x<20; x++)
- {
- ADC0->SC1[0]|=0x04; //ch4 开始转换.
- while((ADC0->SC1[0]&ADC_SC1_COCO_MASK)==0);
- adc_value[x] = ADC0->R[0];
- }
-
- //20个采样数组排序.必须包含头文件#include <stdlib.h>
- qsort(adc_value,20,sizeof(adc_value[0]),cmp);
- adc_avg_value=0;
- for(x=5; x<15; x++) //舍弃最高5个最低5个ADC值,剩余的取平均.
- {
- adc_avg_value += adc_value[x];
- if(x==14)
- {
- adc_avg_value = adc_avg_value/10;
- }
- }
- adc_v_value_temp = adc_avg_value*((float)(VCC_VALUE/65535)); //ADC16进制值 转化为 电压X100000倍
- }
复制代码
GP2Y1010AU0F.pdf
(154.92 KB, 下载次数: 1)
|
|