Проблема с шаговым двигателем.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Ленин
Родился
Сообщения: 2
Зарегистрирован: Сб апр 09, 2011 08:28:42

Проблема с шаговым двигателем.

Сообщение Ленин »

Люди добрые, помогите! Такая проблема: 16 дискретно заданных скоростей (4,8,12...64 об/мин), контроллер Atmega8535, управление униполярное, симметричное. Программу составил, проверил на симуляторе(AVR Studio), всё работает, обмоточки переключаются с заданной частотой, на PORTC, отвечающий за индикацию выводит всё, что нужно. Но как дело доходит до прошивки самого контроллера, индикация молчит, двигатель стоит. Всё перебрал, не знаю, где косяк. Поглядите, пожалуйста на программу:


; программа управления шаговым двигателем n=4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64 об/мин
;Порты:
; PINA-вход, 0бит-разрешение;
; PORTB-управление обмоткой шагового двигателя "0бит:А+", "1бит:В+", "2бит:А-", "3бит:В-"
; PORTC-сегменты индикаторов
; PORTD-катоды индикаторов
; Таймер Т0-по переполнению f1=13,3Гц
; r16, r17-рабочие регистры
; r20-регистр управления обмотками ШД 1,2,4,8
; r21-счётный регистр 1,2,4,8
; r22-регистр смещения

.include"m8535def.inc"
.cseg ; начало сегмента кодов
.org 0
rjmp reset
.org 9
rjmp T0
.org $20

reset: ; инициализация

ldi r16, low(RAMEND)
ldi r17, high(RAMEND)
out spl, r16
out sph, r17
ldi r16, 0xFF
clr r17
out DDRA, r17
out DDRB, r16
out DDRC, r16
out DDRD, r16
out PORTA, r16
out TCCR0, r17
ldi r16, 6
out TCNT0, r16
ldi r16,3
out TCCR0, r16 ;запуск Т0 с частотой 500Гц
SEI
ldi r16, 1
out TIMSK, r16 ; разрешение прерываний Т0

;ШД
ldi r16, 0 ;начальные условия
out PORTB, r16
ldi r20, 1 ;нач значение ШД "А+"
ldi r21, 1
clr r22
clr r25
ldi r31, $10 ;Z-регистр на ФЛЕШ
ldi r30, 0
main:
rjmp main
T0:
ldi r16, 6
out TCNT0, r16
in r25, PINA ;PINA в r25
rjmp Skor1_4


; уcтановка скоростей
Skor1_4:
clc
cpi r25, 0 ;если PINA=0, то двигатель стоит
breq net_razr
cpi r25, 1 ;если PINA=1, то 4 об/мин
breq T0_1
cpi r25, 2 ;8 об/мин
breq T0_2
cpi r25, 3 ;12 об/мин
breq T0_3
cpi r25,4 ;16 об/мин
breq T0_4
rjmp Skor5_8 ;если больше,"прыгаем"

net_razr: ; НЕТ разрешения
clr r16
out PORTB, r16 ;двигатель "стоп"
ldi r30, 0 ;указатель на строку "0"
rjmp end

est_razr: ; ЕСТЬ разрешение
rol r20 ;вращение, обмотка "В+"...
cpi r20, 0x10
brne m1
ldi r20, 1
rcall dyn_indic

m1:
out PORTB, r20 ; вращение двигателя
rjmp end

; прерывание Т0

T0_1:
; инициализация таймера
out TCCR0, r17
ldi r16, 108
out TCNT0, r16 ; запуск Т0 с частотой 13,3Гц
ldi r16, 5
out TCCR0, r16 ; коэффициент предделителя 1024

work1:
clc ;очистка бита переноса
cpi r25, 1 ;если PINA = 1,
breq oborot4 ;то переходим в 4_ob

; вращение вперед со скоростью 4об/мин
oborot4: ldi r30, 4 ;Указатель перевести на строку "4"
rjmp est_razr

T0_2:
; инициализация таймера
out TCCR0, r17
ldi r16, 181
out TCNT0, r16 ; запуск Т0 с частотой 26,6Гц
ldi r16, 5
out TCCR0, r16 ; коэффициент предделителя 1024

work2:
clc ;очистка бита переноса
cpi r25, 2 ;если PINA = 2,
breq oborot8 ;то переходим в 8_ob

; вращение вперед со скоростью 8об/мин
oborot8: ldi r30, 8 ;Указатель перевести на строку "8"
rjmp est_razr

T0_3:
; инициализация таймера
out TCCR0, r17
ldi r16, 206
out TCNT0, r16 ; запуск Т0 с частотой 40 Гц
ldi r16, 5
out TCCR0, r16 ; коэффициент предделителя 1024

