> 技术文档 > PWMB-4个单端PWM输出

PWMB-4个单端PWM输出

U8WPWM

#define MAIN_Fosc        11059200L    //定义主时钟

#include    \"..\\..\\STC8Hxxx.h\"

/*************    功能说明    **************
先别修改程序, 直接下载\"pwm.hex\"测试, 下载时选择主频11.0592MHz.

PWM输出固定为推挽输出, 设置IO方式无效.

输出IO:
PWM5-->P1.7
PWM6-->P5.4
PWM7-->P3.3
PWM8-->P3.4
如有需要, 用户自行修改成别的IO输出.

******************************************/

void PWMB_config(void);

/******************** 主函数 **************************/
void main(void)
{
/*    //使用外部晶振时.
    P_SW2 |= 0x80;        //SFR enable   
    XOSCCR = 0xc0;                //启动外部晶振
    while (!(XOSCCR & 1));        //等待时钟稳定
    CLKDIV = 0x00;                //时钟不分频
    CKSEL  = 0x01;                //选择外部晶振
*/

    PWMB_config(); 

    while (1) 
    {
    
    }
}

void PWMB_config(void)
{
    P_SW2 |= 0x80;        //SFR enable   

    PWMB_PSCR = 0x0000;    // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
    PWMB_DTR  = 0;        // 死区时间配置,   n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,  
                        // 对PWMB没有意义  0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
    PWMB_ARR = 2400;    // 自动重装载寄存器,  控制PWM周期
    PWMB_CCER1  = 0;
    PWMB_CCER2  = 0;
    PWMB_SR1    = 0;
    PWMB_SR2    = 0;
    PWMB_ENO    = 0;        // IO输出允许,  bit6: ENO8P, bit4: ENO7P,  bit2: ENO6P,  bit0: ENO5P
    PWMB_PS     = 0;
    PWMB_IER    = 0;

    PWMB_CCMR1  = 0x68;        // 通道模式配置, PWM模式1, 预装载允许
    PWMB_CCR1   = 400;        // 比较值, 控制占空比(高电平时钟数)
    PWMB_CCER1 |= 0x01;        // 开启比较输出, 高电平有效
    PWMB_PS    |= 1;        // 选择IO, 0:选择P2.0, 1:选择P1.7, 2:选择P0.0, 3:选择P7.4,
    PWMB_ENO   |= 0x01;        // IO输出允许,  bit6: ENO8P, bit4: ENO7P,  bit2: ENO6P,  bit0: ENO5P
//    PWMB_IER   |= 0x02;        // 使能中断

    PWMB_CCMR2  = 0x68;        // 通道模式配置, PWM模式1, 预装载允许
    PWMB_CCR2   = 800;        // 比较值, 控制占空比(高电平时钟数)
    PWMB_CCER1 |= 0x10;        // 开启比较输出, 高电平有效
    PWMB_PS    |= (1<<2);    // 0:选择P2.1, 1:选择P5.4, 2:选择P0.1, 3:选择P7.5, 
    PWMB_ENO   |= 0x04;        // IO输出允许,  bit6: ENO8P, bit4: ENO7P,  bit2: ENO6P,  bit0: ENO5P
//    PWMB_IER   |= 0x04;        // 使能中断

    PWMB_CCMR3  = 0x68;        // 通道模式配置, PWM模式1, 预装载允许
    PWMB_CCR3   = 1200;        // 比较值, 控制占空比(高电平时钟数)
    PWMB_CCER2 |= 0x01;        // 开启比较输出, 高电平有效
    PWMB_PS    |= (1<<4);    // 选择IO, 0:选择P2.2, 1:选择P3.3, 2:选择P0.2, 3:选择P7.6, 
    PWMB_ENO   |= 0x10;        // IO输出允许,  bit6: ENO8P, bit4: ENO7P,  bit2: ENO6P,  bit0: ENO5P
//    PWMB_IER   |= 0x08;        // 使能中断

    PWMB_CCMR4  = 0x68;        // 通道模式配置, PWM模式1, 预装载允许
    PWMB_CCR4   = 1600;        // 比较值, 控制占空比(高电平时钟数)
    PWMB_CCER2 |= 0x10;        // 开启比较输出, 高电平有效
    PWMB_PS    |= (1<<6);    // 选择IO, 0:选择P2.3, 1:选择P3.4, 2:选择P0.3, 3:选择P7.7, 
    PWMB_ENO   |= 0x40;        // IO输出允许,  bit6: ENO8P, bit4: ENO7P,  bit2: ENO6P,  bit0: ENO5P
//    PWMB_IER   |= 0x10;        // 使能中断

    PWMB_EGR    = 0x01;        //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
    PWMB_BKR    = 0x80;        // 主输出使能 相当于总开关
    PWMB_CR1    = 0x81;        // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
//    PWMB_ISR_En = PWMB_IER;    //设置标志允许通道5~8中断处理
}

//    PWMB_PS   = (0<<6)+(0<<4)+(0<<2)+0;    //选择IO, 4项从高到低(从左到右)对应PWM8 PWM7 PWM6 PWM5
//  PWMB_PS    PWM8    PWM7    PWM6    PWM5
//    00       P2.3    P2.2    P2.1    P2.0
//    01       P3.4    P3.3    P5.4    P1.7
//    02       P0.3    P0.2    P0.1    P0.0
//    03       P7.7    P7.6    P7.5    P7.4

输出端口

PWMB_PS    |= 1;            P1.6 

PWMB_PS    |= (1<<2);    P1.7 

PWMB_PS    |= (1<<4);    P3.3

PWMB_PS    |= (1<<6);     P3.4