void Inicializar_SCTimer( void )
{
SYSCON->SYSAHBCLKCTRL0 |= (1 << 7) | (1 << 8); // 8= SCTIMER 7=SWM
SYSCON->PRESETCTRL0 |= (1 << 8); // 8= SCTIMER clear the timer reset
SYSCON->SCTCLKSEL = 1; // 1:Main clock 24MHz
SYSCON->SCTCLKDIV = 1; // divided by n
SWM0->PINASSIGN.PINASSIGN7 &= (~(0xff << (24))); // SCT_OUT0 = PWM PIO0.8 -> pin 21
SWM0->PINASSIGN.PINASSIGN7 |= (8 << (24));
SWM0->PINASSIGN.PINASSIGN8 &= (~(0xff << (0))); // SCT_OUT1 = PWM PIO0.9
SWM0->PINASSIGN.PINASSIGN8 |= (9 << (0)); // PIO0.9 OUT1 -> pin 22
SCT0->CONFIG |= (1 << 0) | (1 << 17);
SCT0->SCTMATCH[0] = FREQ_PRINCIPAL/(PWM_FREQ*1);
SCT0->SCTMATCHREL[0] = FREQ_PRINCIPAL/(PWM_FREQ*1);
SCT0->EVENT[0].STATE = 0xFFFFFFFF;
SCT0->EVENT[0].CTRL = 0 | (1 << 12);
SCT0->OUTPUT = 0xC; //Esto no tiene efecto luego
SCT0->RES = 0b01010101; //Habría que hacer pruebas
SCT0->EVEN = 1;
//SCT0->EVEN = 3;
SCT0->EVENT[1].STATE = 0xFFFFFFFF;
SCT0->EVENT[1].CTRL = 1 | (1 << 12); //Referido a Match1 Combmode 1== Match only
#ifdef DUTYaCTIVOaLTO
SCT0->OUT[0].SET = 1;
SCT0->OUT[0].CLR = (1<<1);
#else
SCT0->OUT[0].SET = (1<<1);
SCT0->OUT[0].CLR = 1;
#endif
SCT0->SCTMATCH[1] = 0; //Duty pwm1
SCT0->SCTMATCHREL[1] = 0; //Duty pwm1
//-------------------------------------------
SCT0->SCTMATCH[2] = FREQ_PRINCIPAL/(PWM_FREQ*1);
SCT0->SCTMATCHREL[2] = FREQ_PRINCIPAL/(PWM_FREQ*1);
SCT0->EVENT[2].STATE = 0xFFFFFFFF;
SCT0->EVENT[2].CTRL = 2 | (1 << 12);
SCT0->EVENT[3].STATE = 0xFFFFFFFF;
SCT0->EVENT[3].CTRL = 3 | (1 << 12); //Referido a Match3 Combmode 1== Match only
#ifdef DUTYaCTIVOaLTO
SCT0->OUT[1].SET = (1<<2); //Actua en base a evento2
SCT0->OUT[1].CLR = (1<<3); //Actua en base a evento3
#else
SCT0->OUT[1].SET = (1<<3); //Actua en base a evento3
SCT0->OUT[1].CLR = (1<<2); //Actua en base a evento2
#endif
SCT0->SCTMATCH[3] = 0; //Duty pwm2
SCT0->SCTMATCHREL[3] = 0; //Duty pwm2
NVIC->ISER[0] = (1 << 9);
SCT0->CTRL &= ~(1 << 2); //Start SCTimer
PWM1_set( 65 ); //6.5%
PWM2_set( 90 ); //9%
}
PWM1_set is from AN (with my changes), only the first if has relevance when the duty is 0:
void PWM1_set(uint32_t value)
{
if (value == 0)
{
SCT0->SCTMATCHREL[1] = 0; // check val between 0% and 100%
}
else
{
if ( value >= CINCOpORCIENTO && value <= DIEZpORCIENTO)
{
SCT0->SCTMATCHREL[1] = (value*DOScOMAcINCOmILIS)/DOCEcOMACINCOpORCIENTO;
}
else
{
SCT0->SCTMATCHREL[1] = FREQ_PRINCIPAL/(PWM_FREQ*1 - 1); // set to 100% duty cycle
}
}
}
The attached images shows the behaviour.
Any help would be appreciated!
BR
Mariano