[TIVA C] điều khiển RC serv

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:
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);
}
Phần interrupt cho PWM em tự mò, có gì ko phải thì mấy anh chém nhẹ tay :D
 

nguyễn đình huân

Cố Vấn CLB
Xung clock em config như vầy là hơn 80 MHz rồi.
Code:
    SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|
                    SYSCTL_OSC_MAIN);
Còn cái vụ "1 xung, 3 xung" hình như em lộn với động cơ bước.
 

MMKC

Thành Viên PIF
Dạng này ép xung rồi bạn ( lưu ý ko nên chơi kiểu này dễ chết MCU lắm ). Cấu hình set tối đa 80mhz đây
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|
SYSCTL_OSC_MAIN);
 

Nguyễn Hữu Sang

Thành Viên PIF
Ah tại lúc đầu hiểu sai, cứ nghĩ cấp 1 xung thì quay 1 độ, nhưng mà giờ em làm đc rồi, em điều khiển kết hợp với biến trở.
Mà cái xung clock em ko hiểu cho lắm, sao em xài hàm SysCtlClockGet() thì trả về 0xBEBC20 = 12.5Mhz chứ có phải 80Mhz đâu???
Còn SysCtlPWMClockGet() = 0x140000 là từ đâu ra???
Code:
void Uart0Trans(uint32_t data){
    UARTCharPut(UART0_BASE, data>>24);
    UARTCharPut(UART0_BASE, data>>16);
    UARTCharPut(UART0_BASE, data>>8);
    UARTCharPut(UART0_BASE, data);
}
Uart0Trans(SysCtlClockGet());
Uart0Trans(SysCtlPWMClockGet());
 

MMKC

Thành Viên PIF
Hiện TiveWare phi6n bản mới nhất đã bị vấn đề của hàm:
SysCtlClockGet() ra không đúng như tốc độ config MCU.Tạm thời tốt nhất em tạo biên hằng số ui32SystemClk = 80000000 xài tạm nha
 

Nguyễn Hữu Sang

Thành Viên PIF
Code:
Voltage:........................................................4.0V to 7.2V, 4.6V - 5.2V nominal
Running current (with no mechanical load) with 5V supply:.......220 ±50mA
Stall current (horn locked) with 5V supply:.....................650 ±80mA
Idle current with 5V supply:....................................6 ±10mA
RC servo SG90
Em xài pin lipo 11.1V 2200mAh 35C wa mạch nguồn xung xài LM2596 (hoặc 1 cái khác xài TPS5450) xuống 5V cấp cho 8 cái servo như vậy thì có ok không mấy anh???
 
Top