Hallo, Hat jemand ein Beispiel zur nutzung der Match Outputs als PWM Ausgang. Ich nutze die LPCOpen bibliothek und würde wie folgt vorgehen. 1. Pin Multiplexing vornehmen und die Ausgänge als Match Output konfigurieren. 2. Timer konfigurieren 3. Match value setzen 4. Timer starten würde das genügen oder muss ich um die Match outputs zu nutzen noch mehr konfigurieren? Am besten wäre natürlich wenn mir jemand ein kurzes Beispiel zeigen könnte. Gruß Tobias
Hier mal ein Timer für 2 verschiedene PWMs (3 wären pro Timer möglich):
void PWM_init(unsigned int pwm0, unsigned int pwm1)
{
SYSAHBCLKCTRL_bit.IOCON = 1; // pins clock
// P0_8/CT16B0_MAT0
IOCON_PIO0_8_bit.FUNC = 0x2; // CT16B0_MAT0
IOCON_PIO0_8_bit.MODE = 0x0; // no pull
// P0_9/CT16B0_MAT1
IOCON_PIO0_9_bit.FUNC = 0x2; // CT16B0_MAT1
IOCON_PIO0_9_bit.MODE = 0x0; // no pull
// tick/sec->1sec, pwm0%, pwm1%
CT16B0_init(1, pwm0, pwm1);
}
void CT16B0_init(unsigned int ticks, unsigned int pwm0, unsigned int
pwm1)
{
SYSAHBCLKCTRL_bit.CT16B0 = 1; // CT16B0 clock
TMR16B0TCR_bit.CE = 0; // counting disable
TMR16B0TCR_bit.CR = 1; // timer: reset
TMR16B0TCR_bit.CR = 0; // timer: reset release
TMR16B0CTCR_bit.CTM = 0; // timer mode: rising PCLK edge
// prescale counter is used to scale match registers to 1 sec
TMR16B0PC = 0; // prescale counter:
reset
TMR16B0PR = (CLK/(SYSAHBCLKDIV))/(0xFFFF); // prescale value (timer
is 16-bit)
// timer period using MR3 (since there is no MAT3 pin)
TMR16B0MR3 = (0xFFFF)/(ticks); // MR3 (scaled to 16-bit)
TMR16B0MCR_bit.MR3R = 1; // MR3 reset enable
TMR16B0PWMC_bit.PWM3ENA = 1; // MR3 used for PWM period
// MAT0 pin duty cycle using MR0
TMR16B0MR0 = (0xFFFF)/(ticks)/(100/pwm0); // MR0 (scaled to
16-bit)
TMR16B0EMR_bit.EMC0 = 0x3; // MAT0 toggle
TMR16B0EMR_bit.EM0 = 1; // MAT0 start high
TMR16B0PWMC_bit.PWM0ENA = 1; // MR0 used for PWM duty
cycle
// MAT1 pin duty cycle using MR1
TMR16B0MR1 = (0xFFFF)/(ticks)/(100/pwm1); // MR1 (scaled to
16-bit)
TMR16B0EMR_bit.EMC1 = 0x3; // MAT1 toggle
TMR16B0EMR_bit.EM1 = 1; // MAT1 start high
TMR16B0PWMC_bit.PWM1ENA = 1; // MR1 used for PWM duty
cycle
TMR16B0TCR_bit.CE = 1; // timer start
}
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.