mmmasdasd 发表于 2025-6-18 17:31:09

AI8H 互补pwm输出,关闭后无法再次启动

<p>AI8H 互补pwm输出,关闭后无法再次启动。</p>
<p>以下是我的代码。麻烦各位大佬帮忙看看</p>
<pre><code>void PWMA_config(void)
{
        // 22mhz
        P_SW2 |= 0x80;                //SFR enable   

        PWMA_PSCR = 0x007F;        // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
        PWMA_DTR= 0xff;                // 死区时间配置, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
                                                //                                0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
        PWMA_ARR = 3455;        // 自动重装载寄存器,控制PWM周期
        PWMA_CCER1= 0;
        PWMA_CCER2= 0;
        PWMA_SR1    = 0;
        PWMA_SR2    = 0;
        PWMA_ENO    = 0;
        PWMA_PS   = 0;
        PWMA_IER    = 0;
//        PWMA_ISR_En = 0;

        PWMA_CCMR1= 0x68;                // 通道模式配置, PWM模式1, 预装载允许
        PWMA_CCR1   = 1727;                // 比较值, 控制占空比(高电平时钟数)
        PWMA_CCER1 |= 0x0F;                // 开启比较输出, 高电平有效
        PWMA_PS    |= 0;                // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
        PWMA_ENO   |= 0x03;                // IO输出允许,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
        PWMA_OISR|= 0x00;
//        PWMA_IER   |= 0x02;                // 使能中断


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

</code></pre>
<pre><code>// 启动气泵
void airPump_Start(void)
{
    if(is_start == 0)
    {
        P_SW2 |= 0x80;                //SFR enable   
        PWMA_ENO   |= 0x03;
      is_start = 1;
      airPumpPwm_Cut = 0;         // 计数器清空
    }
}
// 停止气泵
void airPump_Stop(void)
{
        P_SW2 |= 0x80;                //SFR enable   
        PWMA_ENO   &amp;= ~0x03;
        airPump_Pin_P(0);
        airPump_Pin_N(0);
        is_start = 0;
}
</code></pre>

王昱顺 发表于 2025-6-18 18:12:23

有没有完整的工程?目前来看并没有问题,操作PWMx_ENO关闭输出和恢复输出是正确的
按道理讲目前的代码是可以正常关闭PWM和打开PWM输出的

梁工 发表于 2025-6-18 18:14:28

#define MAIN_Fosc                24000000L      //定义主时钟
#include      "STC8Hxxx.h"

/*************      功能说明      **************
先别修改程序, 直接下载"01C-PWMA-PWM间歇输出"里的"pwm.hex"测试, 下载时选择主频24MHz.
本例子PWM输出IO: P1.0、P1.1, 10KHz
PWM输出10ms、暂停10ms.
******************************************/




mmmasdasd 发表于 2025-6-19 09:09:14

感谢两位版主,问题已解决。



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

#include      "STC8Hxxx.h"


/*************      功能说明      **************

先别修改程序, 直接下载"01C-PWMA-PWM间歇输出"里的"pwm.hex"测试, 下载时选择主频22MHz.

本例子PWM输出IO: P1.0、P1.1, 50Hz 死区时间50us

PWM输出2s、暂停2s


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

void PWMA_config(void);
voiddelay_ms(u8 ms);

/******************** 主函数 **************************/
void main(void)
{

      P10 = 0;
      P1n_push_pull(Pin1+Pin0);

      PWMA_config();

      while (1)
      {
                PWMA_ENO = 0x03;      // IO输出允许,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
                delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);
                delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);
                PWMA_ENO &= ~0x03;      // IO输出允许,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
                P10 = 0;      P11 = 0;
                delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);
                delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);delay_ms(100);
      }
}

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

      PWMA_PSCR = 0x007F;      // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
      PWMA_DTR= 254;                // 死区时间配置, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
                                                //                              0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
      PWMA_ARR = 3455;      // 自动重装载寄存器,控制PWM周期
      PWMA_CCER1= 0;
      PWMA_CCER2= 0;
      PWMA_SR1    = 0;
      PWMA_SR2    = 0;
      PWMA_ENO    = 0;
      PWMA_PS   = 0;
      PWMA_IER    = 0;

      PWMA_CCMR1= 0x68;                // 通道模式配置, PWM模式1, 预装载允许
      PWMA_CCR1   = 1727;                // 比较值, 控制占空比(高电平时钟数)
      PWMA_CCER1 |= 0x0F;                // 开启比较输出, 高电平有效
      PWMA_PS    |= 0;                // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
      PWMA_ENO   |= 0x03;                // IO输出允许,bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
      PWMA_OISR|= 0x02;
      PWMA_CCMR1= 0x68;                // 通道模式配置, PWM模式1, 预装载允许

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

//      PWMA_PS   = (0<<6)+(0<<4)+(0<<2)+0;      //选择IO, 4项从高到低(从左到右)对应PWM1 PWM2 PWM3 PWM4, 0:选择P1.x, 1:选择P2.x, 2:选择P6.x,
//PWMA_PS    PWM4N PWM4P    PWM3N PWM3P    PWM2N PWM2P    PWM1N PWM1P
//    00       P1.7P1.6   P1.5P1.4   P1.3P1.2   P1.1P1.0
//    01       P2.7P2.6   P2.5P2.4   P2.3P2.2   P2.1P2.0
//    02       P6.7P6.6   P6.5P6.4   P6.3P6.2   P6.1P6.0
//    03       P3.3P3.4      --    --       --    --       --    --


//========================================================================
// 函数: voiddelay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
voiddelay_ms(u8 ms)
{
   u16 i;
         do
         {
               i = MAIN_Fosc / 10000;
                while(--i)      ;
   }while(--ms);
}


页: [1]
查看完整版本: AI8H 互补pwm输出,关闭后无法再次启动