ADC实验之光敏传感器

ADC实验之光敏传感器

硬件连接

ADC实验之光敏传感器ADC实验之光敏传感器

 

我们可以测量A的电位,进而测量光的强度,光强与A点电压的对应关系如下:

ADC实验之光敏传感器

 

电流反应的光敏二极管的导通状态,光强与电流对应关系如下:

ADC实验之光敏传感器

 

因此,我们可以得出ADC读取的电压值的数字量(12位)与光照强度的关系:

ADC实验之光敏传感器

 

软件配置(采用单通道单次转换的ADC)

Main.c

#include "stm32f10x.h"
#include "delay.h"
#include "lcd.h"
#include "usart.h"
#include "LightSensor.h"

int main()
{
u8 LightSensor = 0;

delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LightSensor_InitConfig();
uart_init(115200);
LCD_Init();

while(1)
{
LightSensor = DigitalConvLight();
printf("LightSensor = %d\n",LightSensor);
LCD_ShowNum(10,10,LightSensor,4,16);
delay_ms(50);
}
}

 

LightSensor.c

#include "LightSensor.h"
#include "stm32f10x.h"
#include "delay.h"

void LightSensor_InitConfig()
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3|RCC_APB2Periph_GPIOF,ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF,&GPIO_InitStructure);

ADC_DeInit(ADC3); // ADC3复位

RCC_ADCCLKConfig(RCC_PCLK2_Div6); // ADC正常工作的频率<=14MHz

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC3,&ADC_InitStructure); // 配置ADC3的属性

ADC_Cmd(ADC3,ENABLE); // 配置完ADC3的属性就使能ADC3

ADC_ResetCalibration(ADC3);

while(ADC_GetResetCalibrationStatus(ADC3) == SET); // 当函数返回为SET说明还在复位校准当中,当退出复位校准后函数返回RESET

ADC_StartCalibration(ADC3);

while(ADC_GetCalibrationStatus(ADC3) == SET); // 当函数返回为SET说明还在启动校准当中,当校准完成后函数返回RESET
}

u16 GetSingleADCValue()
{
u16 temp = 0;

ADC_RegularChannelConfig(ADC3,ADC_Channel_6,1,ADC_SampleTime_28Cycles5); // 配置ADC3_CH6规则通道的属性
ADC_SoftwareStartConvCmd(ADC3,ENABLE); // ADC3的规则通道开始转换

while(ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC) == RESET); // 等待ADC3_CH6规则通道转换完成
temp = ADC_GetConversionValue(ADC3);
temp = temp>=4000?4000:temp;

return temp;
}

u8 DigitalConvLight()
{
u8 i = 0;
float temp = 0;

while(i<=4)
{
temp += GetSingleADCValue();
i++;
}
temp = 100*(1 - temp/5/4000);

return (u8)temp;
}

 

LightSensor.h

#ifndef _LIGHT_SENSOR_H
#define _LIGHT_SENSOR_H

#include "sys.h"

void LightSensor_InitConfig();
u16 GetSingleADCValue();
u8 DigitalConvLight();

#endif

 

疑难解答

为什么ADC转换的数值会大于4096?
STM32的ADC 的转换结果可以左对齐或右对齐,结果大于4095 应该是采用了左对齐的方式。

你看一下手册把配置寄存器的相应位设定改成右对齐应该就是你想要的了

ADC实验之光敏传感器

原创:https://www.panoramacn.com
源码网提供WordPress源码,帝国CMS源码discuz源码,微信小程序,小说源码,杰奇源码,thinkphp源码,ecshop模板源码,微擎模板源码,dede源码,织梦源码等。

专业搭建小说网站,小说程序,杰奇系列,微信小说系列,app系列小说

ADC实验之光敏传感器

免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

您必须遵守我们的协议,如果您下载了该资源行为将被视为对《免责声明》全部内容的认可-> 联系客服 投诉资源
www.panoramacn.com资源全部来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:2640602276@qq.com
未经允许不得转载:书荒源码源码网每日更新网站源码模板! » ADC实验之光敏传感器
关注我们小说电影免费看
关注我们,获取更多的全网素材资源,有趣有料!
120000+人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

您的打赏就是我分享的动力!

支付宝扫一扫打赏

微信扫一扫打赏