找回密码
 立即注册
查看: 2961|回复: 13

PWM硬件移相测试卡教程(四)组合PWM(180度移相互补输出)@STC8H2K12U系列

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-4-16 11:27:28 | 显示全部楼层 |阅读模式
书接上回:PWM硬件移相测试卡教程(三)不对称PWM(高速正交编码信号输出)
@STC:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7790
PWM硬件移相测试卡教程(四)组合PWM(180度移相互补输出
@STC8H2K12U系列
上一章节已经讲了移相PWM的不对称PWM,
要知道这号称51单片机里全宇宙最强的PWM可不只有这一个功能,
手册里展示的还有如下的应用
截图202404160854149450.jpg
当然其实还有很多应用,这里只是选取了两个典型的例子而已。

一、组合PWM的导入
两种PWM的主要区别如下

不对称PWM
组合PWM
计数模式
中央对齐模式
边沿对齐/中央对齐模式
输出方式
一个周期内电平取反两次

注:一次在上升计数,一次在下降计数

一个周期内,两个PWM的“与”输出或者“或”输出(注:两个PWM必须一个为模式1,一个为模式2



可以看到虽然他们总的来说区别就只有两点,但是组合PWM能带来的可能性其实多了不少,就比如说如下的波形
截图202404160942581488.jpg

在一个计数周期之内,我想要在两个端口上各自输出一个脉冲,但他们不能同时导通这时候该怎么办呢?
方案1:普通PWM,一个PWM模式1,在计数开始的时候输出一个脉冲;一个PWM模式2,在计数结束的时候输出一个脉冲;
截图202404160940223250.jpg

如上图,通道1在计数0和1的时候发脉冲,通道2在计数14和15的时候发脉冲,这样是不是在计数周期14,15,0,1交界的地方就能生成这个PWM了

方案2:不对称PWM,一个电平在上升沿快结束时打开,一个在上升沿刚开始时打开

截图202404160944124909.jpg

如上图,通道1在计数7和8的时候发脉冲,通道2在计数7和6的时候发脉冲,这样是不是在计数周期8-7交界的地方就能生成这个PWM了


方案3:组合PWM,可以在任意时间点实现脉冲输出

截图202404160945132698.jpg

这个具体怎么生成的请看下文!

综上所述,看官们乍一看可能要说:开什么玩笑,三个方式都能生成,这个组合PWM有什么好的!别急,上难度。如果我连续的两个脉冲之间要想要空一个计数周期呢?
截图202404160949303215.jpg

如上图,各位可以思考下,上面三种方式能不能生成这个。

再比如我想生成下下面的这个波形呢(占空比0-50%之间,相位差180度)
截图202404160958206840.jpg

这个波形,组合PWM可以分分钟实现。

二、组合PWM实现原理
截图202404161007489063.jpg

手册上关于这个模式是这么描述的,首先频率是ARR确定的(其实完整的应该是ARR,PSCR和计数模式一起决定的)这个和之前一样,
其次就是端口的模式了,注意的是这里的端口必须是一个PWM模式1,另一个PWM模式2,也就是说端口只有一下四种可能
可能1: 端口a(a=1/3/5)模式:组合PWM模式1;端口b(b=2/4/6)模式:PWM模式2;
可能2: 端口a(a=1/3/5)模式:组合PWM模式2;端口b(b=2/4/6)模式:PWM模式1;


可能3: 端口a(a=1/3/5)模式:PWM模式1;端口b(b=2/4/6)模式:组合PWM模式2;
可能4: 端口a(a=1/3/5)模式:PWM模式2;端口b(b=2/4/6)模式:组合PWM模式1;

截图202404161024484591.jpg

然后再来过一下组合PWM输出的模式设置;

直接来举例子讲解:

2.0基准代码:先编写如下代码,先直接用PWM模式1和PWM模式2直接输出看下波形:
  1.     PWM1_Duty = 3;
  2.     PWM2_Duty = 12;
  3.    
  4.     PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  5.     PWMA_CCMR1X = 0x00;//通道1:PWM1模式
  6.     PWMA_CCMR1 = 0x60;
  7.     PWMA_CCMR2X = 0x00;//通道1:PWM2模式
  8.     PWMA_CCMR2 = 0x70;
  9.    
  10.     PWMA_CCER1 = 0x55; //配置通道输出使能和极性
  11.     PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
  12.     PWMA_ARRL = (u8)PWM_PERIOD;
  13.     PWMA_ENO = 0x00;
  14.     PWMA_ENO |= ENO1P; //使能输出
  15.     PWMA_ENO |= ENO2P; //使能输出
  16.    
  17.     PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
  18.     PWMA_PS |= PWM1_1; //选择 PWM1_1 通道
  19.     PWMA_PS |= PWM2_1; //选择 PWM2_1 通道
  20.    
  21.     UpdatePwm();
复制代码
可以看到波形如下图所示:黄色是输出端口1,蓝色是输出端口2,两条竖着的白线表示一个周期
截图202404161040441651.jpg


2.1此时我们把2.0小结里的基准代码改为“端口a(a=1/3/5)模式:组合PWM模式1;端口b(b=2/4/6)模式:PWM模式2;”
截图202404161044137860.jpg

可以看到上图,原本周期开始的黄色线的高电平还在,但是周期结束的部分多了一段高电平,这个时间和原来的蓝色线的高电平时间一样!!这就是逻辑或输出!


2.2此时我们把2.0小结里的基准代码改为“端口a(a=1/3/5)模式:PWM模式1;端口b(b=2/4/6)模式:组合PWM模式2;”
截图202404161057382637.jpg

可以看到这时候蓝色线变成了一条低电平的直线,因为在2.0章节的图里面,两个波形没有同时为高电平的部分,所以两个波形与运算一下就变0了,这就是逻辑与输出!


2.3为了验证一下是不是真的与输出,我们把代码稍微修改下
  1.     PWM1_Duty = 3;
  2.     PWM2_Duty = 2;
  3.    
  4.     PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  5.     PWMA_CCMR1X = 0x00;//通道1:PWM1模式
  6.     PWMA_CCMR1 = 0x60;
  7.     PWMA_CCMR2X = 0x01;//通道1:组合PWM2模式
  8.     PWMA_CCMR2 = 0x50;
  9.    
  10.     PWMA_CCER1 = 0x55; //配置通道输出使能和极性
  11.     PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
  12.     PWMA_ARRL = (u8)PWM_PERIOD;
  13.     PWMA_ENO = 0x00;
  14.     PWMA_ENO |= ENO1P; //使能输出
  15.     PWMA_ENO |= ENO2P; //使能输出
  16.    
  17.     PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
  18.     PWMA_PS |= PWM1_1; //选择 PWM1_1 通道
  19.     PWMA_PS |= PWM2_1; //选择 PWM2_1 通道
  20.    
  21.     UpdatePwm();   
复制代码
将CCR2的数值从12改成2,这样通道1和通道2就会有交点了,再来看看输出波形
截图202404161102373336.jpg

如上图,这样就可以看出他们确实是逻辑与的运算了

三、实战:180度移相互补输出
截图202404161116066131.jpg

实际上想要移相其实很简单,第一路输出可以直接选择一个通道1的PWM模式1输出即可;第二路输出选择 通道3+通道4的组合PWM输出,如上图我设的通道3的组合PWM2模式,通道4的PWM1模式;上面CCR3就是通道3正常的PWM2模式的输出,CCR4就是通道4正常的PWM1模式的输出,将通道三改为组合PWM2模式的输出就会输出上面的OC3REF3的波形!再回头看CCR1的波形和OC3REFC的波形,是不是就是一个完美的移相波形了!!直接上代码:
3.1配置代码
  1.     PWMA_PSCRH = 0x00;  //预分频器
  2.     PWMA_PSCRL = 0x00;
  3.     PWM_PERIOD = 1000;    //设置周期值
  4.    
  5.     PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  6.     PWMA_CCER2 = 0x00;
  7.     PWMA_CCMR1X = 0x00;//通道1:PWM1模式
  8.     PWMA_CCMR1 = 0x60;
  9.     PWMA_CCMR3X = 0x01;//通道3:组合PWM2模式
  10.     PWMA_CCMR3 = 0x50;
  11.     PWMA_CCMR4X = 0x00;//通道4:PWM1模式
  12.     PWMA_CCMR4 = 0x60;
  13.    
  14.     PWMA_CCER1 = 0x55; //配置通道输出使能和极性
  15.     PWMA_CCER2 = 0x55;
  16.    
  17.     PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
  18.     PWMA_ARRL = (u8)PWM_PERIOD;
  19.     PWMA_ENO = 0x00;
  20.     PWMA_ENO |= ENO1P; //使能输出
复制代码
因为端口1是pwm模式1,所以只要写一个寄存器就可,直接把输出计数写入即可。端口3用的组合输出,要设置两个CCR寄存器,一个只要设置计数周期的一般即可,另一个需要换算一下,计数周期的一半+输出计数即可

3.3主函数里的改变PWM的代码
  1.             if( dir==0 )
  2.             {
  3.                 pul++;
  4.                 if( pul>=495 )
  5.                     dir =1;
  6.             }
  7.             else
  8.             {
  9.                 pul--;
  10.                 if( pul<=5 )
  11.                     dir =0;            
  12.             }
  13.             PWM_SET(pul);
  14.             Delay3ms();
复制代码
最后直接上视频!



由于买不起四通道的示波器,只能接两个通道了,另外两个移相的引脚没接,大家有示波器的可以自己去接上试试!
4.PWM组合输出.rar (47.43 KB, 下载次数: 213)


回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-4-16 11:34:10 | 显示全部楼层

插个广告,需要配套硬件测试的可以从如下链接购买(特价14.99):
https://item.taobao.com/item.htm ... skuId=5287511585599
截图202404161133161214.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2024-4-16 13:06:34 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-01 04:31:49

24

主题

515

回帖

986

积分

荣誉版主

积分
986
发表于 2024-4-16 13:09:39 | 显示全部楼层
手头有四通道的示波器,有空测试一下。先谢谢楼主。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-15 22:45:37

12

主题

96

回帖

604

积分

高级会员

积分
604
发表于 2024-4-22 11:19:17 | 显示全部楼层
本帖最后由 深山老妖 于 2024-4-22 11:21 编辑

能不能利用移相产生下面的这种波形?
CH1和CH2的占空比为固定的50%(不需要死区控制,各自占50%就行),频率30-300K可调。
CH3和CH1的相位相同,占空比可调(1%-50%),
CH4和CH3的相位相同,占空比可调(1%-50%).
171256oai203pd88d920qo.png

点评

当然可以,第一个pwm模式1,第二个pwm模式2,第三个pwm模式1,第四个组合pwm模式2  详情 回复 发表于 2024-4-22 11:44
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-4-22 11:44:22 | 显示全部楼层
深山*** 发表于 2024-4-22 11:19
能不能利用移相产生下面的这种波形?
CH1和CH2的占空比为固定的50%(不需要死区控制,各自占50%就行),频 ...

当然可以,第一个pwm模式1,第二个pwm模式2,第三个pwm模式1,第四个组合pwm模式2
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-15 22:45:37

12

主题

96

回帖

604

积分

高级会员

积分
604
发表于 2024-4-22 13:56:16 | 显示全部楼层
能不能出个例程?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-15 22:45:37

12

主题

96

回帖

604

积分

高级会员

积分
604
发表于 2024-4-22 13:56:28 | 显示全部楼层
一直想要这种波形,找不到。

点评

PWM硬件移相测试卡教程(四)组合PWM补充(1个pwm实现180度移相输出+互补50%) https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7926 (出处: 国芯论坛-STC全球32位8051爱好者互助交流社区) 坛友要求,必须  详情 回复 发表于 2024-4-22 14:23
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2024-4-22 14:23:24 | 显示全部楼层
深山*** 发表于 2024-4-22 13:56
一直想要这种波形,找不到。

PWM硬件移相测试卡教程(四)组合PWM补充(1个pwm实现180度移相输出+互补50%)
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7926
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)

坛友要求,必须满足
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:345
  • 最近打卡:2025-05-01 10:59:26

6

主题

107

回帖

1669

积分

金牌会员

积分
1669
发表于 2024-4-22 20:03:56 | 显示全部楼层
 
经常看看,偶尔玩玩——不过都是简单的,难的我也不会呀
 
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 20:16 , Processed in 0.184505 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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