Скачиваний:
50
Добавлен:
21.02.2014
Размер:
102.4 Кб
Скачать

5 РАЗРАБОТКА УПРАВЛЯЮЩЕЙ ПРОГРАММЫ

Ниже приведена часть программа управления скоростью вращения двух коллекторных электродвигателей с последовательным возбуждением для микроконтроллера PIC16F84, работающего на частоте 10мГц.

При записи программы в память микроконтроллера в слове конфигурации должны быть указаны: тип генератора - HS, Watchdog timer - ON, Power-up timer - ON.

LIST P=16F84

Описание встроенных в контроллер ресурсов

RTCC EQU 0x01

PCL EQU 0x02

PCLATH EQU 0x0A

TRISA EQU 0x85

TRISB EQU 0x86

OPTIONS EQU 0x81

STATUS EQU 3

RP0 EQU 5

PORTA EQU 0x05

PORTB EQU 0x06

EEDATA EQU 0x08

EEADR EQU 0x09

EECON1 EQU 0x88

EECON2 EQU 0x89

WREN equ 2

WR equ 1

RD equ 0

FSR EQU 4

F0 EQU 0

INTCON EQU 0x0B

C equ 0

Z equ 2

RBIF equ 0

RTIF equ 2

GIE equ 7

RBIE equ 3

Переменные и константы, используемые для вывода информации на индикатор

R_ST equ 3

C_ST equ 4

NumL EQU 0x0C

NumH EQU 0x0D

REZIM EQU 0x0E

Thou EQU 0x0F

Hund EQU 0x10

Tens EQU 0x11

Ones EQU 0x12

TEMP1 EQU 0x13

I EQU 0x14

J EQU 0x15

Переменные и константы, используемые в процедурах обработки прерываний и управления двигателями

Регистр программных флагов:

  • бит 0-устанавливается каждые 3.3с, сигнализирует о переполнении TimeL

  • бит 1-устанавливается после каждого нового измерения периода оборота

  • бит 2-Установлен если K_ZAP = 0%

  • бит 3-Установлен если K_ZAP = 100%

  • бит 4-Сбрасывается каждые 0.5с, для подавления "дребезга" при нажатии кнопок

  • бит 5-Устанавливается,если с момента последнего сохранения времени в EEROM прошло более 1 минуты

  • бит 7-Установлен,если включен режим стабилизации частоты вращения

FLAGS EQU 0x16

BACKUPW EQU 0x17

K_ZAP EQU 0x18

Ti12 EQU 0x19

Ti3 EQU 0x1A

T_KEY1 EQU 0x1B

N_STEP EQU 0x1C

TIMEA EQU 0x1D

TIMEL EQU 0x1E

TIME_IMPA EQU 0x1F

TIME_IMPL EQU 0x20

N_IMPULS EQU 0x21

F2L EQU 0x22

F2H EQU 0x23

FR_DOGT EQU 0x24

KF_ZAD EQU 0x25

F_REAL EQU 0x26

TIMER1 EQU 0x27

TIMER2 EQU 0x28

BACKUPS EQU 0x29

WTIMEL EQU 0x2A

WTIMEH EQU 0x2B

WI EQU 0x2C

Начальная инициализация контроллера и программы.

BSF STATUS, RP0 ;Устанавливаем страницу памяти 1

CLRF TRISA ;Настраиваем все линии порта А на вывод

MOVLW B'10000111'

GOTO BEGIN_PROG

Точка входа в процедуру обработки прерываний.

BCF INTCON, GIE ;Запрещаем прерывания

MOVWF BACKUPW ;Сохраняем содержимое рабочего регистра

MOVF STATUS, 0 ;и регистра STATUS

MOVWF BACKUPS

BTFSS INTCON, RTIF ;Определяем источник прерывания

GOTO L17 ;Иначе на обработку прерывания от датчика скорости CLRWDT ;Сбрасываем сторожевой таймер

Обработка прерывания от таймера. Выдача управляющих импульсов на транзисторы

;Шаг 1

MOVLW .1

SUBWF N_STEP, 0

BTFSS STATUS, Z

GOTO L28 ; не равно 1

MOVF Ti12, 0;Задаем выдержку времени до следующего шага

MOVWF RTCC

CALL GET_TIME ;Вызываем процедуру учета времени

INCF N_STEP

MOVLW .26;Дальше в зависимости от того, K_ZAP > 50% или K_ZAP < 50%

