2401_87955887 2024-11-11 21:00 采纳率: 100%
浏览 20
已结题

单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码

img

img

img

img

img

img


片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码

  • 写回答

22条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-11-11 21:01
    关注
    
    #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 占空比
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(21条)

报告相同问题?

问题事件

  • 系统已结题 11月20日
  • 已采纳回答 11月12日
  • 创建了问题 11月11日

悬赏问题

  • ¥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单片机的交通灯系统,找改程序有点急