|
|
#include "SWM221.h"
|
|
|
|
|
|
|
|
|
int main(void)
|
|
|
{
|
|
|
PWM_InitStructure PWM_initStruct;
|
|
|
|
|
|
SystemInit();
|
|
|
|
|
|
GPIO_Init(GPIOA, PIN8, 1, 0, 0, 0); //调试指示引脚
|
|
|
|
|
|
PORT_Init(PORTA, PIN3, PORTA_PIN3_PWM0A, 0);
|
|
|
PORT_Init(PORTA, PIN2, PORTA_PIN2_PWM0AN, 0);
|
|
|
PORT_Init(PORTA, PIN6, PORTA_PIN6_PWM0B, 0);
|
|
|
PORT_Init(PORTA, PIN7, PORTA_PIN7_PWM0BN, 0);
|
|
|
|
|
|
PORT_Init(PORTA, PIN5, PORTA_PIN5_PWM1A, 0);
|
|
|
PORT_Init(PORTA, PIN4, PORTA_PIN4_PWM1AN, 0);
|
|
|
PORT_Init(PORTA, PIN1, PORTA_PIN1_PWM1B, 0);
|
|
|
PORT_Init(PORTA, PIN0, PORTA_PIN0_PWM1BN, 0);
|
|
|
|
|
|
PWM_initStruct.Mode = PWM_EDGE_ALIGNED;
|
|
|
PWM_initStruct.Clkdiv = 6; //F_PWM = 60M/6 = 10M
|
|
|
PWM_initStruct.Period = 1000; //10M/1000 = 10KHz
|
|
|
PWM_initStruct.HdutyA = 250; //250/1000 = 25%
|
|
|
PWM_initStruct.DeadzoneA = 50;
|
|
|
PWM_initStruct.IdleLevelA = 0;
|
|
|
PWM_initStruct.IdleLevelAN= 0;
|
|
|
PWM_initStruct.OutputInvA = 0;
|
|
|
PWM_initStruct.OutputInvAN= 0;
|
|
|
PWM_initStruct.HdutyB = 500; //500/1000 = 50%
|
|
|
PWM_initStruct.DeadzoneB = 5;
|
|
|
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 = 0;
|
|
|
PWM_initStruct.DownCmpAIE = 0;
|
|
|
PWM_initStruct.UpCmpBIE = 0;
|
|
|
PWM_initStruct.DownCmpBIE = 0;
|
|
|
PWM_Init(PWM0, &PWM_initStruct);
|
|
|
PWM_Init(PWM1, &PWM_initStruct);
|
|
|
|
|
|
PWM_Start(PWM0_MSK | PWM1_MSK);
|
|
|
|
|
|
/* 刹车(Brake)功能演示 */
|
|
|
#if 0
|
|
|
#if 1
|
|
|
PORT_Init(PORTB, PIN14, PORTB_PIN14_PWM_BRK0, 1); //PB14切换为PWM_BRK0功能
|
|
|
PORTB->PULLU |= (1 << PIN14);
|
|
|
PORT_Init(PORTB, PIN6, PORTB_PIN6_PWM_BRK1, 1); //PB6 切换为PWM_BRK1功能
|
|
|
PORTB->PULLU |= (1 << PIN6);
|
|
|
#else // 比较器输出作为刹车信号
|
|
|
PORT_Init(PORTB, PIN6, PORTB_PIN6_ACMP0_INP0, 0);
|
|
|
PORT_Init(PORTB, PIN5, PORTB_PIN5_ACMP0_INP1, 0);
|
|
|
PORT_Init(PORTB, PIN4, PORTB_PIN4_ACMP0_INP2, 0);
|
|
|
PORT_Init(PORTB, PIN3, PORTB_PIN3_ACMP0_INN, 0);
|
|
|
PORT_Init(PORTA, PIN14, PORTA_PIN14_ACMP1_INP, 0);
|
|
|
PORT_Init(PORTA, PIN12, PORTA_PIN12_ACMP1_INN, 0);
|
|
|
|
|
|
SYS->ACMP0CR |= (1 << SYS_ACMP0CR_EN_Pos) |
|
|
|
(1 << SYS_ACMP0CR_HYS_Pos) |
|
|
|
(1 << SYS_ACMP0CR_VNSEL_Pos) |
|
|
|
(0 << SYS_ACMP0CR_VPSEL_Pos) |
|
|
|
(1 << SYS_ACMP0CR_TOPWM_Pos);
|
|
|
|
|
|
SYS->ACMP1CR |= (1 << SYS_ACMP1CR_EN_Pos) |
|
|
|
(1 << SYS_ACMP1CR_HYS_Pos) |
|
|
|
(1 << SYS_ACMP1CR_VNSEL_Pos) |
|
|
|
(0 << SYS_ACMP1CR_VPSEL_Pos) |
|
|
|
(1 << SYS_ACMP1CR_TOPWM_Pos);
|
|
|
|
|
|
SYS->ACMPCR = (1 << SYS_ACMPCR_DACEN_Pos) |
|
|
|
(0 << SYS_ACMPCR_DACVR_Pos) |
|
|
|
(100 << SYS_ACMPCR_DACDR_Pos); // Vout = 100 / 255 * VDD
|
|
|
#endif
|
|
|
PWM_BrkInPolarity(PWM_BRK0 | PWM_BRK1 | PWM_BRK2, 0); //PWM_BRK0、PWM_BRK1、PWM_BRK2 低电平刹车
|
|
|
|
|
|
PWM_BrkConfig(PWM0, PWM_CH_A, PWM_BRK0 | PWM_BRK1, 0, 1, 1, 0); //PWM0通道A 受刹车输入 PWM_BRK0和PWM_BRK1 控制
|
|
|
PWM_BrkConfig(PWM0, PWM_CH_B, PWM_BRK0 | PWM_BRK1, 0, 1, 1, 0); //PWM0通道B 受刹车输入 PWM_BRK0和PWM_BRK1 控制
|
|
|
PWM_BrkConfig(PWM1, PWM_CH_A, PWM_BRK2, 0, 1, 1, 0); //PWM1通道A 受刹车输入 PWM_BRK2 控制
|
|
|
|
|
|
/* 刹车(Brake)中断功能演示 */
|
|
|
#if 0
|
|
|
PWM_BrkIntEn(PWM_BRKIT_BRK0);
|
|
|
NVIC_EnableIRQ(PWMBRK_IRQn);
|
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
/* 软件刹车(Software Brake)功能演示 */
|
|
|
#if 0
|
|
|
PWM_BrkConfig(PWM0, PWM_CH_A, 0, 0, 1, 1, 0); //PWM0通道A 不受刹车输入影响,只能软件刹车
|
|
|
PWM_BrkConfig(PWM0, PWM_CH_B, 0, 0, 1, 1, 0); //PWM0通道B 不受刹车输入影响,只能软件刹车
|
|
|
|
|
|
while(1)
|
|
|
{
|
|
|
GPIO_SetBit(GPIOA, PIN8);
|
|
|
PWMG->SWBRK |= (PWMG_SWBRK_PWM0A_Msk | //软件触发PWM0A和PWM0B的刹车动作
|
|
|
PWMG_SWBRK_PWM0B_Msk);
|
|
|
for(int i = 0; i < 300000; i++) {}
|
|
|
|
|
|
GPIO_ClrBit(GPIOA, PIN8);
|
|
|
PWMG->SWBRK &=~(PWMG_SWBRK_PWM0A_Msk | //撤销PWM0A和PWM0B的软件刹车,恢复正常输出
|
|
|
PWMG_SWBRK_PWM0B_Msk);
|
|
|
for(int i = 0; i < 900000; i++) {}
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
while(1==1)
|
|
|
{
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void PWMBRK_Handler(void)
|
|
|
{
|
|
|
if(PWM_BrkIntStat(PWM_BRKIT_BRK0))
|
|
|
{
|
|
|
PWM_BrkIntDis(PWM_BRKIT_BRK0); //必须关掉刹车中断,否则刹车期间不停触发中断
|
|
|
|
|
|
GPIO_InvBit(GPIOA, PIN8);
|
|
|
}
|
|
|
}
|