7477|4

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【转载】PWM系列之互补PWM与中心对齐模式 [复制链接]

原文作者是:KVIN 转载自此 

对于电机控制来说,常用的还是互补PWM,如果做FOC,还会用到中心对齐模式(中央对齐模式)。下面就来说说dsPIC33E芯片的互补PWM与中心对齐模式的PWM。

首先,先配置PWM引脚为互补输出模式,然后再配置相应的引脚。这一部分在IOCONx寄存器:

由上可知,PMOD位要配置成互补输出模式,PENH,PENL要配置成1,POLH,POLL要配置成0,因为我们是高电平有效的,综上,让IOCON1 = IOCON2 = IOCON3 = 0xC000即可。

之后便是PWM周期配置,上一篇文章提到,在不同的功能配置下,同一个寄存器可能会有不同的意思,尤其是注意周期控制寄存器。像之前一样,我们首先需要明确这个互补PWM要使用什么模式。最常用的就是独立占空比,独立相位,固定著周期,边沿对齐,那么就开始看这个模式的具体手册:

由上可知,使用这种互补PWM模式时,是由PDCx来控制占空比,由PTPER来控制周期,PHASEx控制相移,由DTRx与ALTDTERx分别控制上下脚的死区。在这里,依然使用15k的频率,由目标15k频率,以及使用的系统时钟为60M,使用1分频,可以计算出周期寄存器的值为8000。

之后便是独立占空比相位,固定主周期,边沿对齐的配置,在PWMCONx寄存器中:


在这里,需要注意一下这个DTC寄存器,也就是死区控制位,是选择正死区还是负死区。这就需要了解这个正死区与负死区是什么意思:


由上图的两个对比就可以看出:正死区是在上管PWMxH的输出上做手脚,也就是减少配置的上官输出。而负死区则相反。这里,我们配置成正死区。
程序如下:


 
  1. //振荡器配置
  2. void System_Colck(void)
  3. {
  4. //产生Fosc = 120MHz 芯片以60MIPS工作
  5. CLKDIVbits.PLLPRE = 0;//N1 = 2
  6. PLLFBDbits.PLLDIV = 58;//M = 60
  7. CLKDIVbits.PLLPOST = 0;//N2 = 2 8 * (60 / (2 + 2)) = 120M
  8. while (OSCCONbits.COSC!= 0b011);
  9. while (OSCCONbits.LOCK!= 1) {};//PLL 处于锁定状态
  10. }
  11.  
  12. //32位定时器配置
  13. void Pwm_Init(void)//定时器模式
  14. {
  15. /@@*先关闭PWM 在 PTEN = 0 的情况下,才能修改PWM配置*/
  16. PTCONbits.PTEN = 0; //失能高速PWM模块
  17.  
  18. /@@*频率 15K*/
  19. PTPER = 8000;
  20.  
  21. /@@*相移*/
  22. PHASE1 = PHASE2 = PHASE3 = 0;
  23.  
  24. /@@*初始占空比*/
  25. PDC1 = 1000;
  26. PDC2 = 2000;
  27. PDC3 = 3000;
  28.  
  29. /@@*死区时间配置*/
  30. DTR1 = DTR2 = DTR3 = 25;//PWM 死区寄存器 控制PWMxH的死区
  31. ALTDTR1 = ALTDTR2 = ALTDTR3 = 25;//PWM 备用死区寄存器 控制PWMxL的死区
  32.  
  33. /@@*PWM输出引脚控制*/
  34. IOCON1 = IOCON2 = IOCON3 = 0xC000;
  35.  
  36. /@@*设置主时基,边沿对齐模式,正死区和独立占空比 互补PWM模式*/
  37. PWMCON1 = PWMCON2 = PWMCON3 = 0x0000;
  38.  
  39.  
  40. /@@*配置故障*/
  41. FCLCON1 = FCLCON2 = FCLCON3 = 0x0003;
  42.  
  43. /@@*最大预分频比 1分频*/
  44. PTCON2 = 0x0000;//PWM 时钟分频比选择寄存器
  45.  
  46. PTCONbits.PTEN = 1; //使能高速PWM模块
  47. }
  48.  
  49. int main(void)
  50. {
  51. System_Colck(); //时钟振荡器配置
  52. Pwm_Init(); //PWM配置
  53.  
  54. while(1)
  55. {
  56.  
  57. }
  58. }

波形如图:

接下来就是在互补PWM的基础上配置中心对齐模式,因为中心对齐模式也需要用互补的方式。

