AC6901A PWM输出

一、关于PWM波形全IO口映射的几种情况

  • AC6901A有四路多功能定时器 每一个定时器都能输出PWM波,由于timer0被系统占用,如果不使用timer2对红外进行解码的话,还有三路PWM波,否则只有2路。

  • 这四路定时器输出的PWM可以通过outputchannel映射到任意IO口,只需要对应的IO口设置成输出,开上下拉即可。

  • 排除系统定时器timer1,不适用红外功能下,如果其他三路全开的话,分为以下几种情况。
    AC6901A PWM输出_第1张图片AC6901A PWM输出_第2张图片

  • 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口。
AC6901A PWM输出_第3张图片

  • 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);
}

你可能感兴趣的:(蓝牙,AC6905A,定时器,PWM)