stm32如何用光敏电阻控制led亮暗的代码
时间: 2023-07-30 19:08:14 浏览: 277
以下是一个简单的示例代码,使用光敏电阻控制LED亮度:
```c
#include "stm32f10x.h"
#define LED_PIN GPIO_Pin_13
#define LED_PORT GPIOC
#define PHOTO_PIN GPIO_Pin_0
#define PHOTO_PORT GPIOA
void ADC1_Init(void);
void GPIO_Init(void);
int main(void)
{
GPIO_Init();
ADC1_Init();
while (1)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
uint16_t adc_val = ADC_GetConversionValue(ADC1);
uint8_t led_val = adc_val >> 4;
TIM_SetCompare4(TIM3, led_val);
}
}
void ADC1_Init(void)
{
RCC_ADCCLKConfig(RCC_PCLK2_Div2);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_InitTypeDef adc_init;
ADC_StructInit(&adc_init);
adc_init.ADC_ContinuousConvMode = DISABLE;
adc_init.ADC_DataAlign = ADC_DataAlign_Right;
adc_init.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
adc_init.ADC_Mode = ADC_Mode_Independent;
adc_init.ADC_NbrOfChannel = 1;
adc_init.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1, &adc_init);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1));
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
}
void GPIO_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpio_init;
GPIO_StructInit(&gpio_init);
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
gpio_init.GPIO_Pin = LED_PIN;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PORT, &gpio_init);
gpio_init.GPIO_Mode = GPIO_Mode_AIN;
gpio_init.GPIO_Pin = PHOTO_PIN;
GPIO_Init(PHOTO_PORT, &gpio_init);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitTypeDef tim_init;
TIM_TimeBaseStructInit(&tim_init);
tim_init.TIM_CounterMode = TIM_CounterMode_Up;
tim_init.TIM_Period = 255;
tim_init.TIM_Prescaler = SystemCoreClock / 1000000 - 1;
TIM_TimeBaseInit(TIM3, &tim_init);
TIM_OCInitTypeDef tim_oc_init;
TIM_OCStructInit(&tim_oc_init);
tim_oc_init.TIM_OCMode = TIM_OCMode_PWM1;
tim_oc_init.TIM_OutputState = TIM_OutputState_Enable;
tim_oc_init.TIM_Pulse = 0;
TIM_OC4Init(TIM3, &tim_oc_init);
TIM_Cmd(TIM3, ENABLE);
}
```
在这个例子中,我们使用了ADC1和TIM3。ADC1用于读取光敏电阻的值,TIM3用于控制LED的亮度。我们将光敏电阻连接到PA0引脚,LED连接到PC13引脚。
在主循环中,我们首先启动ADC转换,然后等待转换完成。一旦转换完成,我们将ADC值右移4位,然后用它来设置TIM3的PWM占空比。ADC值的范围为0到4095,右移4位后为0到255,这正好是TIM3的PWM占空比的范围。
在初始化函数中,我们首先初始化ADC1。我们将ADC1配置为单通道单次转换模式,使用PA0作为输入通道,采样时间为239.5个时钟周期。然后我们初始化TIM3。我们将TIM3配置为PWM输出模式,使用PC13作为PWM输出引脚,使用SystemCoreClock / 1000000 - 1作为预分频器和255作为周期。注意,我们使用了TIM3的通道4来控制PWM输出,因此我们使用了TIM_OC4Init函数来初始化TIM3的通道4。
注意,这只是一个简单的示例代码,可能需要根据您的硬件和需求进行修改。