work3:
clc ;очистка бита переноса
cpi r25, 3 ;если PINA = 3,
breq oborot12 ;то переходим в 12_ob

; вращение вперед со скоростью 12об/мин
oborot12: ldi r30, 12 ;Указатель перевести на строку "12"
rjmp est_razr

T0_4:
; инициализация таймера
out TCCR0, r17
ldi r16, 218
out TCNT0, r16 ; запуск Т0 с частотой 53,3Гц
ldi r16, 5
out TCCR0, r16 ; коэффициент предделителя 1024

work4:
clc ;очистка бита переноса
cpi r25, 4 ;если PINA = 4,
breq oborot16 ;то переходим в 16_ob

; вращение вперед со скоростью 16об/мин
oborot16:
ldi r30, 16 ;Указатель перевести на строку "16"
rjmp est_razr

Skor5_8:
cpi r25, 5 ;20 об/мин
breq T0_5
cpi r25, 6 ;24 об/мин
breq T0_6
cpi r25, 7 ;28 об/мин
breq T0_7
cpi r25,8 ;32 об/мин
breq T0_8
rjmp Skor9_12

T0_5:
; инициализация таймера
out TCCR0, r17
ldi r16, 138
out TCNT0, r16 ; запуск Т0 с частотой 66Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work5:
clc ;очистка бита переноса
cpi r25, 5 ;если PINA = 5,
breq oborot20 ;то переходим в 20_ob

; вращение вперед со скоростью 20об/мин
oborot20: ldi r30, 20 ;Указатель перевести на строку "20"
rjmp est_razr

T0_6:
; инициализация таймера
out TCCR0, r17
ldi r16, 157
out TCNT0, r16 ; запуск Т0 с частотой 80Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work6:
clc ;очистка бита переноса
cpi r25, 6 ;если PINA = 6,
breq oborot24 ;то переходим в 24_ob

; вращение вперед со скоростью 24об/мин
oborot24: ldi r30, 24 ;Указатель перевести на строку "24"
rjmp est_razr

T0_7:
; инициализация таймера
out TCCR0, r17
ldi r16, 171
out TCNT0, r16 ; запуск Т0 с частотой 93,3Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work7:
clc ;очистка бита переноса
cpi r25, 7 ;если PINA = 7,
breq oborot28 ;то переходим в 28_ob

; вращение вперед со скоростью 28об/мин
oborot28: ldi r30, 28 ;Указатель перевести на строку "28"
rjmp est_razr

T0_8:
; инициализация таймера
out TCCR0, r17
ldi r16, 181
out TCNT0, r16 ; запуск Т0 с частотой 106,7Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work8:
clc ;очистка бита переноса
cpi r25, 8 ;если PINA = 8,
breq oborot32 ;то переходим в 32_ob

; вращение вперед со скоростью 32об/мин
oborot32: ldi r30, 32 ;Указатель перевести на строку "32"
rjmp est_razr

Skor9_12:
cpi r25, 9 ;36 об/мин
breq T0_9
cpi r25, 10 ;40 об/мин
breq T0_10
cpi r25, 11 ;44 об/мин
breq T0_11
cpi r25,12 ;48 об/мин
breq T0_12
rjmp Skor13_16

T0_9:
; инициализация таймера
out TCCR0, r17
ldi r16, 190
out TCNT0, r16 ; запуск Т0 с частотой 120Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work9:
clc ;очистка бита переноса
cpi r25, 9 ;если PINA = 9,
breq oborot36 ;то переходим в 36_ob

; вращение вперед со скоростью 36об/мин
oborot36: ldi r30, 36 ;Указатель перевести на строку "36"
rjmp est_razr

T0_10:
; инициализация таймера
out TCCR0, r17
ldi r16, 196
out TCNT0, r16 ; запуск Т0 с частотой 133,3Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work10:
clc ;очистка бита переноса
cpi r25, 10 ;если PINA = 10,
breq oborot40 ;то переходим в 40_ob

; вращение вперед со скоростью 40об/мин
oborot40: ldi r30, 40 ;Указатель перевести на строку "40"
rjmp est_razr

T0_11:
; инициализация таймера
out TCCR0, r17
ldi r16, 201
out TCNT0, r16 ; запуск Т0 с частотой 146,7Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work11:
clc ;очистка бита переноса
cpi r25, 11 ;если PINA = 11,
breq oborot44 ;то переходим в 44_ob

; вращение вперед со скоростью 44об/мин
oborot44: ldi r30, 44 ;Указатель перевести на строку "44"
rjmp est_razr

