找回密码
 立即注册
查看: 443|回复: 6

STC8H8K64U-用作 PWMA-1P1N输出互补时 1N 有多余的脉冲输出|已解决

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-06 16:16:33

3

主题

5

回帖

53

积分

注册会员

积分
53
发表于 2024-6-17 10:58:34 | 显示全部楼层 |阅读模式
本帖最后由 STC8H8K64U 于 2024-6-17 14:29 编辑

STC8H8K64U-用作 PWMA-1P1N输出互补时 1N 有多余的脉冲输出,  输出方式 是由按键控制。
当检测到按键1按下时 调用 “AC_PWMA_1P1N_Out_ON” 函数 开启 PWMA-1P1N输出互补50Hz的PWM波形。


当检测到按键2按下时 调用 “AC_PWMA_1P1N_Out_OFF” 函数 关闭 PWMA-1P1N 输出。

有没有 人指点下是怎么回事


PWMA-1P1N 用 LA1010 逻辑分析仪采样 图 2024-06-17_10-15-50





程序如下



void AC_PWMA_1P1N_Out_OFF(void)  // AC_PWMA_PN 输出 关闭
{
                        Power.AC.PWMA_PN_Out_Status = 0;                // PWMA_PN 输出状态: 0 PWM 没有输出;1 PWM 在输出状态。
        
                        PWMA_IER  = 0;                        //   使能中断    1:允许更新中断。
                        PWMA_EGR  = 0;                //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
                        PWMA_BKR  = 0;                // 主输出使能 相当于总开关        
                        PWMA_SR1  = 0;
        
                        PWMA_CCER1  = 0;
                        PWMA_CCER2  = 0;

                        PWMA_SR2    = 0;
                        PWMA_ENO    = 0;
                        PWMA_PS     = 0;

        
        //                NOP10();
                        P20 = 0;                        // P20   PWMA_1P 引脚
        //                NOP10();
                        P21 = 0;                        // P21   PWMA_1N 引脚
        //                NOP10();
                        P2_MODE_OUT_PP(GPIO_Pin_0);                        // P20   PWMA_1P 引脚
        //                NOP10();
                        P2_MODE_OUT_PP(GPIO_Pin_1);                        // P21   PWMA_1N 引脚
        //                NOP10();
                        P20 = 0;                        // P20   PWMA_1P 引脚
        //                NOP10();
                        P21 = 0;                        // P21   PWMA_1N 引脚

}

void AC_PWMA_1P1N_Out_ON(void)  // AC_PWMA_PN 输出 打开
{
                        Power.AC.PWMA_PN_Out_Status = 1;                // PWMA_PN 输出状态: 0 PWM 没有输出;1 PWM 在输出状态。

        //                NOP10();
                        P20 = 0;                        // P20   PWMA_1P 引脚
        //                NOP10();
                        P21 = 0;        
        //                NOP10();
                        P2_MODE_OUT_PP(GPIO_Pin_0);                        // P20   PWMA_1P 引脚
        //                NOP10();
                        P2_MODE_OUT_PP(GPIO_Pin_1);                        // P21   PWMA_1N 引脚
        //                NOP10();
                        P20 = 0;                        // P20   PWMA_1N 引脚
        //                NOP10();
                        P21 = 0;
        //                NOP10();
        
                        P_SW2 |= 0x80;                //SFR enable   使能访问 XFR
                        
                        PWMA_PSCR = 99;        // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
                        PWMA_DTR  = 255;                // 死区时间配置, 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 = 4799;        // 自动重装载寄存器,  控制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   = 2400;                        // 比较值, 控制占空比(高电平时钟数)
                        PWMA_CCER1 |= 0x05;                        // 开启比较输出, 高电平有效
                        
                        PWMA_PS    &= 0xFC;                        // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
                        PWMA_PS    |= 0x01;                        // 选择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_IER   |= 0x02;                        //   使能中断    1:允许更新中断。
                        
                        
                        PWMA_SR1  = 0;
                        PWMA_BKR    = 0x80;                // 主输出使能 相当于总开关
                        PWMA_CR1    = 0x81;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
                        PWMA_EGR    = 0x01;                //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
                //        PWMA_ISR_En = PWMA_IER;        //设置标志允许通道1~4中断处理

}



void PWMA_ISR() interrupt 26
{
                if(PWMA_SR1 & 0X02)
                {
                                PWMA_SR1 &=~0X02;
                        

                }
}

箭头处有多余的脉冲

箭头处有多余的脉冲

PWMA-1P1N 用 LA1010 逻辑分析仪采样 图 2024-06-17_10-15-50.kvdat

9.98 KB, 下载次数: 71

逻辑分析仪采样波形

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6845

积分

论坛元老

积分
6845
发表于 2024-6-17 13:40:15 | 显示全部楼层
开启输出前将计数器清除一下:
截图202406171339418775.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-06 16:16:33

3

主题

5

回帖

53

积分

注册会员

积分
53
发表于 2024-6-17 13:49:18 | 显示全部楼层
本帖最后由 yzjyh 于 2024-6-17 13:55 编辑
乘风*** 发表于 2024-6-17 13:40
开启输出前将计数器清除一下:

试过了  正确      谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:52
  • 最近打卡:2025-05-03 23:41:15

73

主题

5884

回帖

1万

积分

超级版主

积分
12085
发表于 2024-6-17 14:03:35 | 显示全部楼层
能否发一个放大的波形图?我没看出有“多余的脉冲”,请结合放大波形说一下详细的情况。
关闭时,可以先PWMA_ENO = 0; 再做其余操作。
打开时,先初始化好,再允许PWMA_ENO输出。
一旦PWMA_ENO = 0; 立刻就会没有输出,不会有任何的多余脉冲。
其实关闭输出时可以直接PWMA_ENO = 0;  不用其它操作。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-06 16:16:33

3

主题

5

回帖

53

积分

注册会员

积分
53
发表于 2024-6-17 14:24:30 | 显示全部楼层
梁*** 发表于 2024-6-17 14:03
能否发一个放大的波形图?我没看出有“多余的脉冲”,请结合放大波形说一下详细的情况。
关闭时,可以先PWM ...

按照 你的方法试了下,也可以,按照 “乘风***” 提出的 清楚计数器 的方法也可以。

下图是 没清计数器出来的 波形

下图是 没清计数器出来的 波形

下图是 没清计数器出来的 波形

点评

由于PWM是工作于PWM时钟的,PWM计数器子啊启动前如果有值,则就有一定概率出现你刚允许输出时,此时N或P已经在输出了,一旦允许输出,就看到一个波形。清除计数器再启动,则就不会有这个同步的问题。  详情 回复 发表于 2024-6-17 14:58
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:52
  • 最近打卡:2025-05-03 23:41:15

73

主题

5884

回帖

1万

积分

超级版主

积分
12085
发表于 2024-6-17 14:58:11 | 显示全部楼层
yzj*** 发表于 2024-6-17 14:24
按照 你的方法试了下,也可以,按照 “乘风***” 提出的 清楚计数器 的方法也可以。

下图是 没清计数器 ...

由于PWM是工作于PWM时钟的,PWM计数器子啊启动前如果有值,则就有一定概率出现你刚允许输出时,此时N或P已经在输出了,一旦允许输出,就看到一个波形。清除计数器再启动,则就不会有这个同步的问题。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:392
  • 最近打卡:2025-05-02 23:40:52

0

主题

336

回帖

1494

积分

金牌会员

积分
1494
发表于 2024-6-17 16:26:32 | 显示全部楼层
谢谢,学习了
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 04:04 , Processed in 0.167901 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表