×
嵌入式 > 技术百科 > 详情

STM8L101F3P6 TIM4 实现呼吸灯效果(1)

发布时间:2024-05-18 发布时间:
|

要实现呼吸灯效果,主要就是确定 频率,两个方面的频率:①以多快的频率开关LED,②以多块的频率 修改脉冲宽度。我们的例子的频率是:产生100us 中断 来开关LED, 每10ms 修改一次 脉冲宽度,100个等级,1s的频率呼吸。


有两种实现方式:直接PWM 输出 另一种 是用定时器 模拟PWM 优点是任意引脚都可以实现。这里先用后一种方式实现。


主要代码:


#define LED_GPIO_PORT GPIOD

#define LED_GPIO_PINS GPIO_Pin_0

#define led_on GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PINS)

#define led_off GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PINS)


void led_pwm_init(void)

{

GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Mode_Out_PP_Low_Slow);//初始化LED,GPD0低速推挽输出

CLK_PeripheralClockConfig (CLK_Peripheral_TIM4,ENABLE); //使能外设时钟,STM8L外设时钟默认关闭,使用前需使能

TIM4_TimeBaseInit(TIM4_Prescaler_2, 0x64);//16M/8/2=1M,0xff=255,100*(1/1M)=100uS,大约61次中断是1S

// Clear TIM4 update flag

TIM4_ClearFlag(TIM4_FLAG_Update);//向上清除溢出标志

//Enable update interrupt

TIM4_ITConfig(TIM4_IT_Update, ENABLE);//向上溢出中断使能,中断向量号25

TIM4_Cmd(ENABLE);//TIM4使能

enableInterrupts();//开启中断总开关

}


/**

* @brief Timer4 Update/Overflow Interrupt routine.

* @param None

* @retval None

*/

INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 25)

{

/* In order to detect unexpected events during development,

it is recommended to set a breakpoint on the following instruction.

*/

/* i++;

if(i==61)

{

GPIO_ToggleBits(GPIOD, GPIO_Pin_0);//翻转GPD0输出状态

i=0;

}*/

if((++timenum)>=100)//每10mS调整一下led的占空比 100us中断;

{

time_second_count++;

timenum=0;

if(leddirection==0) //如果是渐亮方向变化,则占空比递增

{

ledpwm++;

if (ledpwm > pwm_max)

{

ledpwm = pwm_max;

// leddirection =1;

}

}


if(leddirection==1) //如果是渐暗方向变化,则占空比递减

{

ledpwm--;

if(ledpwm<=pwm_min)

{

ledpwm=pwm_min;

//leddirection=0;

}

}


ledpwm_temp=ledpwm;//获取LED的占空比

}

if(ledpwm_temp>0)//占空比大于0,则点亮led,否则熄灭led

{

//led_on;

led_off;

ledpwm_temp--; //? 就是来控制亮的时间

}

else

{

led_on;

//led_off;

}

TIM4_ClearITPendingBit(TIM4_IT_Update);

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实时控制.安全.如何加速实现未来工厂落地?