ADC

<内核学习营>+坦然+探索者stm32f407板子的ADC测试光传感器实验

发布于 2018-09-07 20:30:10
    本帖最后由 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!\n");
}

result = rt_device_open(dev, RT_DEVICE_FLAG_RDWR);
if(result != RT_EOK)
{
rt_kprintf("open faild! \n");
}

if(rt_device_read(dev,LSENS_CHANNEL,&temp,sizeof(temp))!=sizeof(temp))
{
rt_kprintf("channel %d: faild! \n", 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 \n", 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与光敏传感器通过引脚相连。
再者去读取通道获得电压值的变化。

结果:1536056582(1).jpg

遇到的问题及解决办法:(1)由于示例代码中的读取ADC通道的函数没有提供,自己通过调用底层设备的读设备函数编写了一段代码,已在上面的代码中贴出来了。
(2)文档写到是打印的值越大代表光越强,实验后发现是相反的,通过修改代码已实现值越大代表越亮,代码在贴出来的程序中已加入。

查看更多

关注者
0
被浏览
1.2k
0 个回答
暂无答案,快来添加答案吧

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览