/* * This program drives a standard servo motor. * * The Timer1B is used in PWM mode to generate a 50 Hz signal * with pulse width between 1 ms and 2 ms. * The quad half-H-bridge motor driver (TB6612FNG) of Wytec EduBase board * is configured so that the output of the PWM is also available at M4 terminal. * */ #include "TM4C123GH6PM.h" void delayMs(int n); void delayUs(int n); int main(void) { int pw = 0; SYSCTL->RCGCTIMER |= 0x02; // enable clock to TIMER1 SYSCTL->RCGCGPIO |= 0x20; // enable clock to GPIOF SYSCTL->RCGCGPIO |= 0x02; // enable clock to GPIOB TIMER1->CTL &= ~0x0100; // disable TIMER1B during setup TIMER1->CFG = 4; // configure as 32-bit timer mode TIMER1->TBMR = 0x0A; // down-count, PWM-periodic mode TIMER1->TBILR = (320000 - 1) & 0xFFFF; // 16 MHz / 320000 = 50 Hz TIMER1->TBPR = (320000 - 1) / 0x10000; TIMER1->TBMATCHR = 16000 - 1; TIMER1->CTL |= 0x4100; // enable TIMER1B GPIOF->DIR |= 0x08; // set PORTF 3 pins as output (LED) pin GPIOF->DEN |= 0x08; // set PORTF 3 pins as digital pins GPIOF->AFSEL |= 0x08; // enable alternate function GPIOF->PCTL &= ~0x0000F000; // clear PORTF 3 alternate function GPIOF->PCTL |= 0x00007000; // set PORTF 3 alternate funtion to timer GPIOB->DEN |= 0x08; // PORTB 3 as digital pins GPIOB->DIR |= 0x08; // set PORTB 3 as output GPIOB->DATA |= 0x08; // enable PORTB 3 while(1) { for (pw = 16000 - 1; pw < 32000 - 1; pw += 400) { TIMER1->TBMATCHR = pw; delayMs(100); } } } // delay n milliseconds (16 MHz CPU clock) void delayMs(int n) { int i, j; for(i = 0 ; i < n; i++) for(j = 0; j < 3180; j++) {} // do nothing for 1 ms } // delay n microseconds (16 MHz CPU clock) void delayUs(int n) { int i, j; for(i = 0 ; i < n; i++) for(j = 0; j < 3; j++) {} // do nothing for 1 us } // This function is called by the startup assembly // code to perform system specific initialization tasks. void SystemInit(void) { // Grant coprocessor access // This is required since TM4C123G has // a floating point coprocessor SCB->CPACR |= 0x00f00000; }