Цитата
Чтобы избежать подобных проблем - после записи в OCR ОБЯЗАТЕЛЬНО обнуляйте TCNT регистр.
Программно трогать сам таймер (TCNT), работающий в режиме PWM, не нужно и даже вредно. Разработчики Atmel позаботились о том, чтобы запись в OCR1A/B можно было делать В ЛЮБОЙ МОМЕНТ без сбоев в формировании ШИМ:
Цитата
Note that in PWM mode, writing to the Output Compare Registers OCR1A or OCR1B, the data value is first transferred to a temporary location. The value is latched into OCR1A or OCR1B when the Timer/Counter reaches OCR1C. This prevents the occurrence of odd-length PWM pulses (glitches) in the event of an unsynchronized OCR1A or OCR1B.
А вот с OCR1C (TOP) ситуация иная - запись в него делается напрямую, без буферного регистра, и именно это обстоятельство и может вызывать наблюдаемый эффект. Чтобы исключить его, надо сделать так, чтобы запись в OCR1C происходила в безопасные моменты времени, т.е. сразу после сброса TCNT, вызванного его совпадением с OCR1C. Это легко и просто делается с помощью изредка разрешаемого прерывания по TOV1 - когда main вычислил и готов загрузить новые значения в OCR1A/C, то сначала грузит OCR1A и просто разрешает прерывание по TOV1, обработчик которого будет вызван при ближайшем TCNT1==OCR1C. Обработчик этот, в свою очередь, грузит новое значение в OCR1C и запрещает дальнейшие прерывания по TOV1. По завершению 7-ГЦ периода main снова разрешит однократное срабатывание прерывания по TOV1 и т.д.
Отмечу, что из обработчика TOV1 грузить и новое значение OCR1A нежелательно, т.к. именно из-за буферизации оно вступит в силу только после следующего совпадения TCNT1==OCR1C. Впрочем, при малом шаге генерируемой частоты это будет практически незаметно. В идеальном случае нужно устраивать не одно-, а двукратное прерывание - в первом грузить OCR1A, а в следующем - OCR1C, и уже после этого запрещать. Немного усложнится код, но зато результат будет безукоризненным для любой крутизны изменения частоты