AB536X 支持 3 个定时器(Timer3,Timer4,Timer5,)PWM 输出,每个定时器支持 3 路 PWM 输出 ,分别是 PWM0 ,PWM1,PWM2,其中每个定时器支持 3 路周期相同,可设置不同占空比的 PWM 同时输出。
AB536X 每组 timer定时器 对应 PWM IO 说明:
Timer3:
G1: PWM0->PB0 PWM1->PB1 PWM2->PB2
G2: PWM0->PB3 PWM1->PB4 PWM2->PB5
G3: PWM0->PF2 PWM1->PA3 PWM2->PA4
G4: PWM0->PE0
Timer4:
G1: PWM0->PE5 PWM1->PE6 PWM2->PE7
G2: PWM1->PF1 PWM2->PF1
Timer5:
G1: PWM0->PA5 PWM1->PA6 PWM2->PA7
FUNCMCON2 对应 PWM 的映射:
timer3->8Bit timer4->12Bit timer5->16Bit
G1->1 G2->2 …
例如:
Timer3 的 G1 组:
FUNCMCON2 = (1<<8);
Timer3 的 G3 组:
FUNCMCON2 = (3<<8);
Timer4 的 G1 组:
FUNCMCON2 = (1<<12);
备注:
查询 AB536X 每组 timer 对应 PWM IO需要查阅芯片datasheet,以上数据查找自《AB5362B DataSheet》
查找FUNCMCON2 寄存器功能《AB536X UserManual》
使用出现问题请复查以上提及的文档。
SDK 默认定时器用途:
timer0 : 系统时钟使用
timer1: (可选) ledseg_ajust. 7 脚屏的时候使用 timer1_irq_init
timer3: (可选) 软件红外解码使用
但6x系列芯片的定时器没有被占用,可以放心使用
例程:下面以 timer4 为例
初始化:
#define PWM_MAX 4001
void pwm_init(void)
{
//PWM2-T4-G1 PE7
//PWM1-T4-G1 PE6
//PWM0-T4-G1 PE5
GPIOEDIR &= ~(BIT(7)|BIT(6)|BIT(5)) ; //DIR OUT
GPIOEDE |= (BIT(7)|BIT(6)|BIT(5)) ; //数字 IO 口要设置上.
GPIOEFEN |= (BIT(7)|BIT(6)|BIT(5)); //function io enable
FUNCMCON2 = (1 << 12); // TIMER4的G1 pwm map to G1 (PE5/6/7)timer5->16Bit timer4->12Bit timer3->8Bit
TMR4CON = 0x00; //时钟源默认为系统时钟 24M
TMR4CNT = 0;
TMR4PR = PWM_MAX + 1; //例如为 24M 时, 频率为 24M/(12000*4) = 500HZ, 即周期为0.002S. //U32
TMR4DUTY0 = 0 ; //u16 //25% 负占空比 PE1 //注意 PR >= DUTY //DUTY ==PR, 全高. -1 (也就是 0xFFFF)时, 全低, 其他值表示"负占空比"
TMR4DUTY1 = 0; //u16 //50% 负占空比 PB3
TMR4DUTY2 = 0; //
TMR4CON |=(BIT(9) | BIT(10) | BIT(11)); //timer4 pwm0, pwm1, pwm2 enable
TMR4CON |= BIT(0); //Timer enable (defualt work in counter mode)
}
扫描:
呼吸灯扫描放5ms中断,用作频谱灯需要放1ms中断,例程是简单的呼吸灯效果。主要是调整占空比 duty = TMR4DUTY0 /TMR4PR ;
AT(.com_text.rgb)
void rgb_breath_scan(void){ // 5ms 放5ms中断
static u16 cnt = 0;
static u8 dir = 0;
if(dir==0){
if(cnt<PWM_MAX){
cnt+=7;
}else{
dir =1;
}
}else if(dir==1){
if(cnt>7){
cnt-=7;
}else{
dir =0;
}
}
TMR4DUTY0 = cnt ;
TMR4DUTY1 = cnt;
TMR4DUTY2 = cnt;
}