电子DIY小家 发表于 2024-4-16 11:27:28

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

书接上回:PWM硬件移相测试卡教程(三)不对称PWM(高速正交编码信号输出)
@STC:https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7790
PWM硬件移相测试卡教程(四)组合PWM(180度移相互补输出)
@STC8H2K12U系列
上一章节已经讲了移相PWM的不对称PWM,
要知道这号称51单片机里全宇宙最强的PWM可不只有这一个功能,
手册里展示的还有如下的应用

当然其实还有很多应用,这里只是选取了两个典型的例子而已。

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


不对称PWM组合PWM
计数模式中央对齐模式边沿对齐/中央对齐模式
输出方式 一个周期内电平取反两次
(注:一次在上升计数,一次在下降计数)
一个周期内,两个PWM的“与”输出或者“或”输出(注:两个PWM必须一个为模式1,一个为模式2)




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


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


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

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



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


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



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

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


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

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


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

二、组合PWM实现原理


手册上关于这个模式是这么描述的,首先频率是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;



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

直接来举例子讲解:

2.0基准代码:先编写如下代码,先直接用PWM模式1和PWM模式2直接输出看下波形:
    PWM1_Duty = 3;
    PWM2_Duty = 12;
   
    PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道

    PWMA_CCMR1X = 0x00;//通道1:PWM1模式
    PWMA_CCMR1 = 0x60;
    PWMA_CCMR2X = 0x00;//通道1:PWM2模式
    PWMA_CCMR2 = 0x70;
   
    PWMA_CCER1 = 0x55; //配置通道输出使能和极性

    PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
    PWMA_ARRL = (u8)PWM_PERIOD;

    PWMA_ENO = 0x00;
    PWMA_ENO |= ENO1P; //使能输出
    PWMA_ENO |= ENO2P; //使能输出
   
    PWMA_PS = 0x00;//高级 PWM 通道输出脚选择位
    PWMA_PS |= PWM1_1; //选择 PWM1_1 通道
    PWMA_PS |= PWM2_1; //选择 PWM2_1 通道
   
    UpdatePwm();可以看到波形如下图所示:黄色是输出端口1,蓝色是输出端口2,两条竖着的白线表示一个周期



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


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


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


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


2.3为了验证一下是不是真的与输出,我们把代码稍微修改下
    PWM1_Duty = 3;
    PWM2_Duty = 2;
   
    PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道

    PWMA_CCMR1X = 0x00;//通道1:PWM1模式
    PWMA_CCMR1 = 0x60;
    PWMA_CCMR2X = 0x01;//通道1:组合PWM2模式
    PWMA_CCMR2 = 0x50;
   
    PWMA_CCER1 = 0x55; //配置通道输出使能和极性

    PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
    PWMA_ARRL = (u8)PWM_PERIOD;

    PWMA_ENO = 0x00;
    PWMA_ENO |= ENO1P; //使能输出
    PWMA_ENO |= ENO2P; //使能输出
   
    PWMA_PS = 0x00;//高级 PWM 通道输出脚选择位
    PWMA_PS |= PWM1_1; //选择 PWM1_1 通道
    PWMA_PS |= PWM2_1; //选择 PWM2_1 通道
   
    UpdatePwm();   将CCR2的数值从12改成2,这样通道1和通道2就会有交点了,再来看看输出波形


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

三、实战:180度移相互补输出


