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 應該是采用了左對齊的方式,
你看一下手冊把配置暫存器的相應位設定改成右對齊應該就是你想要的了

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/151925.html
標籤:其他
