void SoftPWMBegin(uint8_t defaultPolarity) { // We can tweak the number of PWM period by changing the prescalar // and the OCR - we'll default to ck/8 (CS21 set) and OCR=128. // This gives 1024 cycles between interrupts. And the ISR consumes ~200 cycles, so // we are looking at about 20 - 30% of CPU time spent in the ISR. // At these settings on a 16 MHz part, we will get a PWM period of // approximately 60Hz (~16ms). uint8_t i; #ifdef WIRING Timer2.setMode(0b010); // CTC Timer2.setClockSource(CLOCK_PRESCALE_8); Timer2.setOCR(CHANNEL_A, SOFTPWM_OCR); Timer2.attachInterrupt(INTERRUPT_COMPARE_MATCH_A, SoftPWM_Timer_Interrupt); #else SOFTPWM_TIMER_INIT(SOFTPWM_OCR); #endif for (i = 0; i < SOFTPWM_MAXCHANNELS; i++) { _softpwm_channels[i].pin = -1; _softpwm_channels[i].polarity = SOFTPWM_NORMAL; _softpwm_channels[i].outport = 0; _softpwm_channels[i].fadeuprate = 0; _softpwm_channels[i].fadedownrate = 0; } _softpwm_defaultPolarity = defaultPolarity; }
void SoftPWMBegin(void) { // We can tweak the number of PWM period by changing the prescalar // and the OCR - we'll default to ck/8 (CS21 set) and OCR=128. // This gives 1024 cycles between interrupts. And the ISR consumes ~200 cycles, so // we are looking at about 20 - 30% of CPU time spent in the ISR. // At these settings on a 16 MHz part, we will get a PWM period of // approximately 60Hz (~16ms). uint8_t i; SOFTPWM_TIMER_INIT(SOFTPWM_OCR); for (i = 0; i < SOFTPWM_MAXCHANNELS; i++) { _softpwm_channels[i].pin = -1; _softpwm_channels[i].fadeuprate = 0; _softpwm_channels[i].fadedownrate = 0; } }