T0_12:
; инициализация таймера
out TCCR0, r17
ldi r16, 206
out TCNT0, r16 ; запуск Т0 с частотой 160Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work12:
clc ;очистка бита переноса
cpi r25, 12 ;если PINA = 12,
breq oborot48 ;то переходим в 48_ob

; вращение вперед со скоростью 48об/мин

oborot48: ldi r30, 48 ;Указатель перевести на строку "48"
rjmp est_razr

Skor13_16:
cpi r25, 13 ;52 об/мин
breq T0_13
cpi r25, 14 ;56 об/мин
breq T0_14
cpi r25, 15 ;60 об/мин
breq T0_15
cpi r25,16 ;64 об/мин
breq T0_16
rjmp Skor1_4

T0_13:
; инициализация таймера
out TCCR0, r17
ldi r16, 209
out TCNT0, r16 ; запуск Т0 с частотой 173,3Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work13:
clc ;очистка бита переноса
cpi r25, 13 ;если PINA = 13,
breq oborot52 ;то переходим в 52_ob

; вращение вперед со скоростью 52об/мин
oborot52: ldi r30, 52 ;Указатель перевести на строку "52"
rjmp est_razr

T0_14:
; инициализация таймера
out TCCR0, r17
ldi r16, 213
out TCNT0, r16 ; запуск Т0 с частотой 186,7Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work14:
clc ;очистка бита переноса
cpi r25, 14 ;если PINA = 14,
breq oborot56 ;то переходим в 56_ob

; вращение вперед со скоростью 56об/мин
oborot56: ldi r30, 56 ;Указатель перевести на строку "56"
rjmp est_razr

T0_15:
; инициализация таймера
out TCCR0, r17
ldi r16, 216
out TCNT0, r16 ; запуск Т0 с частотой 200Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work15:
clc ;очистка бита переноса
cpi r25, 15 ;если PINA = 15,
breq oborot60 ;то переходим в 60_ob

; вращение вперед со скоростью 60об/мин
oborot60: ldi r30, 60 ;Указатель перевести на строку "60"
rjmp est_razr

T0_16:
; инициализация таймера
out TCCR0, r17
ldi r16, 218
out TCNT0, r16 ; запуск Т0 с частотой 213,3Гц
ldi r16, 4
out TCCR0, r16 ; коэффициент предделителя 256

work16:
clc ;очистка бита переноса
cpi r25, 16 ;если PINA = 16,
breq oborot64 ;то переходим в 64_ob

; вращение вперед со скоростью 64об/мин

oborot64: ldi r30, 64 ;Указатель перевести на строку "64"
rjmp est_razr
end:
rcall dyn_indic
reti



dyn_indic:
clc
rol r21 ; сдвиг счетного регистра
inc r22 ; инкремент смещения символов во ФЛЕШ
cpi r21, 0x04
brne m22
ldi r21, 1
clr r22

m22:
add r30, r22
lpm ;чтение из ФЛЕШ
out PORTC, r0 ;вывод данных в сегменты
out PORTD, r21
reti


.org 0x800
.db 0b00111111,0,0,0, 0b01100110,0,0,0, 0b01111111,0,0,0, 0b01011011,0b00000110,0,0, 0b01111101,0b00000110,0,0, 0b00111111,0b01011011,0,0, 0b01100110,0b01011011,0,0, 0b01111111,0b01011011,0,0, 0b01011011,0b01001111,0,0, 0b01111101,0b01001111,0,0, 0b00111111,0b01100110,0,0, 0b01100110,0b01100110,0,0, 0b01111111,0b01100110,0,0, 0b01011011,0b01101101,0,0, 0b01111101,0b01101101,0,0, 0b00111111,0b01111101,0,0, 0b01100110,0b01111101,0,0
; 0 4 8 2 1 6 1 0 2 4 2 8 2 2 3 6 3 0 4 4 4 8 4 2 5 6 5 0 6 4 6
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Проблема с шаговым двигателем.

Сообщение pyzhman »

Вам бы сторожевой таймер остановить. :))
Docendo discimus
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Проблема с шаговым двигателем.

Сообщение ChipKiller »

Ленин писал(а):Такая проблема: 16 дискретно заданных скоростей (4,8,12...64 об/мин), ....
... действительно проблема - шаговым двигателем так не управляют. Если резко перейти от одной скорости к другой - возможен пропуск шагов, ну и ток потребления на низких оборотах будет заметно выше ( ... если уж делать, то сразу с ШИМ, и какого-нибудь tiny2313 для этого вполне хватит )
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»