电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
【dsPIC33】PWM系列之互补PWM与中心对齐模式
分 享
扫描二维码分享
【dsPIC33】PWM系列之互补PWM与中心对齐模式
dsPIC33
互补PWM
中心对齐模式
KVIN
关注
发布时间: 2019-11-04
丨
阅读: 3274
# 前言 上篇文章讲到简易的PWM,对于电机控制来说,常用的还是互补PWM,如果做FOC,还会用到中心对齐模式(中央对齐模式)。下面就来说说dsPIC33E芯片的互补PWM与中心对齐模式的PWM。 首先,先配置PWM引脚为互补输出模式,然后再配置相应的引脚。这一部分在IOCONx寄存器: ![](https://cf01.ickimg.com/bbsimages/201911/fae45301b19682f61e8a0bd8564bbaee.png) 由上可知,PMOD位要配置成互补输出模式,PENH,PENL要配置成1,POLH,POLL要配置成0,因为我们是高电平有效的,综上,让IOCON1 = IOCON2 = IOCON3 = 0xC000即可。 之后便是PWM周期配置,上一篇文章提到,在不同的功能配置下,同一个寄存器可能会有不同的意思,尤其是注意周期控制寄存器。像之前一样,我们首先需要明确这个互补PWM要使用什么模式。最常用的就是独立占空比,独立相位,固定著周期,边沿对齐,那么就开始看这个模式的具体手册: ![](https://cf01.ickimg.com/bbsimages/201911/394d58f7e76a98c5f11e13af41752653.png) 由上可知,使用这种互补PWM模式时,是由PDCx来控制占空比,由PTPER来控制周期,PHASEx控制相移,由DTRx与ALTDTERx分别控制上下脚的死区。在这里,依然使用15k的频率,由目标15k频率,以及使用的系统时钟为60M,使用1分频,可以计算出周期寄存器的值为8000,详细的计算过程在上一篇文章有说明,请查看:https://www.icxbk.com/article/detail/1011.html 。 之后便是独立占空比相位,固定主周期,边沿对齐的配置,在PWMCONx寄存器中: ![](https://cf01.ickimg.com/bbsimages/201911/82fb57c36d2fa9d2eeb35a8705e68739.png) ![](https://cf01.ickimg.com/bbsimages/201911/41fcd6195be09e873b0247d27416774b.png) 在这里,需要注意一下这个DTC寄存器,也就是死区控制位,是选择正死区还是负死区。这就需要了解这个正死区与负死区是什么意思: ![](https://cf01.ickimg.com/bbsimages/201911/bce1596ba3704917761aa3fbbe94c3ee.png) ![](https://cf01.ickimg.com/bbsimages/201911/6a4bdc94a64b592d98f2283008ed31af.png) 由上图的两个对比就可以看出:正死区是在上管PWMxH的输出上做手脚,也就是减少配置的上官输出。而负死区则相反。这里,我们配置成正死区。 程序如下: ```c //振荡器配置 void System_Colck(void) { //产生Fosc = 120MHz 芯片以60MIPS工作 CLKDIVbits.PLLPRE = 0;//N1 = 2 PLLFBDbits.PLLDIV = 58;//M = 60 CLKDIVbits.PLLPOST = 0;//N2 = 2 8 * (60 / (2 + 2)) = 120M while (OSCCONbits.COSC!= 0b011); while (OSCCONbits.LOCK!= 1) {};//PLL 处于锁定状态 } //32位定时器配置 void Pwm_Init(void)//定时器模式 { /@@*先关闭PWM 在 PTEN = 0 的情况下,才能修改PWM配置*/ PTCONbits.PTEN = 0; //失能高速PWM模块 /@@*频率 15K*/ PTPER = 8000; /@@*相移*/ PHASE1 = PHASE2 = PHASE3 = 0; /@@*初始占空比*/ PDC1 = 1000; PDC2 = 2000; PDC3 = 3000; /@@*死区时间配置*/ DTR1 = DTR2 = DTR3 = 25;//PWM 死区寄存器 控制PWMxH的死区 ALTDTR1 = ALTDTR2 = ALTDTR3 = 25;//PWM 备用死区寄存器 控制PWMxL的死区 /@@*PWM输出引脚控制*/ IOCON1 = IOCON2 = IOCON3 = 0xC000; /@@*设置主时基,边沿对齐模式,正死区和独立占空比 互补PWM模式*/ PWMCON1 = PWMCON2 = PWMCON3 = 0x0000; /@@*配置故障*/ FCLCON1 = FCLCON2 = FCLCON3 = 0x0003; /@@*最大预分频比 1分频*/ PTCON2 = 0x0000;//PWM 时钟分频比选择寄存器 PTCONbits.PTEN = 1; //使能高速PWM模块 } int main(void) { System_Colck(); //时钟振荡器配置 Pwm_Init(); //PWM配置 while(1) { } } ``` 波形如图: ![](https://cf01.ickimg.com/bbsimages/201911/c6320ced7c57d6e6f2f0cfb9f1a77288.png) 接下来就是在互补PWM的基础上配置中心对齐模式,因为中心对齐模式也需要用互补的方式。 ![](https://cf01.ickimg.com/bbsimages/201911/0393780d86f2ad983ea908ec0d9efa5c.png) 由上可知,中心对齐模式下,周期寄存器与普通互补PWM模式是不同的,原来的相移寄存器PHASEx在此时变成了周期寄存器,这点要注意。除此之外,死区寄存器在中心对齐模式下也由两个变成了一个,也就是说只有ALTDTRx寄存器控制死区。 注意:中心对齐模式其实就是一个PWM周期对称一下,然后两个原PWM周期组成一个新PWM周期,也就是说上面的互补PWM模式中的周期值是8000,在中央对齐模式下,给4000即可。 验证中心对齐模式的方法也比较简单:如图所示: ![](https://cf01.ickimg.com/bbsimages/201911/fa69c4ce8a0bacafc268c4d1c2268f3a.png) 如图中的注释,验证中心对齐模式是否正确,只需要测试两组PWM的上管在不同占空比下会不会错开。 ![](https://cf01.ickimg.com/bbsimages/201911/bfaeacd412a56afac75960ede225f604.png) 注意手册中PWMCONx寄存器中的这句话,只有ITB=1的时候,才能使用中心对齐模式: ![](https://cf01.ickimg.com/bbsimages/201911/bf5260622d91e292027abd5aab0b79eb.png) 在手册中对于正死区的描述可以找到这句话: ![](https://cf01.ickimg.com/bbsimages/201911/16291e22372fdac8a19f05b5e43dc21b.png) 也就是如上所说,DTRx寄存器在中心对齐模式中是没有作用的。 代码如下: ```c //振荡器配置 void System_Colck(void) { //产生Fosc = 120MHz 芯片以60MIPS工作 CLKDIVbits.PLLPRE = 0;//N1 = 2 PLLFBDbits.PLLDIV = 58;//M = 60 CLKDIVbits.PLLPOST = 0;//N2 = 2 8 * (60 / (2 + 2)) = 120M while (OSCCONbits.COSC!= 0b011); while (OSCCONbits.LOCK!= 1) {};//PLL 处于锁定状态 } //32位定时器配置 void Pwm_Init(void)//定时器模式 { /@@*先关闭PWM 在 PTEN = 0 的情况下,才能修改PWM配置*/ PTCONbits.PTEN = 0; //失能高速PWM模块 /@@*中央对齐模式的周期由 PHASEx/SPHASEx决定 15K*/ PHASE1 = PHASE2 = PHASE3 = 4000; /@@*初始占空比*/ PDC1 = 1000; PDC2 = 2000; PDC3 = 3000; /@@*死区时间配置*/ DTR1 = DTR2 = DTR3 = 0;//PWM 死区寄存器 控制PWMxH的死区 中心对齐模式下无作用 ALTDTR1 = ALTDTR2 = ALTDTR3 = 25;//PWM 备用死区寄存器 控制PWMxL的死区 /@@*PWM输出引脚控制*/ IOCON1 = IOCON2 = IOCON3 = 0xC000; /@@*设置主时基,边沿对齐模式,正死区和独立占空比 中央对齐模式*/ PWMCON1bits.ITB = 1; PWMCON1bits.CAM = 1; PWMCON2bits.ITB = 1; PWMCON2bits.CAM = 1; PWMCON3bits.ITB = 1; PWMCON3bits.CAM = 1; /@@*配置故障*/ FCLCON1 = FCLCON2 = FCLCON3 = 0x0000; /@@*最大预分频比 1分频*/ PTCON2 = 0x0000;//PWM 时钟分频比选择寄存器 PTCONbits.PTEN = 1; //使能高速PWM模块 } int main(void) { System_Colck(); //时钟振荡器配置 Pwm_Init(); //PWM配置 while(1) { } } ``` 波形: ![](https://cf01.ickimg.com/bbsimages/201911/38b951739709e32ab48383b24e5c1d0c.png)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
KVIN
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交