电子DIY小家 发表于 2024-4-15 15:38:23

PWM硬件移相测试卡教程(三)不对称PWM(高速正交编码信号输出)@STC

本帖最后由 电子DIY小家 于 2024-4-15 15:50 编辑

前言:
    众所周知,STC早早的就出了带硬件移相的PWM,但是好多人还不理解这个硬件移相PWM有什么作用,这篇帖子带大家仔细研究下这个硬件移相PWM的一部分——不对称PWM。

一、普通PWM模式
    常见的PWM模式如下图所示,通过一个ARR寄存器设定最大计数值(向上计数模式),CNT表示当前的计数,当计数超过ARR的时候被清0,当CNT数值小于当前通道的CCRx的时候输出低电平,反之输出高电平,这个是常规的PWM模式2(不开启极性反相的时候!)。


再来看下手册这部分,可以看到PWM模式1其实就是PWM模式2的反过来的波形

当然上面的都是边沿计数,还有一种中心对齐的计数


但是这种模式就是只能生成中心对称的波形,如果单纯的只想做几路不同占空比输出的波形,那确实没一点问题。可以思考下,像上面的几种模式,总的规划出来就分为四大类:
1.前面高电平后面低电平
2.前面低电平后面高电平
3.两边低电平中间高电平
4.两边高电平中间低电平
上面1和2是同一种计数方式,3和4是一种计数方式,同一时间只能选择一种计数方式。但是这时候,我们如果想要生成一个如下图的正交编码信号的PWM波形改如何实现的?




二、不对称互补PWM
    按照我个人的理解,不对称PWM的本质就是起始和结束电平不受约束,按照手册的说法他必须使用中心对齐计数模式,开始电平是可以在上升计数段里任意定义,结束电平实在下降计数段里任意定义的。在下面的图里,一个红色线和一个绿色线为一个中心计数模式的一个周期(从0计数到最大值arr再到0的过程),开始电平可以在红线里的任意位置,结束电平可以是绿线的任意位置,这样是不是就很好分配了。


再画个简单的示意图:


假设红色的是整个计数周期,将他对半的分为绿-橙区域和橙-蓝区域,开始的电平可以在这个绿-橙区域任意位置,结束电平也可以定义在这个橙-蓝区域的任意位置,此时你想要这个波形横移多少位置不就是分分钟的了。

当然在开始之前我们还需要了解一些基本知识:


手册上关于这个模式的描述就这么一页,我给他归纳总结了一下:
1.需要在中心对齐计数模式下使用
2.必须手动设置为不对称模式才能使用这个输出(切记这个寄存器的位置不连续,要重点注意)
3.两个通道才能组合成为一个完整的不对称输出通道,且通道1(又名OC1REFC或OC2REFC)由CCR1和CCR2控制,通道2(又名OC3REFC或OC4REFC)由CCR3和CCR4控制。
4.1P端口设置为不对称输出时起始电平时间点为CCR1,结束时间点为CCR2;2P端口设置为不对称输出时起始电平时间点为CCR2,结束时间点为CCR1;
5.别的配置都可以参考普通PWM的配置
6.一个通道会占用两个端口的CCR寄存器,其中一个作为不对称输出的时候,另一个还可以作为普通的pwm模式输出。

三、寄存器描述
1.设置为中心对齐计数



2.手动使能不对称模式


这里尤其要注意OCxM在CCMx寄存器,但是最高位OCxM在CCMxX寄存器(小写的x表示哪个端口);

3.通道比较数值设置



四、代码实战
首先我们可以看下来验证一下第二章里的第四点4.1P端口设置为不对称输出时起始电平时间点为CCR1,结束时间点为CCR2;2P端口设置为不对称输出时起始电平时间点为CCR2,结束时间点为CCR1)是什么意思:
1)首先配置1P端口为不对称PWM模式2输出,2P端口PWM模式2输出
    PWM1_Duty = 3;
    PWM2_Duty = 5;

    PWMA_PSCRH = 0;
    PWMA_PSCRL = 255;
   
    PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMA_CCER2 = 0x00;

    PWMA_CCMR1X = 0x01;//端口1:不对称PWM2模式
    PWMA_CCMR1 = 0x70;
    PWMA_CCMR2X = 0x00;//端口2:PWM2模式
    PWMA_CCMR2 = 0x70;

    PWMA_CCER1 = 0x55; //配置通道输出使能和极性
    PWMA_CCER2 = 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_0; //选择 PWM1_0 通道
    PWMA_PS |= PWM2_0; //选择 PWM2_0 通道

