本文目的通过调节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、运行
|