void SoftPWM_SetPercent(int8_t pin, uint8_t percent) { uint8_t i=0; uint32_t time; // If the pin isn't already set ... for (i = 0; i < SOFTPWM_MAXCHANNELS; i++) { if ( (pin >= 0) && (m_channels[i].m_pin == pin) ) { // Kill existing timers ... if (m_channels[i].m_TimerId_on != 0) { SYSTM002_DeleteTimer(m_channels[i].m_TimerId_on); m_channels[i].m_TimerId_on = 0; } if (m_channels[i].m_TimerId_off != 0) { SYSTM002_DeleteTimer(m_channels[i].m_TimerId_off); m_channels[i].m_TimerId_off = 0; } // check percentage setting if (percent == 0) digitalWrite(pin, LOW); // 0% is OFF else if (percent == 100) digitalWrite(pin, HIGH); // 100% is ON else if (m_channels[i].m_pwmvalue != percent) { // ...We will get a PWM period of approximately 60Hz (~16ms). time = ((uint32_t)(percent))*SOFTPWM_TIME; m_channels[i].m_TimerId_on = SYSTM002_CreateTimer( time, SYSTM002_PERIODIC, m_Timer_PWM_0,(void*)i); time = ((uint32_t)(100-percent))*SOFTPWM_TIME; m_channels[i].m_TimerId_off = SYSTM002_CreateTimer( time, SYSTM002_PERIODIC, m_Timer_PWM_0,(void*)i); if ( (m_channels[i].m_TimerId_on != 0) && (m_channels[i].m_TimerId_off != 0) ) { // set the pin (and exit) m_channels[i].m_isOn = true; m_channels[i].m_pwmvalue = percent; //Start the timer SYSTM002_StopTimer(m_channels[i].m_TimerId_on); SYSTM002_StartTimer(m_channels[i].m_TimerId_off); m_channels[i].m_bState = true; } } break; } } }
void Software_Timers_Init() { handle_t TaskTimerId; TaskTimerId = SYSTM002_CreateTimer(SYSTM002_SYSTICK_INTERVAL, SYSTM002_PERIODIC, &Tick_Handler, NULL); if (TaskTimerId != 0) { //Timer created successfully so start it SYSTM002_StartTimer(TaskTimerId); } }