Управління серво мотором з мікроконтроллера AVR

Розглядаємо на мікросхемі 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:
000 – таймер/счетчик T1 остановлен
001 – тактовый генератор CLK
010 – CLK/8
011 – CLK/64
100 – CLK/256
101 – CLK/1024
110 – внешний источник на выводе T1 (11 ножка) по спаду сигнала
111 – внешний источник на выводе T1 (11 ножка) по возрастанию сигнала

А тепер скину готовий код із старої AVR Studio на GCC

В даному коді серво стає в свою середину 0 градусів.

А ось відео управління цим серво приводом

Датчик холла цифровий в момент подачі струму живлення

При використанні датчиків магнітного поля з цифровим виходом слід враховувати, що якщо в момент подачі напруги харчування напруженість магнітного поля буде перебувати між граничними порогами спрацьовування, то вихід буде знаходитись в невизначеному становищі: або в високоімпедансних стані, або в стані з низьким вихідним рівнем. Для того щоб пристрій функціонував нормально, необхідно, щоб величина магнітного поля перевищувала задані пороги.