Люди добрые, помогите! Такая проблема: 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
Проблема с шаговым двигателем.
- Реклама
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Проблема с шаговым двигателем.
... действительно проблема - шаговым двигателем так не управляют. Если резко перейти от одной скорости к другой - возможен пропуск шагов, ну и ток потребления на низких оборотах будет заметно выше ( ... если уж делать, то сразу с ШИМ, и какого-нибудь tiny2313 для этого вполне хватит )Ленин писал(а):Такая проблема: 16 дискретно заданных скоростей (4,8,12...64 об/мин), ....
