1.11.2014

PWM sprzętowy - EK-TM4C123GXL

Mikro-kontroler TM4C123GH6PM posiada dwa moduły PWM, każdy moduł posiada cztery generatory, każdy generator generuje dwa sygnały oparte na wspólnym zegarze. W sumie jest 16 wyjść PWM. Generatory mogą być synchronizowane.

Prosty kod włączajacy sygnał PWM na piny PC4 i PC5. Należy  w opcjach projektu  dodać "predefined symbols" "PART_LM4F230H5QR", gdyż bez tego biblioteka nie zwróci odpowiednich map dla naszego procesora. W zależności od płytki może być potrzebny inny zapis, więcej na forum TI link

 
#include "utils/ustdlib.h"
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h"
#include "driverlib/debug.h"
#include "driverlib/hibernate.h"
#include "driverlib/gpio.h"
#include "driverlib/systick.h"
#include "driverlib/timer.h"
#include "driverlib/pwm.h"

int main(void)
{
 SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_INT);  // 40 MHz int
 SysCtlPWMClockSet(SYSCTL_PWMDIV_64); //PWM - pre-divided System Clock 625 kHz

 SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);  // PWM0

 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // PWM PC4
        // Enable pin PC5 for PWM0 M0PWM7
        GPIOPinConfigure(GPIO_PC4_M0PWM6);
        GPIOPinTypePWM(GPIO_PORTC_BASE, GPIO_PIN_5);
        // Enable pin PC4 for PWM0 M0PWM6
        GPIOPinConfigure(GPIO_PC5_M0PWM7);
        GPIOPinTypePWM(GPIO_PORTC_BASE, GPIO_PIN_4);

 PWMGenConfigure(PWM0_BASE, PWM_GEN_3, PWM_GEN_MODE_DOWN| PWM_GEN_MODE_NO_SYNC); // PWM Count-Down Mode

 PWMGenPeriodSet(PWM0_BASE, PWM_GEN_3, 6249); // 100 Hz

 PWMPulseWidthSet(PWM0_BASE, PWM_OUT_6, 3124); // PC4 50%

 PWMPulseWidthSet(PWM0_BASE, PWM_OUT_7, 1562); // PC5 25%

 PWMGenEnable(PWM0_BASE, PWM_GEN_3);

 PWMOutputState(PWM0_BASE, (PWM_OUT_6_BIT | PWM_OUT_7_BIT), true);

 while(1)
 {
 }
}
Sygnał generowany na pinach PC4 i PC5.


Można ustawić odwrócenie sygnału na wyjściu.
Funkcja PWMOutputInvert(PWM0_BASE, PWM_OUT_7_BIT, true)

Invert


Można ustawić licznik PWM w opcji up-down. Przebieg na dwóch wyjściach generatora będzie uzależniony od zadziałania COMP podczas liczenia w górę i w dół, nie są brane  wartości licznika 0 i load. Obraz dwóch sygnałów można podzielić na symetryczne części.
Funkcja PWMGenConfigure(PWM0_BASE, PWM_GEN_3, PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC)

up-down timer


Można również ustawić tryb pracy "dead-band generator", jest wtedy brany tylko czas ustawiony dla COMPA  (wyjście 0 danego generatora)  i na jego podstawie generowane są dwa sygnały na wyjściach generatora. Do ustawienia jest czas martwy Rising Edge i Falling Edge.
Funkcja PWMDeadBandEnable(PWM0_BASE, PWM_GEN_3,300,100);

Dead-Band Generator