czlwf 发表于 2025-6-4 14:33:26

请教关于读取多路PWM的问题

修改一下,我用的是32G8K64,
我的目的是需要读取4路PWM的高电平宽度,然后还要输出2路PWM,
但是按照我学习例程的方法只能读取2路,不会读取4路,
请哪位大神指导一下,谢谢!程序如下:




void PWM_Config()                                                      // PWM初始化设置
{
//--------------------------PWMA设置-CC1捕获上升沿、CC2捕获下降沿-----------------------      
      PWMA_CCER1 = 0x00;                                        // 关闭通道
      PWMA_CCMR1 = 0x01;                                       // CC1通道配置为输入,映射在TI1FP1上
      PWMA_CCMR2 = 0x02;                                       // CC2通道配置为输入,映射在TI1FP2上
      PWMA_CCER1 = 0x11;                                        // 使能CC1、CC2通道
      PWMA_CCER1 |= 0x00;                                        // 设置CC1捕获上升沿
      PWMA_CCER1 |= 0x20;                                        // 设置CC2捕获下降沿

      PWMA_CCER2 = 0x00;                                        // 关闭通道
      PWMA_CCMR3 = 0x01;                                       // CC3通道配置为输入,映射在TI1FP3上
      PWMA_CCMR4 = 0x02;                                       // CC4通道配置为输入,映射在TI1FP4上
      PWMA_CCER2 = 0x11;                                        // 使能CC3、CC4通道
      PWMA_CCER2 |= 0x00;                                        // 设置CC3捕获上升沿
      PWMA_CCER2 |= 0x20;                                        // 设置CC4捕获下降沿

      PWMA_IER = 0x1e;                                                 // 使能CC2捕获中断
      PWMA_CR1 |= 0x01;                                       // 使能PWMA计数器,启动PWM定时器
      

      PWMB_PSCRH = (u16)(PWMB_PSC >> 8);
      PWMB_PSCRL = (u16)(PWMB_PSC);      // 预分频
      
      PWMB_CCER1 = 0x00;                                        // 关闭通道
      PWMB_CCMR1 = 0x60;                                       // 通道模式配置为输出,PWM模式1
      PWMB_CCMR2 = 0x60;          //原值0x30   设置 CC6 为 PWMB 输出模式,翻转电平
      PWMB_CCER1 = 0x11;                                        // 使能捕获/比较通道5,使能CCR预装载,原来值05

      PWMB_CCR5H = (u16)(22 >> 8);
      PWMB_CCR5L = (u16)(22 );                  
      PWMB_CCR6H = (u16)(22 >> 8);                              // 设置 CC6 初始占空比 0 %
      PWMB_CCR6L = (u16)(22 );
      
      PWMB_ARRH = (u16)(PWMB_PERIOD >> 8);
      PWMB_ARRL = (u16)(PWMB_PERIOD);                        // 设置周期
      
      PWMB_ENO = 0x55;                                                // 使能PWM5,6,7,8输出
      PWMB_BKR = 0x80;                                                // 使能PWMB主输出
      PWMB_CR1 |= 0x01;                                       // 使能PWMB计数器,启动PWM定时器

}


神农鼎 发表于 2025-6-4 17:01:42

Ai8051U 可以









以上,这捕捉 4路 高电平输入

下面还有 3路 PCA/CCP/PWM 做 3路 PWM 输出

https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf



梁工 发表于 2025-6-4 16:57:51

如果要测量高电平时间和周期时间,则2个PWM通道只能测1路输入信号。
如果只测量高电平时间,则一组PWM能测4路信号,
但4路信号的最小高电平时间或最小低电平时间有限制,不能小于4us,
因为要进入中断读取处理数据。

上述两种方式处理方法不同,你需要哪一种?

王昱顺 发表于 2025-6-5 07:50:34

如果是使用PWMA和PWMB的情况下,就是只能捕获2路高电平宽度,输出4路PWM
不过,如果你捕获的高电平信号比较宽的情况下,可以尝试CC1设置上升沿,捕获后记下当前的PWM计数值,然后切换到下降沿捕获,再次捕获后再切换回上升沿,如此循环。就可以一组PWM同时捕获4路PWM高电平了
不过唯一需要注意的就是,切换PWM寄存器需要时间,如果高电平时间比较短,那么就没办法用这个方法了

czlwf 发表于 2025-6-5 14:04:07

梁工 发表于 2025-6-4 16:57
如果要测量高电平时间和周期时间,则一组PWM只能测2路信号。
如果只测量高电平时间,则一组PWM能测4路信号 ...

我只测量高电平时间,时间在1000US以上,就是不会处理,采集高电平时间后根据时间去调节2路输出的PWM占空比

czlwf 发表于 2025-6-5 14:06:45

王昱顺 发表于 2025-6-5 07:50
如果是使用PWMA和PWMB的情况下,就是只能捕获2路高电平宽度,输出4路PWM
不过,如果你捕获的高电平信号比较 ...

这个有例程可以看下吧?

梁工 发表于 2025-6-5 14:44:55

czlwf 发表于 2025-6-5 14:04
我只测量高电平时间,时间在1000US以上,就是不会处理,采集高电平时间后根据时间去调节2路输出的PWM占空 ...

测量4路高电平时间,去调节2路PWM输出,请详细说出其映射关系,否则没人能知道你想要什么。

王昱顺 发表于 2025-6-5 15:05:53

czlwf 发表于 2025-6-5 14:06
这个有例程可以看下吧?

可以看下技术手册

czlwf 发表于 2025-6-5 19:00:59

梁工 发表于 2025-6-5 14:44
测量4路高电平时间,去调节2路PWM输出,请详细说出其映射关系,否则没人能知道你想要什么。 ...

他们之间没有关系,我只是在这个项目里需要同时读取4路PWM的高电平时间,然后还需要用到2路PWM输出

梁工 发表于 2025-6-5 20:34:08

czlwf 发表于 2025-6-5 19:00
他们之间没有关系,我只是在这个项目里需要同时读取4路PWM的高电平时间,然后还需要用到2路PWM输出 ...

请下载参考:
03-PWMA-4个捕获通道
04-PWMB-4个捕获通道

STC8H系列-高级PWM范例程序下载,2024/1/3 更新
https://www.stcaimcu.com/thread-1779-1-1.html
(出处: 国芯技术交流网站)

STC32G-高级PWM范例程序下载
https://www.stcaimcu.com/thread-1778-1-1.html
(出处: 国芯技术交流网站)
页: [1] 2
查看完整版本: 请教关于读取多路PWM的问题