SWM201系列所有型号PWM操作均相同,不同型号PWM通道数可能不同。使用前需使能PWM模块时钟。PWM模块用于实现芯片输出特定的方波,控制外部元器件,如步进电机等。
计数器可以通过APB总线读写寄存器、和外部硬件同时控制,实现计数过程的控制。同时,CPU和外部硬件也可以共同实现对输出PWM信号的控制。
PWM模块提供了2组(PWM0、PMW1)、8路(PWM0A、PWM0B、PWM0AN、PWM0BN、PWM2A、PWM2B、PWM2AN、PWM2BN)独立通道,支持边沿模式、中心对称模式。
中心对称模式下,输出是互补输出。如PWM0A驱动PWM0A和PWM0AN两个输出信号,两个信号周期相等、电平值相反,且可设置死区。
程序中配置如下(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);
//挖坑功能设置:PWM1B和PWM1BN在event1为高时分别输出0和1
PWM_CmpTrigger(PWM0, 750, PWM_DIR_UP, 40, PWM_TRG_1, 1);
//设置ADC采样点(ADC采样设置请查看“SWM20x系列电机框架搭建:ADC篇”)
}
TRIGGER控制:
PWM模块在计数过程中,可以根据输出三种trigger信号:
01
PWM计数器比较匹配触发:PWM计数器在计数过程中,当计到TRIG_CNT中配置的参考值时,就会产生一个周期的trig信号。根据配置,可以将该trig信息映射到输出的trig[7:0]信号上,且输出宽度可以配置,以4个计数周期为单位进行设置,最小长度为0个(即不输出PWM_TRIG,只输出ADC_TRIG),最大长度为252个计数当重复计数功能有效时,trig信号会在最后一次重复计数时产生。
02
ADC触发:在PWM_TRIG输出宽度的正中间,会输出一个pclk的ADC_TRIG信号,用于触发ADC采样。
03
PWM计数器溢出触发:当计数器溢出TRIG使能,且计数器发生向上溢出或向下溢出时,会产生一个pclk周期的TRIG信号,与自定义TRIG一致,可以根据配置将该trig信息映射到输出的trig[7:0]信号上。TRIGGER控制波形如下图所示:
触发SARADC采样:
PWM在任意模式下可以触发ADC,每一路输出独立的ADC触发信号,且每个周期可以设置1个ADC触发点,每个PWM只输出一个触发信号,不区分A.B分别触发。将SARADC配置寄存器(CTRL)中TRIG方式设置为PWM触发。每路PWM对应1个ADTRG值,当PWM计数到指定值,可触发ADC进行采样。具体配置方式如下:
配置PWMx路触发ADC控制寄存器,设置触发点是否有效以及PWM触发ADC时间点。
配置ADC的触发方式为PWM触发
使能PWM模块EN位,当计数值到达MATCH设置值时,触发ADC配置寄存器(CTRL)中选中的通道(CHx)进行采样,采样完成后,将产生EOC标志位,并产生ADC中断。
编辑:jq
全部0条评论
快来发表一下你的评论吧 !