Задача
Поворачивать вал сервопривода кнопками влево и вправо.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- сервопривод SG90
- две кнопки + 2 резистора 10 кОм
- отдельное питание 5 В для серво
- конденсатор 470 мкФ по питанию
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0 | сигнальный провод сервопривода (оранжевый) |
| Питание серво | отдельный источник 5 В, общий провод объединить с контроллером |
| RA0 / RA1 | кнопки поворота, подтяжки 10 кОм |
Алгоритм
- Каждые 20 мс выдавать один управляющий импульс.
- Длительность импульса менять от 1 мс (крайнее положение) до 2 мс (противоположное).
- По нажатию кнопок увеличивать или уменьшать длительность.
- Ограничить диапазон, чтобы не упереть привод в механический предел.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p43.asm · p43.hex (готовая прошивка).
;=======================================================
; Проект 43. Управление сервоприводом SG90
; PIC16F84A, 4 МГц. Сигнальный провод серво — RB0
; Период 20 мс, импульс 1..2 мс задаёт угол 0..180 град.
; Кнопки RA0 (влево) и RA1 (вправо)
;=======================================================
LIST p=16F84A
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
cblock 0x0C
d1, d2, pos, cnt
endc
ORG 0x000
goto Start
Start
bsf STATUS,RP0
clrf TRISB ; RB0 — выход на серво
movlw b'00011111'
movwf TRISA ; кнопки — входы
bcf STATUS,RP0
movlw .150 ; середина диапазона (1,5 мс)
movwf pos
Main
call ServoPulse ; один импульс управления
call Delay20ms ; пауза до следующего периода
call CheckKeys
goto Main
;--- импульс длительностью pos*10 мкс ---
ServoPulse
bsf PORTB,0
movf pos,w
movwf cnt
PLoop
call Delay10us
decfsz cnt,f
goto PLoop
bcf PORTB,0
return
CheckKeys
btfss PORTA,0 ; уменьшить угол
goto PosDown
btfss PORTA,1 ; увеличить угол
goto PosUp
return
PosDown
movlw .100 ; нижний предел (1,0 мс)
subwf pos,w
btfsc STATUS,C
decf pos,f
return
PosUp
movlw .200 ; верхний предел (2,0 мс)
subwf pos,w
btfss STATUS,C
incf pos,f
return
Delay10us
movlw .2
movwf d1
X10 nop
decfsz d1,f
goto X10
return
Delay20ms
movlw .40
movwf d1
Y1 movlw .165
movwf d2
Y2 nop
decfsz d2,f
goto Y2
decfsz d1,f
goto Y1
return
END
Пояснения
- Период 20 мс не критичен, а вот длительность импульса задаёт угол напрямую — именно её нужно выдерживать точно.
- Питать серво от вывода контроллера нельзя: пусковой ток достигает сотен миллиампер. Нужен отдельный источник и общий провод с контроллером.
- Конденсатор большой ёмкости по питанию гасит просадки в момент старта двигателя — без него контроллер может перезагружаться.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.