找回密码
 立即注册
查看: 1877|回复: 7

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

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

47

主题

1350

回帖

8058

积分

荣誉版主

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

积分
8058
QQ
发表于 2024-4-15 15:38:23 | 显示全部楼层 |阅读模式
本帖最后由 电子DIY小家 于 2024-4-15 15:50 编辑

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

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

再来看下手册这部分,可以看到PWM模式1其实就是PWM模式2的反过来的波形
截图202404151309596247.jpg
当然上面的都是边沿计数,还有一种中心对齐的计数
截图202404151314072179.jpg

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



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

再画个简单的示意图:
截图202404151353024479.jpg

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

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

手册上关于这个模式的描述就这么一页,我给他归纳总结了一下:
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.设置为中心对齐计数
截图202404151403257704.jpg


2.手动使能不对称模式
截图202404151406145077.jpg

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

3.通道比较数值设置
截图202404151408322450.jpg


四、代码实战
首先我们可以看下来验证一下第二章里的第四点4.1P端口设置为不对称输出时起始电平时间点为CCR1,结束时间点为CCR2;  2P端口设置为不对称输出时起始电平时间点为CCR2,结束时间点为CCR1)是什么意思:
1)首先配置1P端口为不对称PWM模式2输出,2P端口PWM模式2输出
  1.     PWM1_Duty = 3;
  2.     PWM2_Duty = 5;
  3.     PWMA_PSCRH = 0;
  4.     PWMA_PSCRL = 255;
  5.    
  6.     PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  7.     PWMA_CCER2 = 0x00;
  8.     PWMA_CCMR1X = 0x01;//端口1:不对称PWM2模式
  9.     PWMA_CCMR1 = 0x70;
  10.     PWMA_CCMR2X = 0x00;//端口2:PWM2模式
  11.     PWMA_CCMR2 = 0x70;
  12.     PWMA_CCER1 = 0x55; //配置通道输出使能和极性
  13.     PWMA_CCER2 = 0x55;
  14.     PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
  15.     PWMA_ARRL = (u8)PWM_PERIOD;
  16.     PWMA_ENO = 0x00;
  17.     PWMA_ENO |= ENO1P; //使能输出
  18.     PWMA_ENO |= ENO2P; //使能输出
  19.     PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
  20.     PWMA_PS |= PWM1_0; //选择 PWM1_0 通道
  21.     PWMA_PS |= PWM2_0; //选择 PWM2_0 通道
复制代码
截图202404151417484776.jpg

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

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


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

  1.     PWM1_Duty = 3;
  2.     PWM2_Duty = 5;
  3.     PWMA_PSCRH = 0;
  4.     PWMA_PSCRL = 255;
  5.    
  6.     PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  7.     PWMA_CCER2 = 0x00;
  8.     PWMA_CCMR1X = 0x00;//端口1:称PWM2模式
  9.     PWMA_CCMR1 = 0x70;
  10.     PWMA_CCMR2X = 0x01;//端口2:不对PWM2模式
  11.     PWMA_CCMR2 = 0x70;
  12.     PWMA_CCER1 = 0x55; //配置通道输出使能和极性
  13.     PWMA_CCER2 = 0x55;
  14.     PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
  15.     PWMA_ARRL = (u8)PWM_PERIOD;
  16.     PWMA_ENO = 0x00;
  17.     PWMA_ENO |= ENO1P; //使能输出
  18.     PWMA_ENO |= ENO2P; //使能输出
  19.     PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
  20.     PWMA_PS |= PWM1_0; //选择 PWM1_0 通道
  21.     PWMA_PS |= PWM2_0; //选择 PWM2_0 通道
复制代码

截图202404151436011936.jpg

我们下载进去实测一下:
截图202404151436465269.jpg

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

