- 本帖最后由 luzixing 于 2018-9-12 11:46 编辑 *
实验要求:本实验是在探索者开发板完成的
硬件:至少有一路带ADC输入功能的GPIO, 能够用来连接 光环境传感器有一路串口用来做msh shell 终端
软件:
串口驱动
ADC驱动
实现的代码:
include
include
include
include
include
include
define LSENS_READ_TIMES 10 //定义光敏传感器读取次数,读这么多次,然后取平均值
define LSENS_CHANNEL 5
define LSENS_GET_PERIOD 500
define ADC_NAME “adc3”
/ 读取Light Sens的值 /
/ 0~100:0,最暗;100,最亮 /
void lsens_get_val(void* parameter)
{
rt_uint32_t temp = 0;
rt_uint32_t Lsens_val = 0;
rt_device_t dev;
rt_err_t result = RT_EOK;
while(1)
{
rt_uint8_t i;
rt_uint16_t val=0;
for(i = 0;i < LSENS_READ_TIMES;i++)
{
dev = rt_device_find(ADC_NAME);
if(!dev)
{
rt_kprintf("not found!<br>");
}
result = rt_device_open(dev, RT_DEVICE_FLAG_RDWR);
if(result != RT_EOK)
{
rt_kprintf("open faild! <br>");
}
if(rt_device_read(dev,LSENS_CHANNEL,&temp,sizeof(temp))!=sizeof(temp))
{
rt_kprintf("channel %d: faild! <br>", LSENS_CHANNEL);
}
val += temp;
rt_thread_delay(1); /* #define RT_TICK_PER_SECOND 1000 */
}
temp = (rt_uint32_t)(val/LSENS_READ_TIMES);//得到平均值
if(temp>4000) temp=4000;
temp = (100-temp/40);
if(temp != Lsens_val)
{
Lsens_val = temp;
rt_kprintf("Lsens Vaule is:%d <br>", Lsens_val);
}
rt_thread_delay(LSENS_GET_PERIOD-LSENS_READ_TIMES);
}
}
int adc_test(void)
{
rt_thread_t tid;
tid = rt_thread_create("Lsens",
lsens_get_val, RT_NULL,
512, RT_THREAD_PRIORITY_MAX/3, 20);
if (tid != RT_NULL)
rt_thread_startup(tid);
return 0;
}
INIT_APP_EXPORT(adc_test);
实验步骤:
首先移植ADC的驱动,在底层驱动内配置ADC3的各通道,因为ADC3的通道5与光敏传感器通过引脚相连。
再者去读取通道获得电压值的变化。
结果:
遇到的问题及解决办法:(1)由于示例代码中的读取ADC通道的函数没有提供,自己通过调用底层设备的读设备函数编写了一段代码,已在上面的代码中贴出来了。
(2)文档写到是打印的值越大代表光越强,实验后发现是相反的,通过修改代码已实现值越大代表越亮,代码在贴出来的程序中已加入。