newlined 发表于 2026-2-28 16:20:41

请教大家,用PWM发方波,发的个数,可以编程吗?

准备用MCU用STC32G12K128做一个播放音乐的东西,音频芯片是接收几个方波,就播放第几段音乐,如下图。想用PWM做,希望做一个函数,PWM发出的方波个数可以控制,32G12K128的PWM功能能否实现,谢谢。

newlined 发表于 2026-2-28 16:44:10

刚才看例程,“80-高级PWM输出-周期可调-脉冲计数”,是不是可以实现这个功能?或者还有更贴切的例程或方法?

晓飛飛 发表于 2026-2-28 18:14:35

利用PWM中断实现

wulin 发表于 2026-2-28 20:06:22

用定时器中断发几个脉冲就能行,哪用的着PWM模块。

newlined 发表于 2026-3-1 08:14:47

晓飛飛 发表于 2026-2-28 18:14
利用PWM中断实现

谢谢版主的回复,您说的是“更新事件中断”产生的中断吗?

newlined 发表于 2026-3-1 08:18:21

wulin 发表于 2026-2-28 20:06
用定时器中断发几个脉冲就能行,哪用的着PWM模块。

谢谢您的回复,用定时器中断可以做,但是用PWM做更科学一些,设定完PWM后,让它自己发就是了,不用管它了,但是这个设定可能比较复杂。

神农鼎 发表于 2026-3-1 09:07:53




尽量从贴心的用户手册找答案



newlined 发表于 2026-3-1 09:20:55

神农鼎 发表于 2026-3-1 09:07
尽量从贴心的用户手册找答案

谢谢管理员的回复,我去仔细看下。

newlined 发表于 2026-3-4 10:01:47

管理员请看:按照您的提示,我编写如下程序,期望按下不同的按键,PWM输出管脚产生不同数量的脉冲,比如电路板上电以后,按下KEY1,产生2个脉冲,按下KEY2,产生3个脉冲,按下KEY3,产生5个脉冲,现在情况是上电后,无论先按下哪个按键,它都会先产生1个脉冲,再次按下该按键,才会产生期望的脉冲数,脉冲的产生总有一个滞后,比如上电后,按下KEY2键,PWM输出管脚产生1个脉冲,再次按下KEY2,PWM输出管脚才产生期望的3个脉冲,此后如果不停的按下KEY2键,它会不停的每次产生3个脉冲,此后如果按下KEY3键,它仍然会产生3个脉冲,再次按下KEY3键,它才会产生期望的5个脉冲,此时,按下KEY1键,它会先产生5个脉冲,再次按下KEY1键,才会产生期望的2个脉冲,依次类推,请问是哪里设置的不对,程序的主要部分如下,谢谢。


void UpdatePwm(void)                                                                //设置周期时间,执行在主程序开始后,主循环之前
{      PWMA_ARRH         =         (u8)(Period >> 8);                                                
      PWMA_ARRL         =         (u8)Period;
      PWMA_CCR1H         =         (u8)((Period >> 1) >> 8);                        //设置占空比时间: Period/2
      PWMA_CCR1L         =         (u8)((Period >> 1));
}


void PwmInit(void)                                        //PWM初始化      执行在 UpdatePwm之后                                                                              
{                        
      PWMA_ENO = 0x00;                              //输出使能寄存器
      PWMA_ENO |= ENO1P;                        //使能输出
      PWMA_CCER1 = 0x00;                        //写 CCMRx 前必须先清零 CCxE      关闭通道
      PWMA_CCMR1 = 0x68;                        //设置 PWM1 模式 1 输出,开启 PWMn_CCR1 寄存器的预装载功能
      PWMA_CCER1 = 0x01;                        //使能 CC1E 通道, 高电平有效
      PWMA_CCER1 = 0x03;                        //使能 CC1E 通道, 低电平有效
      PWMA_PS = 0x00;                              //高级 PWM 通道输出脚选择位
      PWMA_PS |= PWM1_1;                        //选择 PWM1_1 通道 P2.0
         PWMA_BKR = 0x80;                              //使能主输出
      PWMA_CR1 |= 0x89;                              //使能 ARR 预装载,单脉冲模式,开始计时


}


/************* 发送脉冲函数 **************/

void TTxPulse(u8      rep)         //在主程序中执行
{      if (rep == 0) return;
      rep -= 1;
      PWMA_RCR         = rep;                        //重复计数寄存器,计数 rep 个脉冲后产生更新事件
      PWMA_CR1      = 0x89;                        //使能 ARR 预装载,单脉冲模式,开始计时
}





while (1)                                          //主程序的主循环 ,按键均经过去抖动处理。
      {      
                if(KEY1)                            //按键按下标志,按下后为1
                {      KEY1=0;
                        TTxPulse(2);                //输出 2 个脉冲
                }
                if(KEY2)                           //按键按下标志,按下后为1
                {      KEY2=0;
                        TTxPulse(3);                //输出3 个脉冲
                }

                if(KEY3)                           //按键按下标志,按下后为1
                {      KEY3=0;
                        TTxPulse(5);                //输出 5 个脉冲
                }

      }

王昱顺 发表于 2026-3-4 14:17:05

newlined 发表于 2026-3-4 10:01
按照您的提示,我编写如下程序,期望按下不同的按键,PWM输出管脚产生不同数量的脉冲,比如电路板上电以后 ...

这个是由于预装载的问题,这种个数较少的情况使用定时器即可
页: [1] 2
查看完整版本: 请教大家,用PWM发方波,发的个数,可以编程吗?