在中断中软件模拟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); //蓝灯亮

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值