片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
22条回答 默认 最新
关注 #include "stm32f10x.h" void GPIO_Config(void); void ADC_Config(void); void PWM_Config(void); uint16_t ADC_Read(void); void Set_PWM_DutyCycle(uint32_t dutyCycle); int main(void) { // 配置 GPIO, ADC, PWM GPIO_Config(); ADC_Config(); PWM_Config(); while (1) { // 读取光敏电阻的值 uint16_t adcValue = ADC_Read(); // 将 ADC 值转换为 PWM 占空比 // 假设 ADC 的值范围是 0-4095,PWM 的值范围是 0-1000 uint32_t pwmValue = (4095 - adcValue) * 1000 / 4095; // 光强越大,PWM 值越小 // 限制 PWM 值在 0 到 1000 之间 if (pwmValue < 0) pwmValue = 0; if (pwmValue > 1000) pwmValue = 1000; // 设置 PWM 占空比 Set_PWM_DutyCycle(pwmValue); // 简单的延时 for (volatile int i = 0; i < 10000; i++); } } void GPIO_Config(void) { // 使能 GPIO 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 配置 ADC 引脚 PA0 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PA0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置 PWM 引脚 PB0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PB0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } void ADC_Config(void) { // 使能 ADC 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // ADC 初始化 ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // 配置 ADC 通道 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // 启动 ADC ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1, ENABLE); } uint16_t ADC_Read(void) { // 等待转换完成 while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); return ADC_GetConversionValue(ADC1); } void PWM_Config(void) { // 使能 TIM 时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 配置 PWM TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 1000 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 72MHz / 72 = 1MHz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // PWM 模式配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为 0 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); // 启动定时器 TIM_Cmd(TIM2, ENABLE); } void Set_PWM_DutyCycle(uint32_t dutyCycle) { TIM_SetCompare1(TIM2, dutyCycle); // 设置 PWM 占空比 }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 微信小程序:渲染收货地址时页面不显示
- ¥20 win7 64位DirectShow提示初始化失败如何解决?
- ¥20 小规模孤立词识别系统设计
- ¥15 关于Java对接海康威视车牌识别一体机SDK是否需要固定外网的IP?
- ¥15 Linux扩容时,格式化卡住了:vgdispaly查看卷组信息,没有输出
- ¥18 关于#ubuntu#的问题:使用背景-工作职责内有七八台ubuntu系统的电脑,平时需要互相调取资料,想实现把这几台电脑用交换机组成一个局域网,来实现指定文件夹的互相调取和写入
- ¥20 求一个简易射频信号综测仪
- ¥15 esp8266 tally灯 接收端改为发射端
- ¥30 Labview代码调用access 数据库,相同代码其中一个调用不出来是为什么
- ¥15 基于51单片机的交通灯系统,找改程序有点急