czlwf 发表于 2025-6-6 10:29:55

梁工 发表于 2025-6-5 20:34
请下载参考:
03-PWMA-4个捕获通道
04-PWMB-4个捕获通道


万分感谢,懂了

czlwf 发表于 4 天前

神农鼎 发表于 2025-6-4 17:01
Ai8051U 可以



我的芯片手册老了,没找着的范例,也没敢细看你发的说明图片,
失败了回头看下你发的范例挺细的,谢谢!我来细细的摸索一下

czlwf 发表于 4 天前

神农鼎 发表于 2025-6-4 17:01
Ai8051U 可以


今天试了一下,
这种方法读取4路PWM后就没法再输出PWM了,
把PWMA和PWMB的口全占了,
我开始理解的是读取P1.0的同时能读取P1.2,
以为只要把中断中改为1到4的口就行,结果是不能的,

czlwf 发表于 4 天前

梁工 发表于 2025-6-5 20:34
请下载参考:
03-PWMA-4个捕获通道
04-PWMB-4个捕获通道


梁工,我用了例程测试,就改了I/O口,其他的都没动,但是读出来的是错的,我输入的是1000US的高电平结果显示是10000,我把高电平时间改为2000,读取出来的也是10000,不知道哪里的问题?PWMA_CCMR1= 0x31;                // 通道1模式配置, 配置成输入通道, 8个时钟滤波
        ccer1 |= 0x03;                          // 配置通道输入使能和极性, 允许输入, 下降沿
        ps    |= 0;                                  // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
        PWMA_ISR_En|= 0x02;                // 使能中断

        PWMA_CCMR2= 0x31;                // 通道2模式配置, 配置成输入通道, 8个时钟滤波
        ccer1 |= 0x30;                          // 配置通道输入使能和极性, 允许输入, 下降沿
        ps    |= (0<<2);                  // 选择IO, 0:选择P1.2 P1.3, 1:选择P2.2 P2.3, 2:选择P6.2 P6.3,
        PWMA_ISR_En|= 0x04;                // 使能中断

        PWMA_CCMR3= 0x31;                // 通道3模式配置, 配置成输入通道, 8个时钟滤波
        ccer2 |= 0x03;                          // 配置通道输入使能和极性, 允许输入, 下降沿
        ps    |= (0<<4);                  // 选择IO, 0:选择P1.4 P1.5, 1:选择P2.4 P2.5, 2:选择P6.4 P6.5,
        PWMA_ISR_En|= 0x08;                // 使能中断

        PWMA_CCMR4= 0x31;                // 通道4模式配置, 配置成输入通道, 8个时钟滤波
        ccer2 |= 0x30;                           // 配置通道输入使能和极性, 允许输入, 下降沿
        ps    |= (0<<6);                  // 选择IO, 0:选择P1.6 P1.7, 1:选择P2.6 P2.7, 2:选择P6.6 P6.7, 3:选择P3.3 P3.4
        PWMA_ISR_En|= 0x10;                // 使能中断

梁工 发表于 4 天前

czlwf 发表于 2025-6-13 19:35
梁工,我用了例程测试,就改了I/O口,其他的都没动,但是读出来的是错的,我输入的是1000US的高电平结果 ...

先测试我原来的程序,正常了再修改,有错误就仔细检查程序。

czlwf 发表于 4 天前

梁工 发表于 2025-6-13 21:13
先测试我原来的程序,正常了再修改,有错误就仔细检查程序。

好的,是我偷懒了,没用试验板先做,周一再试试,一个老年人学习单片机是有点难度的,不过相信我能学会,谢谢梁工!

王昱顺 发表于 3 天前

czlwf 发表于 2025-6-13 19:31
今天试了一下,
这种方法读取4路PWM后就没法再输出PWM了,
把PWMA和PWMB的口全占了,

ai8051u下,可以通过pwma和pwmb捕获四路pwm,同时还有一个pca外设可以用来生成三路pwm
因为是你用的32g8k64系列,则没有pca硬件。因为您是仅需要捕获高电平宽度,则可以通过使用INT0+T0和INT1+T1的方式来组合读取两路高电平,需要额外占用两个定时器。
此时组合起来就是可以INT0+T0捕获一路,INT1+T1捕获一路,PWMB捕获两路,一共四路高电平捕获
同时PWMA还可输出4路带互补信号的PWM

王昱顺 发表于 3 天前

czlwf 发表于 2025-6-13 22:03
好的,是我偷懒了,没用试验板先做,周一再试试,一个老年人学习单片机是有点难度的,不过相信我能学会, ...

这里给出一个经过测试的完整程序:

测试使用了同一信号源,可以看到捕获后的h1~h4高电平值均相同,程序采用USB-CDC接口直接回传,使用STC32G-V9.62实验箱测试通过,测试频率为24Mhz
或者可以使用32G8K64芯片,下载使用40Mhz频率进行测试
测试端口如下所示:

// PWM输出为P60~P67,分别对应PWM1P、PWM1N、PWM2P、PWM2N、PWM3P、PWM3N、PWM4P、PWM4N
// PWM输入为P32(INT0)、P33(INT1)、P00(PWM5P)、P02(PWM7P)

程序内使用INT0+T0、INT1+T1、PWMB捕获2路的组合方式,可同时捕获四路信号的高电平
同时使用PWMA产生了四路互补带死区的高级PWM信号,上电默认50%,与捕获输入对应映射:
以下为其中一路的示例,程序中使用了协程,来减缓捕获时间,方便打印到USB-CDC端口进行观察
task_start(0);// 协程0
      task_wait(P32); // 等待 INT0 为低
      TR0 = 1;
      // 启动定时器
      IT0 = 1;
      // 使能 INT0 下降沿中断
      EX0 = 1;
      f1 = 1;
      task_wait(f1);                     // 等待读取完成
      UpdatePwm(1, high_level_time1 >> 2); // 缩放至0~16384
      printf_usb("h1:%u\r\n", high_level_time1);
      task_delay(100);
      task_end(1);以下是经过实际测试通过的程序文件:

神农鼎 发表于 3 天前

王昱顺 发表于 2025-6-14 14:11
这里给出一个经过测试的完整程序:

测试使用了同一信号源,可以看到捕获后的h1~h4高电平值均相同,程序 ...
实用,到位, 帮另外开个贴,发出来,大家好搜索到:

标题:
同时测量四路高电平宽度并输出4路PWM, STC32G/STC8H系列
页: 1 [2]
查看完整版本: 请教关于读取多路PWM的问题