找回密码
 立即注册
查看: 100|回复: 12

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

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:657
  • 最近打卡:2026-03-07 05:53:33

51

主题

255

回帖

1263

积分

金牌会员

积分
1263
发表于 7 天前 | 显示全部楼层 |阅读模式
准备用MCU用STC32G12K128做一个播放音乐的东西,音频芯片是接收几个方波,就播放第几段音乐,如下图。想用PWM做,希望做一个函数,PWM发出的方波个数可以控制,32G12K128的PWM功能能否实现,谢谢。

无标题.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:657
  • 最近打卡:2026-03-07 05:53:33

51

主题

255

回帖

1263

积分

金牌会员

积分
1263
发表于 7 天前 | 显示全部楼层
刚才看例程,“80-高级PWM输出-周期可调-脉冲计数”,是不是可以实现这个功能?或者还有更贴切的例程或方法?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:685
  • 最近打卡:2026-03-07 01:17:49
已绑定手机

49

主题

2642

回帖

2854

积分

荣誉版主

积分
2854
发表于 7 天前 | 显示全部楼层
利用PWM中断实现
~~~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-03-06 15:51:42
已绑定手机

2

主题

17

回帖

114

积分

注册会员

积分
114
发表于 7 天前 | 显示全部楼层
用定时器中断发几个脉冲就能行,哪用的着PWM模块。

点评

有道理  发表于 7 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:657
  • 最近打卡:2026-03-07 05:53:33

51

主题

255

回帖

1263

积分

金牌会员

积分
1263
发表于 6 天前 | 显示全部楼层
晓*** 发表于 2026-2-28 18:14
利用PWM中断实现

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:657
  • 最近打卡:2026-03-07 05:53:33

51

主题

255

回帖

1263

积分

金牌会员

积分
1263
发表于 6 天前 | 显示全部楼层
wul*** 发表于 2026-2-28 20:06
用定时器中断发几个脉冲就能行,哪用的着PWM模块。

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:347
  • 最近打卡:2026-03-07 12:55:14

842

主题

1万

回帖

2万

积分

管理员

积分
22606
发表于 6 天前 | 显示全部楼层
截图202603010906314049.jpg


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


截图202603010907495584.jpg

点评

管理员您好,我按照您的提示,编写了一个程序,可以发出设定数量的脉冲,但是有一点小问题,希望您有时间看看,谢谢。  发表于 3 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:657
  • 最近打卡:2026-03-07 05:53:33

51

主题

255

回帖

1263

积分

金牌会员

积分
1263
发表于 6 天前 | 显示全部楼层
神*** 发表于 2026-3-1 09:07
尽量从贴心的用户手册找答案

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:657
  • 最近打卡:2026-03-07 05:53:33

51

主题

255

回帖

1263

积分

金牌会员

积分
1263
发表于 3 天前 | 显示全部楼层
管理员请看:
按照您的提示,我编写如下程序,期望按下不同的按键,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 个脉冲
                }

        }

点评

这个是由于预装载的问题,这种个数较少的情况使用定时器即可  详情 回复 发表于 3 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:687
  • 最近打卡:2026-03-05 13:33:59
已绑定手机
已实名认证

129

主题

3375

回帖

8784

积分

版主

积分
8784
发表于 3 天前 | 显示全部楼层
newl*** 发表于 2026-3-4 10:01
按照您的提示,我编写如下程序,期望按下不同的按键,PWM输出管脚产生不同数量的脉冲,比如电路板上电以后 ...

这个是由于预装载的问题,这种个数较少的情况使用定时器即可
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 15:31 , Processed in 0.122578 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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