QQ624353765 发表于 2023-7-23 19:08:01

请STC8H的PWM6通道P54引脚输出PWM配置代码

请STC8H的PWM6通道P54引脚输出PWM配置代码

PWM功能太多了,看的我头都晕了
谁帮我配一个PWM6通道在P54输出
代码越少越好

梁工 发表于 2023-7-24 21:25:24

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_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_EGR    = 0x01;                //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
        PWMB_BKR    = 0x80;                // 主输出使能 相当于总开关
        PWMB_CR1    = 0x81;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
}

//        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

lclbf 发表于 2024-10-29 08:59:18

梁工 发表于 2023-7-24 21:25
void PWMB_config(void)
{
        P_SW2 |= 0x80;                //SFR enable   


方便提供一个程序配置步骤吗?比如1,----。2,----。3,-----

梁工 发表于 2024-10-29 09:09:00

lclbf 发表于 2024-10-29 08:59
方便提供一个程序配置步骤吗?比如1,----。2,----。3,-----

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_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:         PWMB_CCMR2= 0x68;                // 通道模式配置, PWM模式1, 预装载允许
ENO6P,bit0: ENO5P
//      PWMB_IER   |= 0x04;                // 使能中断

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

//      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

ubahjuji 发表于 2024-12-9 21:08:53

<p><img src="data/attachment/forum/202412/09/210257i6uhj15cgj5zssjh.jpg" alt="微信图片_20241209210248.jpg" title="微信图片_20241209210248.jpg" /></p>
<p>有谁知道这是为什么嘛?中间是PWM 生成的方波脉冲群,然后外面的是定时器生成的PWM,为什么两者的电压会不一样,不在同一条直线上,也就是说中间的电压比定时器生成的要高。我想要的结果是,定时器在一个周期内,低电平有效,然后在低电平时,有一个脉冲群,电压要相等的</p>

梁工 发表于 2024-12-10 22:15:00

ubahjuji 发表于 2024-12-9 21:08
有谁知道这是为什么嘛?中间是PWM 生成的方波脉冲群,然后外面的是定时器生成的PWM,为什么两者的电压会不 ...

IO要设置为推挽输出。
页: [1]
查看完整版本: 请STC8H的PWM6通道P54引脚输出PWM配置代码