可靠的MCU伙伴
Design for Reliability
全国服务咨询热线
0757-8185 9361

SWM20x系列电机框架搭建:PWM(电机)篇



SWM201系列所有型号PWM操作均相同,不同型号PWM通道数可能不同。使用前需使能PWM模块时钟。PWM模块用于实现芯片输出特定的方波,控制外部元器件,如步进电机等。

计数器可以通过APB总线读写寄存器、和外部硬件同时控制,实现计数过程的控制。同时,CPU和外部硬件也可以共同实现对输出PWM信号的控制。

PWM模块提供了2组(PWM0PMW1)、8路(PWM0APWM0BPWM0ANPWM0BNPWM2APWM2BPWM2ANPWM2BN)独立通道,支持边沿模式、中心对称模式。

中心对称模式下,输出是互补输出。如PWM0A驱动PWM0APWM0AN两个输出信号,两个信号周期相等、电平值相反,且可设置死区。

中心对齐模式下计数器启动与停止波形:

中心对齐模式下PWM信号产生波形

程序中配置如下(SWM201内置PN预驱):

static void PWM_Init (void)

{

    PWM_InitStructure   PWM_initStruct;

   

    PORT_Init(PORTA, PIN5, PORTA_PIN5_PWM1AN,   0);

      PORT_Init(PORTA, PIN4, PORTA_PIN4_PWM1BN,   0);

    PORT_Init(PORTA, PIN3, PORTA_PIN3_PWM0AN,   0);

    PORT_Init(PORTA, PIN2, PORTA_PIN2_PWM1A, 0);

    PORT_Init(PORTA, PIN1, PORTA_PIN1_PWM1B,   0);

    PORT_Init(PORTA, PIN0, PORTA_PIN0_PWM0A, 0);

    //PWM引脚初始化

    PWM_initStruct.Mode = PWM_CENTER_ALIGNED;

    //中心对齐模式

    PWM_initStruct.Clkdiv = 1;                   

//分频F_PWM = 60M/1 = 60M   

    PWM_initStruct.Period =10000;               

//周期:60M/6000 = 1KHz,中心对称模式下频率//降低到500Hz

    PWM_initStruct.HdutyA = 2500;                //占空比2000/10000 = 25%

    PWM_initStruct.DeadzoneA = 50;                //死区时间50/60M

    PWM_initStruct.IdleLevelA = 0;               //停止状态下PWMxA输出电平

    PWM_initStruct.IdleLevelAN= 0;              //停止状态下PWMxAN输出电平

    PWM_initStruct.OutputInvA = 0;              //PWMxA输出取反

    PWM_initStruct.OutputInvAN= 0;              //PWMxAN输出取反

    PWM_initStruct.HdutyB =   1500;               

    PWM_initStruct.DeadzoneB = 50;       

    PWM_initStruct.IdleLevelB = 0;

    PWM_initStruct.IdleLevelBN= 0;

    PWM_initStruct.OutputInvB = 0;

    PWM_initStruct.OutputInvBN= 0;

    PWM_initStruct.UpOvfIE    = 0;

    PWM_initStruct.DownOvfIE   = 0;

    PWM_initStruct.UpCmpAIE   = 1;        //开启上升沿比较器PWM0A匹配中断使能

    PWM_initStruct.DownCmpAIE = 0;

    PWM_initStruct.UpCmpBIE   = 0;

    PWM_initStruct.DownCmpBIE = 0;

    PWM_Init(PWM0, &PWM_initStruct);

      PWM_initStruct.UpCmpAIE   = 0;     //屏蔽PWM1A中断

    PWM_Init(PWM1, &PWM_initStruct);

   

    PWM_Start(PWM0_MSK | PWM1_MSK);   

//启动PWM,开始PWM输出

PWM_OutMask(PWM1, PWM_CH_B, PWM_EVT_1, 0, PWM_EVT_1, 1);   

//挖坑功能设置:PWM1BPWM1BNevent1为高时分别输出01

    PWM_CmpTrigger(PWM0, 750, PWM_DIR_UP, 40, PWM_TRG_1, 1);   

//设置ADC采样点ADC采样设置请查看“SWM20x系列电机框架搭建:ADC”)

}

TRIGGER控制:

PWM模块在计数过程中,可以根据配置输出三种trigger信号:

1PWM计数器比较匹配触发:PWM计数器在计数过程中,当计到TRIG_CNT中配置的参考值时,就会产生一个周期的trig信号。根据配置,可以将该trig信息映射到输出的trig[7:0]信号上,且输出宽度可以配置,以4个计数周期为单位进行设置,最小长度为0个(即不输出PWM_TRIG,只输出ADC_TRIG),最大长度为252个计数当重复计数功能有效时,trig信号会在最后一次重复计数时产生。

2ADC触发:在PWM_TRIG输出宽度的正中间,会输出一个pclkADC_TRIG信号,用于触发ADC采样。

3PWM计数器溢出触发:当计数器溢出TRIG使能,且计数器发生向上溢出或向下溢出时,会产生一个pclk周期的TRIG信号,与自定义TRIG一致,可以根据配置将该trig信息映射到输出的trig[7:0]信号上。TRIGGER控制波形如下图所示:

触发SARADC采样:

PWM在任意模式下可以触发ADC,每一路输出独立的ADC触发信号,且每个周期可以设置1ADC触发点,每个PWM只输出一个触发信号,不区分A.B分别触发。将SARADC配置寄存器(CTRL)中TRIG方式设置为PWM触发。每路PWM对应1ADTRG值,当PWM计数到指定值,可触发ADC进行采样。具体配置方式如下:

配置PWMx路触发ADC控制寄存器,设置触发点是否有效以及PWM触发ADC时间点

配置ADC的触发方式为PWM触发

使能PWM模块EN位,当计数值到达MATCH设置值时,触发ADC配置寄存器(CTRL)中选中的通道(CHx)进行采样,采样完成后,将产生EOC标志位,并产生ADC中断