ADC实验之光敏传感器

ADC实验之光敏传感器

硬件连接

 

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

 

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

 

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

 

软件配置(采用单通道单次转换的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 应该是采用了左对齐的方式。

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

准备材料: - Arduino开发板 - 光敏传感器 - 10K欧姆电阻 x 1 - LED灯 x 1 - 杜邦线若干 接线图: 1. 把光敏传感器一个引脚接到Arduino的A0口,另一个引脚连接到10K欧姆电阻的一端。 2. 把10K欧姆电阻的另一端接到地(GND)。 3. 把LED的负极通过一个220欧姆电阻连接到Arduino的数字口8。 4. 把LED的正极接到3.3V电源。 代码: int sensorPin = A0; // 光敏传感器连接到A0口 int ledPin = 8; // LED灯连接到数字口8 int threshold = 500; // 设置亮度阀值 void setup() { pinMode(ledPin, OUTPUT); // 设置数字口8输出 Serial.begin(9600); // 开启串口通信 } void loop() { int sensorValue = analogRead(sensorPin); // 读取光敏传感器的值 Serial.println(sensorValue); // 打印传感器值到串口 if (sensorValue > threshold) { // 如果传感器值高于阀值 digitalWrite(ledPin, HIGH); // 点亮LED灯 } else { digitalWrite(ledPin, LOW); // 关闭LED灯 } delay(100); // 延迟100毫秒后重新读取传感器数据 } 实验步骤: 1. 根据接线图连接电路。 2. 在Arduino IDE中打开上述代码。 3. 上传代码到Arduino开发板中。 4. 打开串口监视器(Serial Monitor)查看光敏传感器的值。 5. 用手遮挡传感器,观察LED灯的变化。 实验原理: 当光照射在光敏传感器上时,传感器的阻值会发生变化。通过将传感器连接到Arduino的模拟输入口,可以采集传感器的电压值,并使用ADC将其转换为数字信号。如果采集到的值高于预设的阈值,则点亮LED灯,否则关闭LED灯。这样可以实现根据亮度值来控制LED灯的开关。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥肥胖胖是太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值