实际上想要移相其实很简单,第一路输出可以直接选择一个通道1的PWM模式1输出即可;第二路输出选择 通道3+通道4的组合PWM输出,如上图我设的通道3的组合PWM2模式,通道4的PWM1模式;上面CCR3就是通道3正常的PWM2模式的输出,CCR4就是通道4正常的PWM1模式的输出,将通道三改为组合PWM2模式的输出就会输出上面的OC3REF3的波形!再回头看CCR1的波形和OC3REFC的波形,是不是就是一个完美的移相波形了!!直接上代码:
3.1配置代码
    PWMA_PSCRH = 0x00;//预分频器
    PWMA_PSCRL = 0x00;
    PWM_PERIOD = 1000;    //设置周期值
   
    PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMA_CCER2 = 0x00;

    PWMA_CCMR1X = 0x00;//通道1:PWM1模式
    PWMA_CCMR1 = 0x60;

    PWMA_CCMR3X = 0x01;//通道3:组合PWM2模式
    PWMA_CCMR3 = 0x50;
    PWMA_CCMR4X = 0x00;//通道4:PWM1模式
    PWMA_CCMR4 = 0x60;
   
    PWMA_CCER1 = 0x55; //配置通道输出使能和极性
    PWMA_CCER2 = 0x55;
   
    PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
    PWMA_ARRL = (u8)PWM_PERIOD;

    PWMA_ENO = 0x00;
    PWMA_ENO |= ENO1P; //使能输出因为端口1是pwm模式1,所以只要写一个寄存器就可,直接把输出计数写入即可。端口3用的组合输出,要设置两个CCR寄存器,一个只要设置计数周期的一般即可,另一个需要换算一下,计数周期的一半+输出计数即可

3.3主函数里的改变PWM的代码
            if( dir==0 )
            {
                pul++;
                if( pul>=495 )
                  dir =1;
            }
            else
            {
                pul--;
                if( pul<=5 )
                  dir =0;            
            }
            PWM_SET(pul);
            Delay3ms();最后直接上视频!
attach://41469.mp4


由于买不起四通道的示波器,只能接两个通道了,另外两个移相的引脚没接,大家有示波器的可以自己去接上试试!



电子DIY小家 发表于 2024-4-16 11:34:10


插个广告,需要配套硬件测试的可以从如下链接购买(特价14.99):
https://item.taobao.com/item.htm?abbucket=15&id=771684829461&spm=a230r.7195193.1997079397.8.6bc635d6bTmrCs&skuId=5287511585599

神农鼎 发表于 2024-4-16 13:06:34

PWM硬件移相测试卡教程(四)组合PWM(180度移相互补输出)@STC8H2K12U系列
PWM硬件移相测试卡教程(四)组合PWM(180度移相互补输出)@STC8H2K12U系列 - 工控板,PLC,STC8/STC32实现 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

PWM硬件移相测试卡教程(三)不对称PWM(高速正交编码信号输出)@STC
PWM硬件移相测试卡教程(三)不对称PWM(高速正交编码信号输出)@STC - 工控板,PLC,STC8/STC32实现 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

PWM硬件移相测试卡教程(二)贪吃蛇@STC8H2K12U系列
PWM硬件移相测试卡教程(二)贪吃蛇@STC8H2K12U系列 - 工控板,PLC,STC8/STC32实现 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

PWM硬件移相测试卡教程(一)按键点灯测试@STC8H2K12U系列
PWM硬件移相测试卡教程(一)按键点灯测试@STC8H2K12U系列 - 工控板,PLC,STC8/STC32实现 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

社区闲人 发表于 2024-4-16 13:09:39

手头有四通道的示波器,有空测试一下。先谢谢楼主。

深山老妖 发表于 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%).


电子DIY小家 发表于 2024-4-22 11:44:22

深山老妖 发表于 2024-4-22 11:19
能不能利用移相产生下面的这种波形?
CH1和CH2的占空比为固定的50%(不需要死区控制,各自占50%就行),频 ...

当然可以,第一个pwm模式1,第二个pwm模式2,第三个pwm模式1,第四个组合pwm模式2

深山老妖 发表于 2024-4-22 13:56:16

能不能出个例程?

深山老妖 发表于 2024-4-22 13:56:28

一直想要这种波形,找不到。

电子DIY小家 发表于 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爱好者互助交流社区)

坛友要求,必须满足

dnajx 发表于 2024-4-22 20:03:56

{:4_174:}{:4_174:}
页: [1] 2
查看完整版本: PWM硬件移相测试卡教程(四)组合PWM(180度移相互补输出)@STC8H2K12U系列