打印
[MM32硬件]

【灵动微电子MM32F0121测评】3、 呼吸灯实验

[复制链接]
335|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本文目的通过调节PWM占空比调节LED亮度,起到呼吸灯效果

1、硬件情况
板载的LED1、LED2分别对应PB15、PB14,可通过复用设置为PWM1输出


2、软件部分
1)PWM1初始化
这部分内容可以参考LibSamples_MM32F0120_V1.13.4\Samples\LibSamples\TIM1\TIM1_PWM_Output
因为只有2个LED,所以保留了PWM1的2个通道CHANNEL2、3

void TIM1_Configure(void)
{
  RCC_ClocksTypeDef       RCC_Clocks;
    GPIO_InitTypeDef        GPIO_InitStruct;
    TIM_OCInitTypeDef       TIM_OCInitStruct;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    uint32_t                TIM_ClockFrequency = 0;
    uint32_t                HPRE = 0, PPRE2 = 0;

    uint32_t Channel2Pulse = 0, Channel3Pulse = 0;

    HPRE  = READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)  >> RCC_CFGR_HPRE_Pos;
    PPRE2 = READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos;

    RCC_GetClocksFreq(&RCC_Clocks);

    if (HPRE < 8)
    {
        if (PPRE2 < 4)
        {
            TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency;
        }
        else
        {
            TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency * 2;
        }
    }
    else
    {
        if (PPRE2 < 4)
        {
            TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency * 2;
        }
        else
        {
            TIM_ClockFrequency = RCC_Clocks.PCLK1_Frequency * 4;
        }
    }
               
                 /* Compute the value to be set in ARR regiter to generate signal frequency at 100 Khz */
    TimerPeriod = TIM_ClockFrequency / 100000;

    /* Compute CCR1 value to generate a duty cycle at 75% for channel 3 */
    Channel3Pulse = (uint32_t)900 * TimerPeriod / 1000;//LED2

    /* Compute CCR2 value to generate a duty cycle at 50% for channel 2 */
    Channel2Pulse = (uint32_t)500 * TimerPeriod / 1000;//LED1
               
               
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

    TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
    TIM_TimeBaseInitStruct.TIM_Prescaler         = 0;
    TIM_TimeBaseInitStruct.TIM_CounterMode       = TIM_CounterMode_Up;
    TIM_TimeBaseInitStruct.TIM_Period            = TimerPeriod;
    TIM_TimeBaseInitStruct.TIM_ClockDivision     = TIM_CKD_Div1;
    TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
               
               
                TIM_OCStructInit(&TIM_OCInitStruct);
    TIM_OCInitStruct.TIM_OCMode       = TIM_OCMode_PWM1;
    TIM_OCInitStruct.TIM_OutputState  = TIM_OutputState_Enable;
    TIM_OCInitStruct.TIM_Pulse        = 0;
    TIM_OCInitStruct.TIM_OCPolarity   = TIM_OCPolarity_High;
    TIM_OCInitStruct.TIM_OCIdleState  = TIM_OCIdleState_Set;

    TIM_OCInitStruct.TIM_Pulse = Channel3Pulse;
    TIM_OC3Init(TIM1, &TIM_OCInitStruct);

    TIM_OCInitStruct.TIM_Pulse = Channel2Pulse;
    TIM_OC2Init(TIM1, &TIM_OCInitStruct);               


                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
               
                GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,  GPIO_AF_6);   /* TIM1_CH3 */
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,  GPIO_AF_7);   /* TIM1_CH2 */
               
                GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    TIM_Cmd(TIM1, ENABLE);

    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}


呼吸灯实验:
通过TIM_SetCompare3、TIM_SetCompare2调节2个通道的占空比,调节范围0-1000对应0%-100%,由于LED是低电平有效,所以0%最亮,100%最暗
void Breathing_Light_Sample(void)
{
        int i=0;
        TIM1_Configure();
        while (1)
        {
                for(i=0;i<1000;i++)
                {
                        TIM_SetCompare3(TIM1,(uint32_t)i * TimerPeriod / 1000);
                        TIM_SetCompare2(TIM1,(uint32_t)i * TimerPeriod / 1000);
                        PLATFORM_DelayMS(1);
                }
                for(i=1000;i>0;i--)
                {
                        TIM_SetCompare3(TIM1,(uint32_t)i * TimerPeriod / 1000);
                        TIM_SetCompare2(TIM1,(uint32_t)i * TimerPeriod / 1000);
                        PLATFORM_DelayMS(1);
                }
        }
}


3、运行


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

133

帖子

3

粉丝