ZJJSXXD 发表于 2024-4-21 20:41:27

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);
                }
}


国学芯用 发表于 2024-4-22 10:18:25

强大的PWM,要去看教学视频 https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3184&extra=page%3D1

梁工 发表于 2024-4-22 17:02:22

楼主可以参考官方的例子:
STC8H系列、STC32系列 高级PWM 重复计数器应用 例子
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7325

ZJJSXXD 发表于 2024-4-22 19:16:23

好的,我再看看,谢谢。

gene 发表于 2024-10-10 14:58:26

后来找到原因了吗,我这边好像也是类似的情况,设置PWMB_RCR的值之后,要等到下一次更新事件产生之后才起作用,导致脉冲数量对应不上,不知道咋解决
页: [1]
查看完整版本: PWM 纯硬件控制脉冲个数,多次发送,顺序的问题