SUBWF K_ZAP, 0

BTFSC STATUS, C

GOTO L30 ;K_ZAP > 50%

; < 0.5

BTFSS FLAGS, 2 ;если K_ZAP = 0%,то импульс не выдаем

BSF PORTB, 4 ;Открываем VТ2

GOTO L27

; > 0.5

L30 BTFSS FLAGS, 3 ;если K_ZAP = 100%,то импульс не выдаем

BCF PORTB, 5 ;Закрываем VТ4

GOTO L27

;Шаг 2

L28 MOVLW .2

SUBWF N_STEP, 0

BTFSS STATUS, Z

GOTO L29

MOVF Ti12, 0 ;Задаем выдержку времени до следующего шага

MOVWF RTCC

CALL GET_TIME ;Вызываем процедуру учета времени

INCF N_STEP

MOVLW .26 ;Дальше в зависимости от того, K_ZAP > 50% или K_ZAP < 50%

SUBWF K_ZAP, 0

BTFSC STATUS, C

GOTO L65 ;K_ZAP > 50%

; < 0.5

BTFSS FLAGS, 3 ;если K_ZAP = 100%,то импульс не выдаем

BCF PORTB, 4 ;Закрываем VТ2

BTFSS FLAGS, 2 ;если K_ZAP = 0%,то импульс не выдаем

BSF PORTB, 5 ;Открываем VТ4

GOTO L27

; > 0.5

L65 BTFSS FLAGS, 3 ;если K_ZAP = 100%,то импульс не выдаем

BCF PORTB, 4 ;Закрываем VТ2

BTFSS FLAGS, 2 ;если K_ZAP = 0%,то импульс не выдаем

BSF PORTB, 5 ;Открываем VТ4

GOTO L27

;Шаг 3

L29 MOVF Ti3, 0 ;Задаем выдержку времени до следующего шага

MOVWF RTCC

CALL GET_TIME ;Вызываем процедуру учета времени

MOVLW .1

MOVWF N_STEP

MOVLW .26 ;Дальше в зависимости от того, K_ZAP > 50% или K_ZAP < 50%

SUBWF K_ZAP, 0

BTFSC STATUS, C

GOTO L31 ;K_ZAP > 50%

; < 0.5

BTFSS FLAGS, 3 ;если K_ZAP = 100%,то импульс не выдаем

BCF PORTB, 5 ;Запираем VТ4

GOTO L27

; > 0.5

L31 BTFSS FLAGS, 2 ;если K_ZAP = 0%,то импульс не выдаем

BSF PORTB, 4 ;Открываем VТ2

Опрос состояния кнопок управления

L27 BTFSC PORTB, 1 ;Проверка нажатия кнопки "Стоп"

GOTO L16

CLRF KF_ZAD ;Была нажата кнопка 3 ("Стоп"), K_ZAP:=0%

CLRF K_ZAP

BSF FLAGS, 2

BCF FLAGS, 3

Задержка перед повторным изменением KF_ZAD

L16 BTFSC FLAGS, 4

GOTO IRET

BSF FLAGS, 4

Обработка нажатия кнопок управления скоростью

BTFSS PORTB, 3 ;Назначение кнопок Вперед/Назад в зависимости

GOTO L46 ;от направления вращения привода

BTFSC PORTB, 2 ;Проверка нажатия кнопки "Вперед"

GOTO L18

BTFSC PORTB, 0 ;Проверка нажатия кнопки "Назад"

GOTO L15

GOTO IRET

L46 BTFSC PORTB, 2 ;Проверка нажатия кнопки "Вперед"

GOTO L15

BTFSC PORTB, 0 ;Проверка нажатия кнопки "Назад"

GOTO L18

GOTO IRET

;Увеличение KF_ZAD на 5(2)%

L15 MOVLW .100

SUBWF KF_ZAD, 0

BTFSC STATUS, Z

GOTO IRET ;KF_ZAD Уже достиг 100%

BTFSC FLAGS, 7 ;Если включен режим стабилизации,

MOVLW .5 ;то приращение KF_ZAD=5%

BTFSS FLAGS, 7 ;иначе приращение K_ZAP=2%

MOVLW .2

ADDWF KF_ZAD, 1

GOTO IRET

;Уменьшение KF_ZAD на 5(2)%

L18 MOVF KF_ZAD, 1

BTFSS STATUS, Z

GOTO L95

BTFSS PORTB, 3 ;KF_ZAD Уже достиг 0%

