Довелось трохи попрацювати з сервоприводами, вирішив поділитися інформацією.
Думаю будь-яка людина уявляє собі, що таке електродвигун, немає? - тоді згадайте який-небудь вентилятор. Яка характерна риса? Правильно, подали напругу він крутиться, зняли напругу - не крутиться. Сервопривод, це теж движок, але на відміну від інших, на скільки скажеш йому повернутися, на стільки він і повернеться і зупиниться. Поки тримається керуючий сигнал, сервопривід буде фіксувати своє становище. Можете його хоч руками покриття, він все одно повернеться в задане положення.
Кут на який повертається серва, задається шириною імпульсу. Варто уточнити невелику тонкість, сервоприводи бувають різні. Бувають такі, які крутяться постійно в певну сторону, при цьому ширина імпульсу впливає тільки на швидкість повороту. Бувають многооборотістие. Ті про які йтиметься далі, на сайті виробника мають явну маркування, в якій вказано кут повороту. Тому врахуйте якщо серва, не має явної маркування, то може виявитися так, що вона тупо постійно обертається. Не плутайте, написи 0.20 sec / 60 ° означають швидкість обертання, вони ніяк не пов'язані з максимальним кутом повороту.
Перейдемо до теорії. Представляємо собі мікроконтролер з підключеним до АЦП входу резистором R і якийсь движок, який крутиться по ШИМ сигналу PWM. Припустимо рівень сигналу АЦП безпосередньо пов'язаний з ШІМ виходом, тоді коли ми будемо крутити резистор, то швидкість буде змінюватися, коли напруга АЦП стане рівним 0, движок зупиниться.
![Управління сервоприводом (потрібно подати імпульс) управління сервоприводом](https://images-on-off.com/images/118/upravlenieservoprivodom-1d35b253.png)
Тепер розглянемо варіант 2. Ручка резистора насаджена на вал двигуна, таким чином, що коли двигун обертається, він змінює опір резистора, отже і напруга, що подається на вхід АЦП. При цьому, якщо є ще одне джерело сигналу, то мікроконтролер порівнює напруга на входах і якщо воно більше, то крутить в одну сторону, якщо менше, то в іншу. Рано чи пізно напруги вирівняти і движок зупиниться. Тому серва включає в себе все що намальовано: резистор, мікроконтролер, двигун. Зовнішній сигнал природно подавати повинні ми, щоб управляти.
![Управління сервоприводом (потрібно подати імпульс) управління сервоприводом](https://images-on-off.com/images/118/upravlenieservoprivodom-5d09ae85.png)
Типові кишки виглядають так:
![Управління сервоприводом (потрібно подати імпульс) управління сервоприводом](https://images-on-off.com/images/118/upravlenieservoprivodom-82d2ea8f.jpg)
На фотке видно що резистор і моторчик з'єднується через купу шестерень, тому якщо полізе всередину будьте готові що на вас висипется все це добро. Вигляд знизу
![Управління сервоприводом (потрібно подати імпульс) управління сервоприводом](https://images-on-off.com/images/118/upravlenieservoprivodom-5444cb63.jpg)
Найчастіше ширина імпульсу коливається в діапазоні від 1100мкс до 1900мкс, при періоді 20мс, але цифри можуть відрізнятися, причому досить сильно. Приклад з даташіта:
Control System: + Pulse Width Control 1520usec Neutral
Required Pulse: 3-5 Volt Peak to Peak Square Wave
Operating Voltage: 4.8 Volts
Operating Speed (6V): 0.20sec / 60 degrees at no load
Operating Angle: 45 Deg. one side pulse traveling 400usec
Continuous Rotation Modifiable: No
Direction: Counter Clockwise / Pulse Traveling 1520-1900usec
Звідси чітко видно, що середня точка 1520мкс, щоб повернути таку серв на 45градусов, вже потрібно подати імпульс 1900мкс, відповідно інші кути розраховуються пропорцією. Щоб повернути на -45 градусів потрібно подати імпульс 1100мкс. Тобто діапазон 90град. Ще видно, що під Continuous Rotation цей девайс НЕ заточений, що добре.
Перейдемо до практики. Є поціент Futaba S3152, яким потрібно покрутити туди - сюди.
![Управління сервоприводом (потрібно подати імпульс) управління сервоприводом](https://images-on-off.com/images/118/upravlenieservoprivodom-4e141206.jpg)
Також можна цю справу потестить в протеус. Звичайне підключення по трьох проводах червоний +5, чорний - земля, білий - керуючий.
![Управління сервоприводом (потрібно подати імпульс) управління сервоприводом](https://images-on-off.com/images/118/upravlenieservoprivodom-4d0bd2d3.png)
В останніх версіях CAVR, в Codewizard з'явилося багато ніштяк, наприклад можна вбити цифри в папуг і побачити період і імпульс в секундах. Власне нам важливий режим fast pwm top ICR. Примітний цей режим тим, що ICR задає період, а OCR ширину імпульсу.
![Управління сервоприводом (потрібно подати імпульс) управління сервоприводом](https://images-on-off.com/images/118/upravlenieservoprivodom-8b3f0494.png)
Період обчислюється дуже просто:
ICR = (Частота таймера / 50Hz) -1
Тоді потрібну ширину імпульсу можна легко обчислити по пропорції:
20ms = ICR
?ms = OCR
У підсумку можна переписати так:
OCR = (x * ICR) / 20; де x це необхідна тривалість імпульсу. Наприклад, потрібна тривалість імпульсу в 1мс, значить OCR = (1 * 9C3) / 20 = 0x7C.
Власне і все. Тепер виходимо з того, що нейтральна точка = 1524мкс або OCR1 = (1.524 * 9C3) / 20 = 0xBE і залежно від тогу куди нам потрібно повернути перераховуємо OCR. Простенький приклад, повертаємо на -45, потім 0 і потім +45.