Простейшая программа для экспериментов с биполярным шаговым двигателем

управляющие сигналы для драйвера шагового двигателя

Рассмотренная в этой статье простейшая программа была разработана для экспериментов со схемой управления биполярным шаговым двигателем на контроллере PIC12F629.

Программа реализует следующий алгоритм управления: при нажатии на кнопку КН1 двигатель делает один шаг в одну сторону, а при нажатии на кнопку КН2 - один шаг в другую сторону. В общем-то всё управление заключается в формировании на выводах контроллера одной из четырёх комбинаций сигналов (рисунок справа), в зависимости от нажатой кнопки и предыдущего состояния.

Алгоритм:

Блок-схема алгоритма управления биполярным шаговым двигателем

Итак, в аппаратной части мы имеем:

входы: GP5 - кнопка КН1, GP4 - кнопка КН2; когда кнопка не нажата - на входе висит "1"(высокий уровень);

выходы: GP0 - выход на EN1, GP1 - выход на EN2, GP2 - выход на IN1/IN2;

используется внутренний генератор.

Программа:

;---------------------------------------------------------
 list    p = 12f629
 __config 01FC4h
;*** Переменные ******************************************
   CBLOCK 0x20   ; Начальный адрес блока пользовательской памяти
    Step1
    Step2
    Step3
    Step4
    Counter1
    Counter2
    StepNumber
   ENDC
;**** Константы / Адреса регистров ************************
Status equ   03h   ; выбор банка
GPIO   equ   05h   ; управление защелками порта (банк 0)
Cmcon  equ   19h   ; компаратор (банк 0)
TrisIO equ   05h   ; выбор направления работы выводов порта (банк 1)
INTCON equ   0Bh   ; разрешение(1)/запрет(0) прерываний (любой банк)
OSCCAL equ   10h   ; хранение калибровочной константы (банк 1)
T1     equ   .255
T2     equ   .255
INDF   equ   0h    ; регистр косвенной адресации
FSR    equ   04h   ; регистр адреса при косвенной адресации
;*********************************************************

          org 0
;*********************************************************
;*** КОНФИГУРИРОВАНИЕ КОНТРОЛЛЕРА ************************
;****** Калибровка Генератора ****************************
start bsf    Status,5
      Call   3FFh        ; Загрузить калибровочную константу в w
      movwf  OSCCAL
;*** Запрет прерываний ***********************************
      clrf   INTCON      ; запретить все прерывания
;*** Установка направления работы ног ********************
      bcf    Status,5    ; перейти в банк 0
      clrf   GPIO        ; инициализация защелок (все выходы равны нулю)
      movlw  .7          ; биты 0..2 поднять
      movwf  Cmcon       ; компар. выключен, GP0,GP1,GP2 - цифровые IO
      bsf    Status,5    ; перейти в 1-й банк
      movlw  b'00110000' ; настройка выходов (GP4,GP5 - входы)
      movwf  TrisIO
      bcf    Status,5    ; перейти в банк 0
;*********************************************************
      movlw  b'00000001'
      movwf  Step1
      movlw  b'00000010'
      movwf  Step2
      movlw  b'00000101'
      movwf  Step3
      movlw  b'00000110'
      movwf  Step4
      clrf   StepNumber
;*********************************************************
;*** РАБОЧАЯ ЧАСТЬ ***************************************
;*** Сканирование кнопок *********************************
wait  btfss  GPIO,4
      call   Forward
      btfss  GPIO,5
      call   Backward
      goto   wait
;*********************************************************
Backward
      decfsz  StepNumber,1
      goto    Next
      movlw   .4
      movwf   StepNumber
Next  movlw   1fh
      addwf   StepNumber,0
      movwf   FSR
      movf    INDF,0
      movwf   GPIO
      call    pause
      clrf    GPIO
      return
Forward
      btfsc   StepNumber,2 ; если StepNumber=4, то обнулить
      clrf    StepNumber
      incf    StepNumber,1
      movlw   1fh
      addwf   StepNumber,0
      movwf   FSR
      movf    INDF,0
      movwf   GPIO
      call    pause
      clrf    GPIO
      return
;-----------------------------------------
pause  movlw  T2
       movwf  Counter2
pause2 movlw  T1
       movwf  Counter1
pause1 nop
       decfsz Counter1,1
       goto   pause1
       decfsz Counter2,1
       goto   pause2
       return
 end
;-----------------------------------------

Скачать готовую прошивку и asm-файл

Внимание. Во избежание затирания калибровочных констант, алгоритм заливки этой прошивки в контроллер следующий:

1. Считываем память контроллера.

2. Записываем значение последнего слова программного кода (слово по адресу 03FF) - это калибровочные данные генератора.

3. Открываем прошивку (которую мы хотим залить) в программе программатора и меняем в ней биты калибровки генератора на считанные и записанные значения.

4. Заливаем исправленную для конкретного экземпляра PIC12 прошивку в контроллер.

Update от 25.10.2013

В процессе эксплуатации был найден следующий глюк: если после старта сначала шагнуть назад, то прога зависает. Это происходит из-за того, что при старте номер текущего шага равен нулю, а в процедуре Backward первым делом происходит вычитание единицы из номера текущего шага. В результате мы получаем неправильный адрес ячейки, хранящей состояния выходов для текущего шага.

Лечится глюк следующим образом - в самом начале процедуры Backward нужно добавить 3 команды: movf StepNumber,1; btfsc Status,2; incf StepNumber,1. Таким образом, если мы попадём в процедуру Backward в тот момент, когда номер шага равен нулю - он, в результате выполнения этих команд, станет равным единице.

radiohlam.ruпрограммированиепромышленные микрухи и девайсы

Понравилась статья? Поделись с друзьями!

Обсудить эту статью на форуме

 
Rambler's Top100 © 2009 - Материалы сайта охраняются законом об авторском праве