由上可知,中心对齐模式下,周期寄存器与普通互补PWM模式是不同的,原来的相移寄存器PHASEx在此时变成了周期寄存器,这点要注意。除此之外,死区寄存器在中心对齐模式下也由两个变成了一个,也就是说只有ALTDTRx寄存器控制死区。

注意:中心对齐模式其实就是一个PWM周期对称一下,然后两个原PWM周期组成一个新PWM周期,也就是说上面的互补PWM模式中的周期值是8000,在中央对齐模式下,给4000即可。

验证中心对齐模式的方法也比较简单:如图所示:

如图中的注释,验证中心对齐模式是否正确,只需要测试两组PWM的上管在不同占空比下会不会错开。

注意手册中PWMCONx寄存器中的这句话,只有ITB=1的时候,才能使用中心对齐模式:

在手册中对于正死区的描述可以找到这句话:

也就是如上所说,DTRx寄存器在中心对齐模式中是没有作用的。
代码如下:


 
  1. //振荡器配置
  2. void System_Colck(void)
  3. {
  4. //产生Fosc = 120MHz 芯片以60MIPS工作
  5. CLKDIVbits.PLLPRE = 0;//N1 = 2
  6. PLLFBDbits.PLLDIV = 58;//M = 60
  7. CLKDIVbits.PLLPOST = 0;//N2 = 2 8 * (60 / (2 + 2)) = 120M
  8. while (OSCCONbits.COSC!= 0b011);
  9. while (OSCCONbits.LOCK!= 1) {};//PLL 处于锁定状态
  10. }
  11.  
  12. //32位定时器配置
  13. void Pwm_Init(void)//定时器模式
  14. {
  15. /@@*先关闭PWM 在 PTEN = 0 的情况下,才能修改PWM配置*/
  16. PTCONbits.PTEN = 0; //失能高速PWM模块
  17.  
  18. /@@*中央对齐模式的周期由 PHASEx/SPHASEx决定 15K*/
  19. PHASE1 = PHASE2 = PHASE3 = 4000;
  20.  
  21. /@@*初始占空比*/
  22. PDC1 = 1000;
  23. PDC2 = 2000;
  24. PDC3 = 3000;
  25.  
  26. /@@*死区时间配置*/
  27. DTR1 = DTR2 = DTR3 = 0;//PWM 死区寄存器 控制PWMxH的死区 中心对齐模式下无作用
  28. ALTDTR1 = ALTDTR2 = ALTDTR3 = 25;//PWM 备用死区寄存器 控制PWMxL的死区
  29.  
  30. /@@*PWM输出引脚控制*/
  31. IOCON1 = IOCON2 = IOCON3 = 0xC000;
  32.  
  33. /@@*设置主时基,边沿对齐模式,正死区和独立占空比 中央对齐模式*/
  34. PWMCON1bits.ITB = 1;
  35. PWMCON1bits.CAM = 1;
  36. PWMCON2bits.ITB = 1;
  37. PWMCON2bits.CAM = 1;
  38. PWMCON3bits.ITB = 1;
  39. PWMCON3bits.CAM = 1;
  40.  
  41. /@@*配置故障*/
  42. FCLCON1 = FCLCON2 = FCLCON3 = 0x0000;
  43.  
  44. /@@*最大预分频比 1分频*/
  45. PTCON2 = 0x0000;//PWM 时钟分频比选择寄存器
  46.  
  47. PTCONbits.PTEN = 1; //使能高速PWM模块
  48. }
  49.  
  50. int main(void)
  51. {
  52. System_Colck(); //时钟振荡器配置
  53. Pwm_Init(); //PWM配置
  54.  
  55. while(1)
  56. {
  57.  
  58. }
  59. }

波形:

最新回复

我是原作者,这次管理员强制你加了转载出处,下次抄之前跟我说一下   详情 回复 发表于 2019-11-8 18:15
 
点赞 关注(1)

回复
举报

1366

帖子

6

TA的资源

版主

沙发
 

不错的分享,根据你的思路还可以再扩展为指定数目的互补脉冲,不知PIC32是否有重复计数器,可以通过重复计数器,在上下溢出的时候会产生一次更新事件或者中断,从而来精确控制指定数目的脉冲

 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 

回复

368

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

不错的分享。

 
 
 

回复

2618

帖子

0

TA的资源

纯净的硅(高级)

4
 

讲的太详细了,辛苦楼主啦。

 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

5
 

我是原作者,这次管理员强制你加了转载出处,下次抄之前跟我说一下

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表