ADC

【内核学习营】+青春+ADC读取光敏传感器实验

发布于 2018-09-11 20:27:21
    本帖最后由 青春JY 于 2018-9-12 15:33 编辑


实验要求: 使用野火或正点原子M3、M4或M7开发板adc。 硬件上:至少有一路带ADC输入功能的GPIO,能够用来连接光环境传感器; 有一路串口用来做 msh shell 终端; 软件上:串口驱动; ADC驱动。
准备工作: 根据硬件连接情况配置与 LED 灯连接的PIN号。 -硬件准备:正点原子stm32f407探索者开发板; -软件准备:rtt3.1.0、stm32f4xx-HAL BSP、env0.7.1。
实例代码:
#include 
#include
#include

#include
#include

#define LSENS_READ_TIMES 10 //定义光敏传感器读取次数,读这么多次,然后取平均值
#define LSENS_CHANNEL 5
#define LSENS_GET_PERIOD 50


/* 读取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;

while(1)
{
rt_uint8_t i;
rt_uint16_t val=0;

dev = rt_device_find("adc3");

rt_device_open(dev, RT_DEVICE_FLAG_RDONLY);


for(i = 0;i < LSENS_READ_TIMES;i++)
{
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);

实验步骤:
使用ENV配置串口,拷贝drv_adc驱动。然后添加test_adc.c文件到工程,修改相应代码,编译无错后下载到开发板。
结果:
程序是自动初始化运行,正常情况下光线强度为60左右,强光照射为95左右,手动遮挡光线为15左右。串口调试助手输出如下:`QYN1L759511~3@9Y8J91(F.png
手动遮挡:2E6$1ERJA6[V12ZDTEGK2%9.png
强光照射:DT@]I)(P9UW(NKLMLAA$WFF.png
遇到的问题: 1、官方库源文件没有ADC驱动; 2、移植好ADC驱动后,串口打印信息相反。
解决方法: 1、从学习营群众拷贝ADC驱动,添加#include "drv_adc.h"头文件,根据实际硬件修改ADC驱动。 2、将源测试代码中temp =(temp/40)改为temp = (100-(temp/40))即可。
下载附件[_adc.c]
下载附件[drv_adc.c]
下载附件[drv_adc.h]

查看更多

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

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览