效果图如上,黄色线条为1P端口,即不对称PWM2模式。蓝色线条为2P端口,即PWM2模式。下载选项和使用的硬件如下图所示


1.首先PWM频率 = 时钟/(分频+1)/ARR/2 = 24M / 256/8/2 ≈ 5.86Khz,和示波器测的的频率基本一致
2.按照我们的分析,实际上端口1应该在上升计数为3的时候变成高电平,下降计数为5的时候变为低电平,占空比为50%。端口2应该在上升计数为5的时候变成高电平,下降计数为5的时候变为低电平,例如下图所示,可以看到最终测量到的结果和这个一致,可见这个分析是正确的。



2)首先配置1P端口为不对称PWM模式2输出,2P端口PWM模式2输出

    PWM1_Duty = 3;
    PWM2_Duty = 5;

    PWMA_PSCRH = 0;
    PWMA_PSCRL = 255;
   
    PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMA_CCER2 = 0x00;

    PWMA_CCMR1X = 0x00;//端口1:称PWM2模式
    PWMA_CCMR1 = 0x70;
    PWMA_CCMR2X = 0x01;//端口2:不对PWM2模式
    PWMA_CCMR2 = 0x70;

    PWMA_CCER1 = 0x55; //配置通道输出使能和极性
    PWMA_CCER2 = 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_0; //选择 PWM1_0 通道
    PWMA_PS |= PWM2_0; //选择 PWM2_0 通道



我们下载进去实测一下:


可以看到这个波形就是我们预期的波形

3)最后我们来实现一下正交编码信号的波形。
通道1使用PWM2不对称模式,通道3使用不对称PWM2模式
    PWM1_Duty = 0;
    PWM2_Duty = 8;
    PWM3_Duty = 4;
    PWM4_Duty = 4;

    PWMA_PSCRH = 0;
    PWMA_PSCRL = 255;
   
    PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMA_CCER2 = 0x00;

    PWMA_CCMR1X = 0x01;//通道1:PWM2不对称模式
    PWMA_CCMR1 = 0x70;
    PWMA_CCMR2X = 0x00;//通道2:PWM2模式,极性反转
    PWMA_CCMR2 = 0x70;   

    PWMA_CCMR3X = 0x01;//通道3:不对称PWM2模式
    PWMA_CCMR3 = 0x70;
    PWMA_CCMR4X = 0x00;//通道4:PWM2模式
    PWMA_CCMR4 = 0x70;

    PWMA_CCER1 = 0x55; //配置通道输出使能和极性
    PWMA_CCER2 = 0x55;

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

    PWMA_ENO = 0x00;
    PWMA_ENO |= ENO1P; //使能输出
    PWMA_ENO |= ENO3P; //使能输出

    PWMA_PS = 0x00;//高级 PWM 通道输出脚选择位
    PWMA_PS |= PWM1_0; //选择 PWM1_0 通道
    PWMA_PS |= PWM2_0; //选择 PWM2_0 通道
    PWMA_PS |= PWM3_0; //选择 PWM3_0 通道
    PWMA_PS |= PWM4_0; //选择 PWM4_0 通道最后下载到单片机看下最终的波形效果。


之所以这里要用硬件,就是频率可以很快,且不需要进中断即可实现。(代码里为了方便测量将PSC分频寄存器配置了255,实际上这个改为0,即不分频速度分分钟能到Mhz级别,效果如下)


{:5_344:}




21cnxin 发表于 2024-4-15 15:45:43

{:4_250:}

电子DIY小家 发表于 2024-4-15 15:54:05

下一章节预告:
组合PWM实现任意相位差的PWM


电子DIY小家 发表于 2024-4-16 11:29:02

PWM硬件移相测试卡教程(四)组合PWM(180度移相互补输出)@STC8H2K12U系列
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7805
(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)



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)

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

本帖最后由 电子DIY小家 于 2024-4-16 15:01 编辑


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

神农鼎 发表于 2024-4-16 13:12:01

电子DIY小家 发表于 2024-4-16 11:34
插个广告,需要配套硬件测试的可以从如下链接购买(特价14.99):
https://item.taobao.com/item.htm ......

连接要重新贴下

电子DIY小家 发表于 2024-4-16 15:01:47

神农鼎 发表于 2024-4-16 13:12
连接要重新贴下

收到,感谢姚总
页: [1]
查看完整版本: PWM硬件移相测试卡教程(三)不对称PWM(高速正交编码信号输出)@STC