【dsPIC33】PWM系列之互补PWM与中心对齐模式

前言

上篇文章讲到简易的PWM,对于电机控制来说,常用的还是互补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的输出上做手脚,也就是减少配置的上官输出。而负死区则相反。这里,我们配置成正死区。
程序如下:

//振荡器配置
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<a class="decoration-color" href="https://buy.icxbk.com/index.php?ctl=Product&met=lists&category_id=1047" target="_blank">模块</a>
    /@@*频率  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)
    {
    }
}

波形如图:

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

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

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

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

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

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

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

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

//振荡器配置
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)
    {
    }
}

波形:

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值