I have a project where I need to get a low frequency to get a pwm suited from my project. The problem is that after I modify the frequency of timer0 the millis() becomes slower or faster depending on prescalar. So a fix as stated here is to change prescalar in wiring.c. But I don't know from what reason when I set it to 256 or 1024 the millis return 0. I set also in wiring prescale to be 1024*256. Timer 0 uses a prescale factor which is set to 64 by default To set the prescale factor use this line in the setup function Setting Prescale_factor TCCR0B = _BV(CS00); 1 TCCR0B = _BV(CS01); 8 TCCR0B = _BV(CS00) | _BV(CS01); 64 TCCR0B = _BV(CS02); 256 TCCR0B = _BV(CS00) | _BV(CS02); 1024 To use Fast PWM on Timer 0 Write this line in the setup function TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00); And to calculate the PWM frequency, use Fast_PWM_frequency = (16 000 000)/(Prescale_factor*256); To use Phase-correct PWM on Timer 0 (half the frequency of Fast PWM) Write this line in the setup function TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00); And to calculate the PWM frequency, use Phase_correct_PWM_frequency = (16 000 000)/(Prescale_factor*510); Changing the prescale factor on Timer0 will affect functions millis(), micros(), delay(),... To adjust millis(), micros(), delay(),... accordingly, You can modify a line in the wiring.c function in the Arduino program files hardware\arduino\cores\arduino\wiring.c In the beginning of wiring.c you can find: // the prescaler is set so that timer0 ticks every 64 clock cycles, and the // the overflow handler is called every 256 ticks. #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) You need to modify the prescale factor in this function to the corresponding line For fast PWM (default): #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(PRESCALE_FACTOR* 256)) For phase-correct PWM : #define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(PRESCALE_FACTOR * 510))