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

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

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-01 01:39:44

55

主题

264

回帖

1541

积分

金牌会员

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

无标题.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-01 01:39:44

55

主题

264

回帖

1541

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:730
  • 最近打卡:2026-05-01 00:13:58
已绑定手机

49

主题

2668

回帖

2752

积分

荣誉版主

积分
2752
发表于 2026-2-28 18:14:35 | 显示全部楼层
利用PWM中断实现
~~~
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:60
  • 最近打卡:2026-05-01 05:53:11
已绑定手机

3

主题

94

回帖

505

积分

高级会员

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

点评

有道理  发表于 2026-2-28 20:28
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-01 01:39:44

55

主题

264

回帖

1541

积分

金牌会员

积分
1541
发表于 2026-3-1 08:14:47 | 显示全部楼层
晓*** 发表于 2026-2-28 18:14
利用PWM中断实现

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-01 01:39:44

55

主题

264

回帖

1541

积分

金牌会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-04-30 08:56:47

849

主题

1万

回帖

2万

积分

管理员

积分
23131
发表于 2026-3-1 09:07:53 | 显示全部楼层
截图202603010906314049.jpg


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


截图202603010907495584.jpg

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-01 01:39:44

55

主题

264

回帖

1541

积分

金牌会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:711
  • 最近打卡:2026-05-01 01:39:44

55

主题

264

回帖

1541

积分

金牌会员

积分
1541
发表于 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
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:710
  • 最近打卡:2026-04-29 17:46:54
已绑定手机
已实名认证

131

主题

3416

回帖

8928

积分

版主

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-5-1 09:36 , Processed in 0.134105 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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