AFON // радиотехник affonya@mail.ru
← Проекты на PIC

Проект 43. Управление сервоприводом SG90

Сервопривод поворачивается на угол, заданный длительностью импульса. Проект показывает точное формирование управляющей посылки — от 1 до 2 миллисекунд с периодом 20 мс.

Задача

Поворачивать вал сервопривода кнопками влево и вправо.

Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.

Что понадобится

  • PIC16F84A
  • кварц 4 МГц + 2×22 пФ
  • сервопривод SG90
  • две кнопки + 2 резистора 10 кОм
  • отдельное питание 5 В для серво
  • конденсатор 470 мкФ по питанию

Схема подключения

ВыводПодключение
RB0сигнальный провод сервопривода (оранжевый)
Питание сервоотдельный источник 5 В, общий провод объединить с контроллером
RA0 / RA1кнопки поворота, подтяжки 10 кОм

Алгоритм

  1. Каждые 20 мс выдавать один управляющий импульс.
  2. Длительность импульса менять от 1 мс (крайнее положение) до 2 мс (противоположное).
  3. По нажатию кнопок увеличивать или уменьшать длительность.
  4. Ограничить диапазон, чтобы не упереть привод в механический предел.

Листинг на ассемблере

Код проверен ассемблером и собирается без ошибок. Скачать: 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.