3)最后我们来实现一下正交编码信号的波形。
通道1使用PWM2不对称模式,通道3使用不对称PWM2模式
  1.     PWM1_Duty = 0;
  2.     PWM2_Duty = 8;
  3.     PWM3_Duty = 4;
  4.     PWM4_Duty = 4;
  5.     PWMA_PSCRH = 0;
  6.     PWMA_PSCRL = 255;
  7.    
  8.     PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  9.     PWMA_CCER2 = 0x00;
  10.     PWMA_CCMR1X = 0x01;//通道1:PWM2不对称模式
  11.     PWMA_CCMR1 = 0x70;
  12.     PWMA_CCMR2X = 0x00;//通道2:PWM2模式,极性反转
  13.     PWMA_CCMR2 = 0x70;   
  14.     PWMA_CCMR3X = 0x01;//通道3:不对称PWM2模式
  15.     PWMA_CCMR3 = 0x70;
  16.     PWMA_CCMR4X = 0x00;//通道4:PWM2模式
  17.     PWMA_CCMR4 = 0x70;
  18.     PWMA_CCER1 = 0x55; //配置通道输出使能和极性
  19.     PWMA_CCER2 = 0x55;
  20.     PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
  21.     PWMA_ARRL = (u8)PWM_PERIOD;
  22.     PWMA_ENO = 0x00;
  23.     PWMA_ENO |= ENO1P; //使能输出
  24.     PWMA_ENO |= ENO3P; //使能输出
  25.     PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
  26.     PWMA_PS |= PWM1_0; //选择 PWM1_0 通道
  27.     PWMA_PS |= PWM2_0; //选择 PWM2_0 通道
  28.     PWMA_PS |= PWM3_0; //选择 PWM3_0 通道
  29.     PWMA_PS |= PWM4_0; //选择 PWM4_0 通道
复制代码
最后下载到单片机看下最终的波形效果。
截图202404151531554745.jpg

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

{:5_344:}

PWM不对称输出.rar (44.46 KB, 下载次数: 160)


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:41
  • 最近打卡:2025-03-13 12:10:59

3

主题

20

回帖

731

积分

高级会员

积分
731
发表于 2024-4-15 15:45:43 | 显示全部楼层
回复

使用道具 举报 送花

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

47

主题

1350

回帖

8058

积分

荣誉版主

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

积分
8058
QQ
发表于 2024-4-15 15:54:05 | 显示全部楼层
下一章节预告:
组合PWM实现任意相位差的PWM

截图202404152017426510.jpg
回复 支持 反对

使用道具 举报 送花

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

47

主题

1350

回帖

8058

积分

荣誉版主

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

积分
8058
QQ
发表于 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)

回复 支持 反对

使用道具 举报 送花

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

47

主题

1350

回帖

8058

积分

荣誉版主

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

积分
8058
QQ
发表于 2024-4-16 11:34:53 | 显示全部楼层
本帖最后由 电子DIY小家 于 2024-4-16 15:01 编辑

截图202404161134509994.jpg
插个广告,需要配套硬件测试的可以从如下链接购买(特价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
回复 支持 反对

使用道具 举报 送花

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

717

主题

1万

回帖

1万

积分

管理员

积分
15611
发表于 2024-4-16 13:12:01 | 显示全部楼层
电子DI*** 发表于 2024-4-16 11:34
插个广告,需要配套硬件测试的可以从如下链接购买(特价14.99):
https://item.taobao.com/item.htm ...  ...

连接要重新贴下

点评

收到,感谢姚总  详情 回复 发表于 2024-4-16 15:01
回复 支持 反对

使用道具 举报 送花

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

47

主题

1350

回帖

8058

积分

荣誉版主

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

积分
8058
QQ
发表于 2024-4-16 15:01:47 | 显示全部楼层
神*** 发表于 2024-4-16 13:12
连接要重新贴下

收到,感谢姚总
回复 支持 反对

使用道具 举报 送花

已绑定手机

0

主题

3

回帖

26

积分

新手上路

积分
26
发表于 2025-3-6 15:34:25 | 显示全部楼层
感谢大佬,讲的很明白通透
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 23:20 , Processed in 0.137784 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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