本帖最后由 740071911 于 2021-7-4 09:25 编辑
实现pwm呼吸灯效果
1、pwm功能添加,打开mcc,根据如下配置,设置pwm输出到RC1引脚。
2、代码编写。
因为pwm为12bit,所以每1ms增加1,到0~4095时间太长,观察效果不好,
改为1ms ,PWM占空比增加2,这样往复循环,4s左右的呼吸灯。
pwm函数介绍
PWM1_16BIT_SetSlice1Output1DutyCycleRegister();//设置占空比
定时器中断函数void TMR0_DefaultInterruptHandler(void){
// add your TMR0 interrupt custom code
// or set custom function using TMR0_SetInterruptHandler()
static unsigned short int tmr_cnt = 0;
static unsigned short int pwm_duty = 0;
static unsigned char dir = 0;
// clear the TMR0 interrupt flag
PIR3bits.TMR0IF = 0;
// Write to the Timer0 register
TMR0H = timer0ReloadVal16bit >> 8;
TMR0L = (uint8_t) timer0ReloadVal16bit;
if (dir == 0) //increase duty
{
pwm_duty+=2;
if (pwm_duty >= 4095)
{
pwm_duty =4095;
dir = 1;
}
}
else //decrease duty
{
pwm_duty -=2;
if (pwm_duty > 60000)
{
pwm_duty = 0;
dir = 0;
}
}
PWM1_16BIT_SetSlice1Output1DutyCycleRegister(pwm_duty);
PWM1_16BIT_LoadBufferRegisters();//使能占空比修改
if(++tmr_cnt >= 1000)
{
tmr_cnt = 0;
flag_1s = 1;
//IO_RC1_Toggle();
}
}
3、完整代码
pwm_led_03.X.rar
(516.03 KB)
|