资讯详情

ad6怎么画电阻_光敏电阻传感器的使用

7c3c4a7e57d9d7be51706afb3d4a8a6c.png

来源:百问网_嵌入式Linux wiki_jz新一期视频维基教程 (视频文字版)

作者:韦东山

文字数:2552,阅读时间:3分钟

这节课我们开始讲的传感器有光敏电阻,DH11温湿度传感器,DS18B20温度传感器,HS红外接收器0038。

首先介绍光敏电阻传感器。

光敏电阻的一个特点是,其电阻值随光强的变化而变化,

看看它的原理图,R5是普通电阻,LAS1.光敏电阻串联形成分压电路,

LAS1电阻值的变化会导致中间RES_AO测量的电压发生了变化。

5a8154b29356d034296db65d9a16f345.png

这个电路图有点绕,画示意图如下:

8a7dd787e32127b9e647d6231e658126.png

使用ADC测量A可以知道点的电压LAS这里的测量是一个模拟信号。

现在,如果这个光敏系统需要在光线大于/小于一定值时中断,该怎么办?

这里需要增加一个比较电路,B电压是通过调节电阻可调电阻获得的电压。A、B当两个电压最终连接到比较器的正负端时A>B输出1,否则输出0。

对比阈值的控制可以通过调节可调电阻来实现。

模拟信号和数字信号模拟信号和数字信号。

现在你可以开始写程序了。复制前024代码为025_sensors,这是本章的第一个项目,创建001_photoresistor文件夹,将代码都放进去。

再创建一个sensors文件夹用于放置本课程的所有传感器代码,然后创建photoresistor文件夹放本节课代码,再在里面创建photoresistor.c。

在代码中,我们必须做两件事:

1.启动ADC,读出AIN1电压值;

2.当光强超过或小于一定阈值时,注册中断;

打开项目adc代码,原来的adc_init,只初始化了adc现在我们要用了AIN1.修改代码并输入参数以初始化相应的代码AIN:

void adc_init(int channel){/* ECFLG, 1 = End of A/D conversion * PRSCEN,1 = A/D converter prescaler enable * PRSCVL,adc clk = PCLK / (PRSCVL   1) * SEL_MUX,000 = AIN 0 * STDBM * = A/D conversion starts and this bit is cleared after the startup. */ADCCON = (1<<14) | (49<<6) | (channel<<3);ADCDLY = 0xff;}

后面的adc_read_ain0只能读取AIN现在修改0的数据,输入一个通道参数,读取相应的通道ADC值:

int adc_read(int channel){adc_init(channel);/* 启动ADC */ADCCON |= (1<<0);while (!(ADCCON & (1<<15)));  /* 等待ADC结束 */return ADCDAT0 & 0x3ff;}

修改了这两个函数,原来的adc_test调用函数adc读取函数也应相应修改。

参考这个adc_test,编写photoresistor_test函数。

需要修改的内容不多。首先是修改adc_read将通道0改为通道1的参数。

然后我们想同时重新开始AIN0上的滑动电阻对应的电压也读出来,因此再做一次ADC0读取操作。

void photoresistor_test(void){int val,val0;double vol,vol0;int m,m0; /* 整数部分 */int n,n0; /* 小数部分 *///adc_init();while (1){val = adc_read(1);vol = (double)val/1023*3.3;   /* 1023----3.3v */m = (int)vol;/* 3.01,m = 3 */vol = vol - m;/* 小数部分: 0.01 */n = vol * 1000;  /* 10 */val0 = adc_read(0);vol0 = (double)val0/1023*3.3;   /* 1023----3.3v */m0 = (int)vol0;/* 3.01,m = 3 */vol0 = vol0 - m0;/* 小数部分: 0.01 */n0 = vol0 * 1000;  /* 10 *//* 打印在串口上*/printf("photoresistor vol: %d.dv,compare to threshold %d.dv",m,n,m0,n0);  /* 3.010v *//* 在LCD上打印 *///fb_print_string();}

以上是我们的第一个目标。

现在开始做第二个目标,中断注册interrupt.c里实现。

硬件上RES_DO是EINT15.我们可以根据之前的按钮中断来编写这个中断。

先分析中断,如图所示:

e924fb7502b487699e8bd98c3a2e6285.png

GPG7作为中断引脚,它将首先通过外部中断EINTMASK只有寄存器才能进入中断控制器。

因此,需要做以下操作:

  • ①首先,初始化:

a.GPG7配置为中断引脚;

b.设置中端触发方式:双边沿触发;

c.设置EINTMASK使能中断;

  • ②中断处理:

a.分辨:读EINTPEND;

b.读GPG7;

在原来的key_eint_init函数里配置GPG七是中断引脚:

/* 配置GPG7用于光敏电阻 */GPGCON &= ~((3<<14));GPGCON |= ((2<<14));

然后设置中端触发模式:双边触发

/* 设置中断触发模式: 双边触发 */EXTINT0 |= (7<<0) | (7<<8);       /* S2,S3 */EXTINT1 |= (7<<12);         * S4 */EXTINT2 |= (7<<12);         * S5 */

最后,中断能量:

/* 使能中断GPG7/EINT光敏电阻 15*/EINTMASK &= ~((1<<15));

修改key_eint_irq中断处理函数,先判断哪个中断,再读取电平,打印。

else if (val & (1<<15)) /* eint光敏电阻 15*/{if (val2 & (1<<7)){printf("photoresistor dark!");}else{printf("photoresistor light!");}}

到目前为止,代码已经完成,最后修改相应的代码Makefile和主函数。

「新品首发」STM32MP157开发板热预售!第一批只有300套

标签: 光敏电阻的阻值随光

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台