找回密码
 立即注册
楼主: czlwf

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-06-13 08:10:35

2

主题

10

回帖

70

积分

注册会员

积分
70
发表于 2025-6-6 10:29:55 | 显示全部楼层
梁*** 发表于 2025-6-5 20:34
请下载参考:
03-PWMA-4个捕获通道
04-PWMB-4个捕获通道

万分感谢,懂了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-06-13 08:10:35

2

主题

10

回帖

70

积分

注册会员

积分
70
发表于 3 天前 | 显示全部楼层

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-06-13 08:10:35

2

主题

10

回帖

70

积分

注册会员

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

点评

ai8051u下,可以通过pwma和pwmb捕获四路pwm,同时还有一个pca外设可以用来生成三路pwm 如果是你用的32g8k64系列,则没有pca硬件。因为您是仅需要捕获高电平宽度,则可以通过使用INT0+T0和INT1+T1的方式来组合读取两  详情 回复 发表于 前天 12:34
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-06-13 08:10:35

2

主题

10

回帖

70

积分

注册会员

积分
70
发表于 3 天前 | 显示全部楼层
梁*** 发表于 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;                // 使能中断

点评

先测试我原来的程序,正常了再修改,有错误就仔细检查程序。  详情 回复 发表于 3 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:94
  • 最近打卡:2025-06-16 11:51:06

74

主题

6090

回帖

1万

积分

超级版主

积分
12723
发表于 3 天前 | 显示全部楼层
czl*** 发表于 2025-6-13 19:35
梁工,我用了例程测试,就改了I/O口,其他的都没动,但是读出来的是错的,我输入的是1000US的高电平结果 ...

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-06-13 08:10:35

2

主题

10

回帖

70

积分

注册会员

积分
70
发表于 3 天前 来自手机 | 显示全部楼层
梁工 发表于 2025-6-13 21:13
先测试我原来的程序,正常了再修改,有错误就仔细检查程序。

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

点评

这里给出一个经过测试的完整程序: [attachimg]104142[/attachimg][attachimg]104143[/attachimg] 测试使用了同一信号源,可以看到捕获后的h1~h4高电平值均相同,程序采用USB-CDC接口直接回传,使用STC32G-V9.62实验  详情 回复 发表于 前天 14:11
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-16 10:06:31
已绑定手机
已实名认证

112

主题

2390

回帖

6014

积分

版主

积分
6014
发表于 前天 12:34 | 显示全部楼层
czl*** 发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-16 10:06:31
已绑定手机
已实名认证

112

主题

2390

回帖

6014

积分

版主

积分
6014
发表于 前天 14:11 | 显示全部楼层
czl*** 发表于 2025-6-13 22:03
好的,是我偷懒了,没用试验板先做,周一再试试,一个老年人学习单片机是有点难度的,不过相信我能学会, ...

这里给出一个经过测试的完整程序:
截图202506141406399809.jpg 截图202506141406466828.jpg
测试使用了同一信号源,可以看到捕获后的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端口进行观察
  1. task_start(0);  // 协程0
  2.         task_wait(P32); // 等待 INT0 为低
  3.         TR0 = 1;
  4.         // 启动定时器
  5.         IT0 = 1;
  6.         // 使能 INT0 下降沿中断
  7.         EX0 = 1;
  8.         f1 = 1;
  9.         task_wait(f1);                       // 等待读取完成
  10.         UpdatePwm(1, high_level_time1 >> 2); // 缩放至0~16384
  11.         printf_usb("h1:%u\r\n", high_level_time1);
  12.         task_delay(100);
  13.         task_end(1);
复制代码
以下是经过实际测试通过的程序文件:
int_pwmin_pwmout.zip (94.96 KB, 下载次数: 1)

点评

实用,到位  详情 回复 发表于 前天 15:49
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16643
发表于 前天 15:49 | 显示全部楼层
王*** 发表于 2025-6-14 14:11
这里给出一个经过测试的完整程序:

测试使用了同一信号源,可以看到捕获后的h1~h4高电平值均相同,程序 ...

实用,到位, 帮另外开个贴,发出来,大家好搜索到:

标题:
同时测量四路高电平宽度并输出4路PWM, STC32G/STC8H系列
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 16:10 , Processed in 0.259094 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表