PWM 纯硬件控制脉冲个数,多次发送,顺序的问题
初学,刚刚接触PWM功能,参考STC8H8K64U-DEMO-CODE里面的,
26-高级PWM输出-周期可调-脉冲计数,
改了一点,不调占空比,
按顺序,连续发送4次固定脉冲,5个,10个,15个,20个脉冲(中间间隔6ms),
延迟15ms后,再发送,一直循环,
现在的问题是,发送的脉冲数是对的,但是,发送出去的顺序不对,变成了:20个,5个,10个,15个,
麻烦各位大佬有时间帮忙看看,这是什么原因?
void delay_ms(u16 ms)
{
u16 i;
do{
i = MAIN_Fosc / 10000;
while(--i);
}while(--ms);
}
/************* 发送脉冲函数 **************/
void TxPulse(u8 rep)
{
if(rep == 0) return;
rep -= 1;
PWMA_RCR = rep; //重复计数寄存器,计数 rep 个脉冲后产生更新事件
PWMA_CR1 |= 0x89;//使能ARR预装载,单脉冲模式,开始计时
}
/************* 更新PWM周期占空比.**************/
void UpdatePwm(void)
{
PWMA_ARR = Period;
PWMA_CCR1 = (Period >> 1); //设置占空比时间: Period/2
}
void main(void)
{
P_SW2 |= 0x80;//扩展寄存器(XFR)访问使能
P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
P1M1 = 0x30; P1M0 = 0x30; //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V)
P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
PWM1_Flag = 0;
Counter = 0;
Period = 0x1000;
PWMA_ENO = 0x00;
PWMA_ENO |= ENO1P; //使能输出
PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR1 = 0x68; //设置 PWM1 模式1 输出
PWMA_CCER1 = 0x03; //使能 CC1E 通道, 低电平有效
PWMA_PS = 0x00; //高级 PWM 通道输出脚选择位
PWMA_PS |= PWM1_2; //选择 PWM1_2 通道
UpdatePwm();
PWMA_BKR = 0x80; //使能主输出
P40 = 0; //给LED供电
EA = 1; //打开总中断
delay_ms(50);
while (1)
{
TxPulse(5); //输出5个脉冲
delay_ms(6);
TxPulse(10); //输出10个脉冲
delay_ms(6);
TxPulse(15); //输出15个脉冲
delay_ms(6);
TxPulse(20); //输出20个脉冲
delay_ms(15);
}
}
强大的PWM,要去看教学视频 https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3184&extra=page%3D1
楼主可以参考官方的例子:
STC8H系列、STC32系列 高级PWM 重复计数器应用 例子
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7325
好的,我再看看,谢谢。 后来找到原因了吗,我这边好像也是类似的情况,设置PWMB_RCR的值之后,要等到下一次更新事件产生之后才起作用,导致脉冲数量对应不上,不知道咋解决
页:
[1]