GOTO L96 ;Меняем направления вращения привода

BCF PORTB, 3

GOTO L15

L96 BSF PORTB, 3

GOTO L15

L95 BTFSC FLAGS, 7 ;Если включен режим стабилизации,

MOVLW .5 ;то приращение KF_ZAD=5%

BTFSS FLAGS, 7 ;иначе приращение K_ZAP=2%

MOVLW .2

SUBWF KF_ZAD, 1

Завершение обработки прерывания от таймера

IRET BCF INTCON, RTIF ;Сброс флага прерывания от таймера

MOVF BACKUPS, 0

MOVWF STATUS

MOVF BACKUPW, 0 ;Восстановление рабочего регистра

BSF INTCON, GIE ;Разрешение прерываний

RETFIE ;Возврат из обработки прерывания

Обработка прерывания от датчика частоты вращения двигателя

L17 BTFSS PORTB, 7

GOTO IRET2 ;Реагируем только на положительное изменение полярности

DECFSZ N_IMPULS, 1

GOTO IRET2

BCF INTCON, RBIE ;Запрещение прерываний от датчика скорости

MOVLW .2

MOVWF N_IMPULS

BTFSC FLAGS, 0 ;Произошло переполнение TIMEL, последнее измерение

GOTO L71 ;недействительно

Вычисляем время, прошедшее с начала отсчета импульсов от датчика скорости

MOVF TIME_IMPA, 0

SUBWF TIMEA, 0

BTFSS STATUS, C ;Проверяем на переполнение

INCF TIME_IMPL, 1

MOVWF TIME_IMPA

MOVF TIME_IMPL, 0

SUBWF TIMEL, 0

MOVWF TIME_IMPL

MOVLW .1 ;Учитываем текущее содержимое таймера RTCC

SUBWF N_STEP, 0

BTFSS STATUS, Z

GOTO L19

MOVF Ti3, 0

GOTO L75

L19 MOVF Ti12, 0

L75 SUBWF RTCC, 0

ADDWF TIME_IMPA, 1

BTFSS STATUS, C ;Проверяем на переполнение

INCF TIME_IMPL, 1

MOVF TIME_IMPA, 0

MOVWF F2L

MOVF TIME_IMPL, 0

MOVWF F2H

L71 BSF FLAGS, 1 ;Сигнализируем процедуре STABIL об окончании измерения

Завершение обработки прерывания от датчика частоты вращения

IRET2 MOVLW .40 ;Устанавливаем в программный таймер максимально

MOVWF FR_DOGT ;допустимую задержку до прихода следующего импульса

BCF INTCON, RBIF ;сброс флага прерываний от PORTB

MOVF BACKUPS, 0

MOVWF STATUS ;Восстановление регистра STATUS

MOVF BACKUPW, 0 ;Восстановление рабочего регистра

BSF INTCON, GIE ;Разрешение прерываний

RETFIE ;Возврат из обработки прерывания

Продолжение начальной инициализации

BEGIN_PROG

MOVWF TRISB ;Настраиваем входы 0, 1, 2, 7 порта В на ввод.

MOVLW B'01000111' ;Подключаем пределитель к таймеру и устанавливаем коэффициент

MOVWF OPTIONS ;деления 1:128, сигнал на таймер от внутреннего генератора

BCF STATUS, RP0 ;Устанавливаем страницу памяти 0

CLRF PORTB

CLRF F_REAL ;Инициализируем используемые в программе

CLRF K_ZAP ;переменные

CLRF KF_ZAD

MOVLW .40

MOVWF T_KEY1

CLRF TIMEA

CLRF TIMEL

MOVLW .1

MOVWF N_STEP

MOVLW .2

MOVWF N_IMPULS

MOVLW .20

MOVWF FR_DOGT

CLRF TIMER1

CLRF TIMER2

CLRF FLAGS

BSF FLAGS, 2

MOVLW .128

MOVWF Ti12

MOVWF Ti3

MOVLW .18

MOVWF WI

Загружаем из энергонезависимой памяти общее время работы системы

CALL LEEPROM

MOVLW .5

SUBWF REZIM, 0

BTFSC STATUS, Z

BSF FLAGS, 7

MOVLW B'10101000' ;Разрешаем прерывание от изменения на RB

MOVWF INTCON ;и переполнения таймера

Блок-схема алгоритма работы устройства представлена в приложении А.

Соседние файлы в папке Микроконтроллерный синтезатор частоты