Here's code for timer 1 on a atmega32u tested in a Teensy 2.0:
void setup() {
// put your setup code here, to run once:
// Timer 1 Fast PWM mode *toggling* OC1A at 50kHz with *two* OCR1A counts
// And 7.32 bits 0-159 PWM on OC1B at 100kHz
// Output on OC1B
// Set at TOP, Clear at OCR1B
// WGM =15 0b1111
DDRB |= bit(DDB5) | bit(DDB6); // atmega32u OC1A and OC1B outputs
// DDRB |= bit(DDB1) | bit(DDB2); // atmega168/UNO OC1A and OC1B (Tested by OP/Luis)
OCR1A TCCR1A = 159 ;//79; // Setbit(WGM11) TOP| countbit(WGM10) to| 16000000/bit(2*PreScaler*FtoggleCOM1A0)
| bit(COM1B1) ; // Toggle OC1A, Clear on OC1B
TCCR1B = bit(WGM13) | bit(WGM12) | bit(CS10); // orSet 16000000/(PreScaler1 *Ftimer)prescaler
OCR1BOCR1A = 10; 159 ;//79; // Set TOP count to /16000000/(2*PreScaler*Ftoggle)
10/160 duty cycle
TCCR1A = bit(WGM11) | bit(WGM10) | bit(COM1A0) | bit(COM1B1) ; // Toggle OC1A, Clear on OC1B // or 16000000/(PreScaler *Ftimer)
TCCR1BOCR1B = 10; bit(WGM13) | bit(WGM12) | bit(CS10); // Set 10/1160 prescalerduty cycle
TCNT1 = 0 ;
}
void loop() {
// put your main code here, to run repeatedly:
OCR1B = 160/4 -1 ; // 25% duty cycle.
}
The trick here is using OCRxA to set the TOP value/resolution/frequency of the timer, and then using OCRxB as the PWM-controlled output. The popular examples aim for a specific frequency with toggling, but often don't go into showing the PWM with the non-TOP OCRxx registers.
If you check the registers for your chip, this should also adapt to the other timers. Here, I used timer1 to avoid confusing delay() and millis().