Розглядаємо на мікросхемі AVR ATMEL ATMEGA8.
Для управління потрібно використовувати таймер 1, 16 бітний з PWN. Це вигідно тим, що таймер в автономному режимі буде управляти серво, а ви зможете в основному коді програми виконувати свої функції.
TCCR1A=(1< TCCR1B=(1< Біт 1 в CS11 означає, що поділювач частоти таймера рівен 8 (010 -> CLK/8) майже всі сервоприводи управляються звичною частотою 50 герц, що рівно періоду 20мс. От у мене серво SG90 Position “0” (1.5 ms pulse) is middle,”90″ (~2ms pulse) is all the way to the right, “-90” (~1ms pulse) is all the way to the left. Тому маємо таку формулу розрахунку таймера: з ЦІЄЇ формули відомо: fpwm =50 Hz
fCPU =8000000 Hz timer_prescaler = 8 (це і є той поділювач частоти) По пропорціях розрахуємо і отримаємо що ICR1 = 19999
Тепер знайдемо період таймера. Він знаходиться так fCPU / timer_prescaler = 8000000/8=1000000. 1/1000000 = 1мкс. Це і є період таймера.
Тепер ми можемо знайти значення OCR1A для повороту серво на потрібний нам кут згідно datasheet! Servo угол 0 градусов (середина) требуется ширина импульса 1,5ms (1500мкс), поэтому значение OCR1A = 1500мкс/1мкс = 1500 Для кута повороту 90 градусів вправо OCR1A = 2000. Для кута повороту -90 градусів вліво OCR1A = 1000. Також не важкими математичнини розрахунками можна знайти, що на поворот серво руля на 1 градус потрібно додати чи відняти від OCR1A 5,55, звісно це не можливо, бо число має бути цілим, тому або 5 або 6. Але от якщо на 2 градуси повертати серво, то OCR1A треба змінювати на 11.1, або округлено на 11. Це вийде Більш точно! Отже ця стаття показує точний розрахунок управління серво приводом з мікроконтроллера. У вас може бути інша частота чіпа і ви маєте право вибрати інший поділювач частоти таймера в межах 1 / 8 / 64 / 256 / 1024, але в кінці у вас все вийде. Зараз трохи скину інформації про поділювач (підсвітив голубим)
Биты CS12 (2), CS11 (1), CS10 (0) регистра TCCR1B устанавливают режим тактирования и предделителя тактовой частоты таймера/счетчика T1: А тепер скину готовий код із старої AVR Studio на GCC В даному коді серво стає в свою середину 0 градусів. А ось відео управління цим серво приводом
000 – таймер/счетчик T1 остановлен
001 – тактовый генератор CLK
010 – CLK/8
011 – CLK/64
100 – CLK/256
101 – CLK/1024
110 – внешний источник на выводе T1 (11 ножка) по спаду сигнала
111 – внешний источник на выводе T1 (11 ножка) по возрастанию сигнала