You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
3.8 KiB
C

#include "SWM221.h"
int main(void)
{
PWM_InitStructure PWM_initStruct;
SystemInit();
GPIO_Init(GPIOA, PIN8, 1, 0, 0, 0); //<2F><><EFBFBD><EFBFBD>ָʾ<D6B8><CABE><EFBFBD><EFBFBD>
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);
/* ɲ<><C9B2><EFBFBD><EFBFBD>Brake<6B><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ */
#if 0
#if 1
PORT_Init(PORTB, PIN14, PORTB_PIN14_PWM_BRK0, 1); //PB14<31>л<EFBFBD>ΪPWM_BRK0<4B><30><EFBFBD><EFBFBD>
PORTB->PULLU |= (1 << PIN14);
PORT_Init(PORTB, PIN6, PORTB_PIN6_PWM_BRK1, 1); //PB6 <20>л<EFBFBD>ΪPWM_BRK1<4B><31><EFBFBD><EFBFBD>
PORTB->PULLU |= (1 << PIN6);
#else // <20>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊɲ<CEAA><C9B2><EFBFBD>ź<EFBFBD>
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<4B><30>PWM_BRK1<4B><31>PWM_BRK2 <20>͵<EFBFBD>ƽɲ<C6BD><C9B2>
PWM_BrkConfig(PWM0, PWM_CH_A, PWM_BRK0 | PWM_BRK1, 0, 1, 1, 0); //PWM0ͨ<30><CDA8>A <20><>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PWM_BRK0<4B><30>PWM_BRK1 <20><><EFBFBD><EFBFBD>
PWM_BrkConfig(PWM0, PWM_CH_B, PWM_BRK0 | PWM_BRK1, 0, 1, 1, 0); //PWM0ͨ<30><CDA8>B <20><>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PWM_BRK0<4B><30>PWM_BRK1 <20><><EFBFBD><EFBFBD>
PWM_BrkConfig(PWM1, PWM_CH_A, PWM_BRK2, 0, 1, 1, 0); //PWM1ͨ<31><CDA8>A <20><>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PWM_BRK2 <20><><EFBFBD><EFBFBD>
/* ɲ<><C9B2><EFBFBD><EFBFBD>Brake<6B><65><EFBFBD>жϹ<D0B6><CFB9><EFBFBD><EFBFBD><EFBFBD>ʾ */
#if 0
PWM_BrkIntEn(PWM_BRKIT_BRK0);
NVIC_EnableIRQ(PWMBRK_IRQn);
#endif
#endif
/* <20><><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD>Software Brake<6B><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ */
#if 0
PWM_BrkConfig(PWM0, PWM_CH_A, 0, 0, 1, 1, 0); //PWM0ͨ<30><CDA8>A <20><><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD>죬ֻ<ECA3AC><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2>
PWM_BrkConfig(PWM0, PWM_CH_B, 0, 0, 1, 1, 0); //PWM0ͨ<30><CDA8>B <20><><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD>죬ֻ<ECA3AC><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2>
while(1)
{
GPIO_SetBit(GPIOA, PIN8);
PWMG->SWBRK |= (PWMG_SWBRK_PWM0A_Msk | //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PWM0A<30><41>PWM0B<30><42>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PWMG_SWBRK_PWM0B_Msk);
for(int i = 0; i < 300000; i++) {}
GPIO_ClrBit(GPIOA, PIN8);
PWMG->SWBRK &=~(PWMG_SWBRK_PWM0A_Msk | //<2F><><EFBFBD><EFBFBD>PWM0A<30><41>PWM0B<30><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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); //<2F><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD>ڼ䲻ͣ<E4B2BB><CDA3><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
GPIO_InvBit(GPIOA, PIN8);
}
}