在中断中软件模拟PWN

在做一个项目,因为脑残没有把RGB接到硬件定时器引脚上,所以,只能软件模拟咯。

首先中断配置什么的就不详细说了

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    /* 设置TIM2CLK 为 72MHZ */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5 , ENABLE);
    /* 自动重装载寄存器周期的值(计数值) */
    TIM_TimeBaseStructure.TIM_Period=200;
    /* 累计 TIM_Period个频率后产生一个更新或者中断 */
    /* 时钟预分频数为72 */
    TIM_TimeBaseStructure.TIM_Prescaler= 71;
    /* 对外部时钟进行采样的时钟分频,这里没有用到 */
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
    TIM_ClearFlag(TIM5, TIM_FLAG_Update);
    TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
    TIM_Cmd(TIM5, ENABLE);                                                                      
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5 , DISABLE);      /*先关闭等待使用*/    
    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5 , ENABLE);  //开启使用

    NVIC_InitTypeDef NVIC_InitStructure; 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                                     
    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;   
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

上中断代码


  void TIM5_IRQHandler(void)
 {

    if ( TIM_GetITStatus(TIM5 , TIM_IT_Update) != RESET ) 
    {   
        TIM_ClearITPendingBit(TIM5 , TIM_FLAG_Update);           
    }   
static u16 pwm_tmpR = 0,pwm_tmpG=0,pwm_tmpB=0;
static u32 pwn_counterR=0,pwn_counterG=0,pwn_counterB=0;
static char RGBmode = 0;

    switch(RGBmode)  //切换模式
    {
        case 0:  //红灯亮 绿灯逐渐亮
            pwn_counterR=0x2fff;
            pwn_counterG++;
            if(pwn_counterG>0x2fff)
            {
                RGBmode++;
            }
            break;
        case 1://绿灯亮 红灯逐渐灭
            pwn_counterG=0x2fff;
            pwn_counterR--;
            if(pwn_counterR==0)
            {
                RGBmode++;
            }
            break;
        case 2://绿灯亮 蓝灯逐渐亮
            pwn_counterG=0x2fff;
            pwn_counterB++;
            if(pwn_counterB>0x2fff)
            {
                RGBmode++;
            }
            break;
        case 3://蓝灯亮  绿灯逐渐灭
            pwn_counterB=0x2fff;
            pwn_counterG--;
            if(pwn_counterG==0)
            {
                RGBmode++;
            }
            break;
        case 4:
            pwn_counterB=0x2fff;
            pwn_counterR++;
            if(pwn_counterR>0x2fff)
            {
                RGBmode++;
            }
            break;
        case 5:
            pwn_counterR=0x2fff;
            pwn_counterB--;
            if(pwn_counterB==0)
            {
            //  RGBmode++;
                RGBmode=0;
            }
            break;
        default :
            pwn_counterG=0;
            pwn_counterR=0;
            pwn_counterB=0;
            RGBmode=0;
            break;

    }

    pwm_tmpR+=10;
    pwm_tmpG+=10;
    pwm_tmpB+=10;
    pwm_tmpR&=0xff;
    pwm_tmpG&=0xff;
    pwm_tmpB&=0xff;

    if(pwm_tmpR < pwn_counterR>>5)  //红灯占空比pwn_counterR
    {
        change_LED_value(LED_R,1);
    }
    else
    {
        change_LED_value(LED_R,0);
    }
    if(pwm_tmpG < pwn_counterG>>5)
    {
        change_LED_value(LED_G,1);
    }
    else
    {
        change_LED_value(LED_G,0);
    }
    if(pwm_tmpB < pwn_counterB>>5)
    {
        change_LED_value(LED_B,1);
    }
    else
    {
        change_LED_value(LED_B,0);
    }
 }

说明

change_LED_value(LED_B,0); //蓝灯灭
change_LED_value(LED_B,1); //蓝灯亮

### 电机 PWM 风扇控制电路设计 PWM(脉宽调制)是一种通过调节占空比来实现对设备功率精确控制的技术。对于服务器风扇而言,其核心功能在于利用 PWM 波形调整直流电机的速度。以下是关于如何构建一个典型的 PWM 控制电路用于驱动和调控风扇速度的设计说明。 #### 基本原理 PWM 技术的核心是通过改变信号的占空比来影响平均输出电压,从而达到控制负载的目的。具体到服务器风扇的应用场景中,PWM 的工作方式如下: - 当输入至风扇的 PWM 信号处于高电平时,晶体管 Q1 导通,形成完整的电流路径,使得电机运行[^2]。 - 而当 PWM 输入变为低电平时,晶体管 Q1 截止,切断了流经电机的电流回路,从而使电机停止运转[^2]。 这种周期性的开关动作能够有效降低施加于电机上的实际功耗,并最终反映为转速的变化。 #### 典型硬件组成 为了完成上述过程,通常需要以下几个主要元件构成整个控制系统: 1. **微控制器单元 (MCU)** 或专用 IC 来生成精准稳定的 PWM 输出; 2. **MOSFET 或 BJT 晶体管**作为电子开关器件负责切换大电流流向; 3. **电阻网络**用来设定基准电压以及保护其他敏感组件免受过高反向电动势损害; 4. 还需考虑加入必要的滤波电容器以减少电磁干扰并稳定供电质量。 下面给出了一段伪代码表示如何设置 MCU 中定时器模块生成特定频率与占空比的 PWM 波: ```c void setup_pwm(int frequency, int duty_cycle){ // 设置寄存器配置指定频率下的计数值 configure_timer_registers(frequency); // 计算匹配值基于所需百分比占用率 calculate_compare_value(duty_cycle); enable_interrupts(); // 开启中断允许标志位以便响应溢出事件触发更新操作 } ``` 以上片段仅作示意用途,在真实项目开发过程中还需要仔细查阅所选芯片的数据手册了解确切参数范围及其相互关系。 #### 实际应用注意事项 尽管理论模型简单明了,但在实践当中仍有许多细节需要注意才能确保长期可靠的工作表现: - 正确选择合适的 MOSFET 类型保证足够的耐压能力和快速切换特性同时兼顾效率考量; - 对地平面布局合理规划避免噪声串扰影响模拟部分正常运作; - 定期监测温度变化防止过热损坏关键部件. 综上所述,PWM技术不仅提供了灵活便捷的方法去管理现代电子产品内部散热需求同时也促进了节能降耗目标达成.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值