请教大家,用PWM发方波,发的个数,可以编程吗?
准备用MCU用STC32G12K128做一个播放音乐的东西,音频芯片是接收几个方波,就播放第几段音乐,如下图。想用PWM做,希望做一个函数,PWM发出的方波个数可以控制,32G12K128的PWM功能能否实现,谢谢。刚才看例程,“80-高级PWM输出-周期可调-脉冲计数”,是不是可以实现这个功能?或者还有更贴切的例程或方法? 利用PWM中断实现 用定时器中断发几个脉冲就能行,哪用的着PWM模块。 晓飛飛 发表于 2026-2-28 18:14
利用PWM中断实现
谢谢版主的回复,您说的是“更新事件中断”产生的中断吗? wulin 发表于 2026-2-28 20:06
用定时器中断发几个脉冲就能行,哪用的着PWM模块。
谢谢您的回复,用定时器中断可以做,但是用PWM做更科学一些,设定完PWM后,让它自己发就是了,不用管它了,但是这个设定可能比较复杂。
尽量从贴心的用户手册找答案
神农鼎 发表于 2026-3-1 09:07
尽量从贴心的用户手册找答案
谢谢管理员的回复,我去仔细看下。 管理员请看:按照您的提示,我编写如下程序,期望按下不同的按键,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 个脉冲
}
}
newlined 发表于 2026-3-4 10:01
按照您的提示,我编写如下程序,期望按下不同的按键,PWM输出管脚产生不同数量的脉冲,比如电路板上电以后 ...
这个是由于预装载的问题,这种个数较少的情况使用定时器即可
页:
[1]
2