https://radiokot.ru/forum/viewtopic.php?f=57&t=184276&e=0

forregister84

//------------------------------------------------------------------------------
Версия 0.7
ШИМ-генератор с LCD и управлением кнопками

Возможно кому-нибудь пригодится

LCD 8х2 WH0802A или 16х2 WH1602A
Кнопка Mode - вкл/выкл выхода.
Кнопки Freq-, Freq+ изменение частоты. Шаг 1 Гц (10, 100 Гц).
Кнопки Duty-, Duty+ изменение коэффициента заполнения ШИМ. Шаг 1% (5%).
Если долго держать кнопку, шаг увеличивается.

Частота и ШИМ сохраняются в EEPROM через 2 сек после изменения частоты или ШИМ (чтобы не записывать слишком часто)
На низкой частоте используется делитель /8, /64, /256 

	Версия с одним каналом PB2: ATMega8_PWM_LCD
Частота: 1 Гц...1.6 МГц ((F_CPU/10)). Можно поднять до Fmax= F_CPU/4 по datasheet
Fast PWM Mode
Длительность импульса минимум 1 такт. ШИМ 1...99%

	Версия с двумя каналами PB1, PB2: ATMega8_PWM_2CH_LCD
Частота: 1 Гц...800 кГц ((F_CPU/20)). Fmax= F_CPU/8
Phase and Frequency Correct PWM Mode
Длительность импульса минимум 2 такта. ШИМ 1...50%

2-х канальный ШИМ сыроват и возможны глюки на высоких частотах
из-за особенностей ICR1.
Наверное лучше 1 канал ШИМ + схема деления на канала: 74AC74 + 74AC08.

//------------------------------------------------------------------------------
ATMega8_PWM_LCD
  Версия 0.8 - исправлено в conv_period_freq(): не было перерасчета T1_OCR (OCR1B) при F>F_CPU/100 
Из-за этого коэффициент заполнения ШИМ сильно изменялся при изменении частоты и можно было получить даже 100 %.
(а должен слабо менятся, с учетом ограничений дискретности)
  Версия 0.81 - Кнопка Mode на PB0. Основные настройки в main.h. #define FREQ_MAX (F_CPU/4).
  Версия 0.82 - макс. шаг 10% периода при (Freq>FREQ_MAX_DF1Hz). 
Исправлен глюк при увеличении Freq до FREQ_MAX_DF1Hz+1. Нужно было нажать 2 раза для увеличения 4000 -> 4001 Гц

ATMega8_PWM_2CH_LCD - аналогичные исправления

 
ATMega8_PWM_LCD_E
  ШИМ-генератор с LCD, 2-мя энкодерами и кнопкой
  Версия 0.81 - Кнопка Mode на PB0. Шаг только 1 Гц/1 такт.
  Версия 0.82 - Шаг частоты 1/10/100/1000 Гц. Шаг ШИМ 0,01/ 0,1 / 1 / 5 %. Переключение кнопкой энкодера по кругу.
  (нужно добавить мигание соответствующего разряда неск. сек.)
  Версия 0.83 - исправлено: когда минимальный шаг 0,03% приходилось 3 раза крутить энкодер на 0,01%
  Версия 0.85 - Шаг частоты 1/10/100/1000 Гц. Шаг ШИМ 0,01/ 0,1 / 1 / 5 %. Переключение кнопкой энкодера по кругу.
  добавлено мигание соответствующего разряда. Когда шаг 1000 Гц невозможен разряд все равно мигает тот же. 
  
ATMega8_PWM_2CH_LCD_E - аналогичные исправления
  Версия 0.85 - нужно проработать вопрос Dead Time

//------------------------------------------------------------------------------
Стоит обратить внимание на расчеты в Excel. Дискретность 1 Гц возможна на частоте F<=sqrt(F_CPU)
Т.е. С кварцем 16 МГц дискретность 1 Гц до частоты 4 кГц.
С кварцем 1 МГц дискретность 1 Гц до частоты 1кГц.
При увеличении дискретности в 10 раз частота увеличивается в sqrt(10)=3,162 раз:
4 кГц -> 12,649 кГц -> 40 кГц


Также обратите внимание на зависимость максимальной частоты от напряжения питания (datasheet ATmega8A)
Figure 26-1. Maximum Frequency vs. Vcc
11.2.3 Brown-out Detection (сброс при понижении питания)
26.5 System and Reset Characteristics

Т.е. С кварцем 16 МГц минимум 4,5 В и с кварцем 8 МГц минимум 2,7 В.
  Поэтому фъюз BODEN=0, BODLEVEL=0 
//------------------------------------------------------------------------------
Кнопка Mode на PB0 (так удобнее на моей макетке). Исправлен глюк: нужно было нажать 2 раза для увеличения 4000 -> 4001 Гц


