Hi, I've been at this for quite some time now. I'm trying to generate a simple PWM using the NPWM wavegen mode but I get no output. I've tried using interrupts and it works fine but I need to use hardware generated PWM since CPU resources are crucial.
My suspicion is that the multiplexing pin configuration is wrong on my side. Below is the Timer initialization function.
//PB30 -- Tc0 Pwm output
void init_LED_Driver()
{
//PWM INPUT PIN INIT
REG_PORT_DIRSET1 = PORT_PB30;
PORT->Group[1].PINCFG[15].reg |= PORT_PINCFG_PMUXEN; //| PORT_PINCFG_DRVSTR PERIPHERAL MULTIPLEXING FOR ADC_INPUT -- uncomment for increased o/p drive strength
PORT->Group[1].PMUX[30].reg |= PORT_PMUX_PMUXE_E; // ENABLE TC0/WO[0]
/*
Set the GENDIV.DIV TO DECIMAL 0
and configure the settings to GCL3
*/
REG_GCLK_GENDIV = GCLK_GENDIV_ID_GCLK3 | GCLK_GENDIV_DIV(0);
while(GCLK->STATUS.bit.SYNCBUSY); // WAIT FOR SNCHRONIZATION OF CLKS AFTER RESET
/*
DIVIDE GCLK2 BY 2^(GENDIV.DIV+1)
CLOCKED BY 32.768KHZ inTERNAL OSCILLATOR -- ACCURACY NOT THAT IMPORTANT
gclK O/P FREQ = 16.3KHZ
*/
REG_GCLK_GENCTRL = GCLK_GENCTRL_DIVSEL | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_OSC32K | GCLK_GENCTRL_ID_GCLK3;
while(GCLK->STATUS.bit.SYNCBUSY); // WAIT FOR SNCHRONIZATION OF CLKS AFTER RESET
// Configure Clocks
REG_GCLK_CLKCTRL = GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK3 | GCLK_CLKCTRL_ID_TC0_TC1;
REG_PM_APBCMASK |= PM_APBCMASK_TC0; // Enable TC0 APB clock BUS
// Configure TC0 (8 bit counter by default)
// Run in standby
// Normal PWM generation
REG_TC0_CTRLA |= TC_CTRLA_MODE_COUNT8 | TC_CTRLA_PRESCALER_DIV1 | TC_CTRLA_RUNSTDBY | TC_CTRLA_WAVEGEN_NPWM | TC_CTRLA_PRESCSYNC_GCLK;
while(TC0->COUNT8.STATUS.bit.SYNCBUSY); // Wait for sync
// Get continUous read request from clock
REG_TC0_READREQ |= TC_READREQ_RCONT | TC_READREQ_RREQ;
while(TC0->COUNT8.STATUS.bit.SYNCBUSY); // Wait for sync
//This register controls the period -- 100HZ
REG_TC0_COUNT8_PER = 164;
while(TC0->COUNT8.STATUS.bit.SYNCBUSY); // Wait for sync
//This register controls the duty cycle -- 50%
REG_TC0_COUNT8_CC0 = 82;
while(TC0->COUNT8.STATUS.bit.SYNCBUSY); // Wait for sync
// Enable TC3
REG_TC0_CTRLA |= TC_CTRLA_ENABLE;
while (TC0->COUNT8.STATUS.bit.SYNCBUSY); // wait for TC0 to be enabled
}
Thanks in advance