一、关于PWM波形全IO口映射的几种情况
-
AC6901A有四路多功能定时器 每一个定时器都能输出PWM波,由于timer0被系统占用,如果不使用timer2对红外进行解码的话,还有三路PWM波,否则只有2路。
-
这四路定时器输出的PWM可以通过outputchannel映射到任意IO口,只需要对应的IO口设置成输出,开上下拉即可。
-
排除系统定时器timer1,不适用红外功能下,如果其他三路全开的话,分为以下几种情况。
-
1、同时开定时器1和定时器2输出PWM波
端口输出的PWM波来源 | DIE(BIT) |
---|---|
定时器1 | 0 |
定时器2 | 1 |
- 2、同时开定时器1和定时器3输出PWM波
端口输出的PWM波来源 | DIE(BIT) |
---|---|
定时器1 | 0 |
定时器3 | 1 |
- 3、同时开定时器2和定时器3输出PWM波
端口输出的PWM波来源 | DIE(BIT) |
---|---|
失效 | |
定时器3 | 1 |
该种情况下PWM2只能通过固定IO口输出,输出到PB3。或者让PWM2映射到任意IO口,PWM3通过固定IO口输出,但是PWM3在AC6901A上没有固定的IO口,一般我们让PWM3映射到任意IO口。
- 4、同时开定时器1、定时器2定时器3输出PWM波
端口输出的PWM波来源 | DIE(BIT) |
---|---|
定时器1 | 0 |
定时器3 | 1 |
该种情况下PWM2只能通过IO口输出,寄输出到PB3
二、PWM初始化代码
static void set_timer1_pwm(u32 fre,u8 duty) //50%
{
SFR(JL_IOMAP->CON1,8,3,3);
JL_TIMER1->CON = 0x0000;
JL_TIMER1->PRD = OSC_Hz/(4*fre);
JL_TIMER1->PWM = (JL_TIMER1->PRD*duty)/100;
JL_TIMER1->CON = (1<<4) | (1<<8)| (1<<0) |(2<<2);
JL_PORTA->PU |= BIT(9);
JL_PORTA->PD |= BIT(9);
JL_PORTA->DIR &= ~BIT(9);
JL_PORTA->OUT &= ~BIT(9);
JL_PORTA->DIE &= ~BIT(9);
}
static void set_timer2_pwm(u32 fre,u8 duty) //80%
{
SFR(JL_IOMAP->CON1,11,3,2);
JL_TIMER2->CON = 0x0000;
JL_TIMER2->PRD = OSC_Hz/(4*fre);
JL_TIMER2->PWM = (JL_TIMER2->PRD*duty)/100;
JL_TIMER2->CON = (1<<4) | (1<<8)| (1<<0) |(2<<2);
JL_PORTA->PU |= BIT(3);
JL_PORTA->PD |= BIT(3);
JL_PORTA->DIR &= ~BIT(3);
JL_PORTA->OUT |= BIT(3);
JL_PORTA->DIE |= BIT(3);
}
static void set_timer3_pwm(u32 fre,u8 duty) //20%
{
SFR(JL_IOMAP->CON1,11,3,3);
JL_TIMER3->CON = 0x0000;
JL_TIMER3->PRD = OSC_Hz/(4*fre);
JL_TIMER3->PWM = (JL_TIMER3->PRD*duty)/100;
JL_TIMER3->CON = (1<<4) | (1<<8)| (1<<0) |(2<<2);
JL_PORTA->PU |= BIT(2);
JL_PORTA->PD |= BIT(2);
JL_PORTA->DIR &= ~BIT(2);
JL_PORTA->OUT &= ~BIT(2);
JL_PORTA->DIE |= BIT(2);
}