Nguyễn Hữu Sang
Thành Viên PIF
Em viết đoạn code để xuất 1 xung kích cho RC servo từ PF1 nhưng hình như nó xuất ra nhiều hơn mong đợi. Cấp 1 xung mà nó quay gần hết góc trong khi xài MSP430 thì cấp 3 xung nó quay đc tí xíu.
Đây là code:
Phần interrupt cho PWM em tự mò, có gì ko phải thì mấy anh chém nhẹ tay
Đây là code:
Code:
#define SW1 GPIO_PIN_4
uint32_t ui32DutyCycles[] = {25,75,150}; //0.5ms, 1.5ms, 3ms
uint32_t ui32PWMPeriod;
void BUTTON_ISR(void){
static uint8_t i = 0;
GPIOIntClear(GPIO_PORTF_BASE, SW1);
PWMGenDisable(PWM1_BASE, PWM_GEN_2);
PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5, ui32PWMPeriod*ui32DutyCycles[i]/1000);
PWMGenEnable(PWM1_BASE, PWM_GEN_2);
i++;
i %= 3;
SysCtlDelay(SysCtlClockGet()/9);
}
void PWMIsr(void){
PWMGenIntClear(PWM1_BASE, PWM_GEN_2, PWM_INT_CNT_ZERO);
PWMGenDisable(PWM1_BASE, PWM_GEN_2);
}
int main(void){
SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|
SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIODirModeSet(GPIO_PORTF_BASE, SW1, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTF_BASE, SW1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
GPIOIntTypeSet(GPIO_PORTF_BASE, SW1, GPIO_FALLING_EDGE);
GPIOIntRegister(GPIO_PORTF_BASE, &BUTTON_ISR);
GPIOIntEnable(GPIO_PORTF_BASE, SW1);
SysCtlPWMClockSet(SYSCTL_PWMDIV_8);
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);
ui32PWMPeriod = 31250; //20ms
GPIOPinConfigure(GPIO_PF1_M1PWM5); //
GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_1);
PWMGenConfigure(PWM1_BASE, PWM_GEN_2, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet(PWM1_BASE, PWM_GEN_2, ui32PWMPeriod);
PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5, ui32PWMPeriod*ui32DutyCycles[2]/1000);
PWMOutputState(PWM1_BASE, PWM_OUT_5_BIT, true);
PWMGenIntTrigEnable(PWM1_BASE, PWM_GEN_2, PWM_INT_CNT_ZERO);
PWMGenIntRegister(PWM1_BASE, PWM_GEN_2, &PWMIsr);
PWMIntEnable(PWM1_BASE, PWM_INT_GEN_2);
IntEnable(INT_GPIOF_TM4C123);
IntMasterEnable();
while(1);
}