Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 12:58   #1
NixHound
 
Регистрация: 13.12.2009
Сообщений: 4
По умолчанию Управление шаговым двигателем

Здраствуйте, помогите, кто может, разобраться в фрагменте кода.
Суть - управление перемещением фильтра посредством шагового двигателя. ШД - тактируется 4х разрядными числами. Должен делать 1 шаг через подпрограмму.
МК - PIC16C74. Частота PIC - 4Мгц.
CodeOptFiltr - код упр. ШД смены светофильтров
Код:

movlw	b'00110011'	; начальный код управления ШД
movwf	CodeOptFiltr;
movf
MET1 CodeOptFiltr,w	; обнулить старшие разряды кода упр/ ШД  
andlw	0fh	;для подачи кода на ШД1
movwf	PORTB	
movf	CodeOptFiltr,w	;загрузить код управл. ШД1 в WREG
call	RotPLUS	
movwf	CodeOptFiltr
decfsz	StepOF		;проверяем счетчик шагов ШД1
goto	MET1	
-----------------------
RotPLUS

movwf	kod	;сдвиг кода на 1 позицию вправо	по часовой 
rrf	kod,w	;без занесения в флаг переноса мл. разряда
rrf	kod,f
movf	kod,w
return
Не могу разобраться в принципе тактирования ШД. Зачем дважды сдвигать код и зачем брали 8и-разрядный код, если все равно 4 старших байта обнуляют?

Последний раз редактировалось NixHound; 13.12.2009 в 13:36.
NixHound вне форума Ответить с цитированием
Старый 13.12.2009, 13:06   #2
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

опять гадать по ассемблеру, хоть тип процессора указывайте
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 13.12.2009, 13:14   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

укажите подробнее, что за PIC...
по тактированию ШД смотрите статьи DeKot на форуме...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 13.12.2009 в 13:17.
raxp вне форума Ответить с цитированием
Старый 13.12.2009, 13:47   #4
NixHound
 
Регистрация: 13.12.2009
Сообщений: 4
По умолчанию

МК - PIC16C74.
Посмотрел статьи Dekot, мтериал есть, но проблема в том, что мне нужна прога под ШД с системой команд примерно как в проге, что я приложил. Команды типа if begin не пойдут(
Если конкретнее - для тактирования в принципе должно хватать и 4 разрядов, движок 4х фазный с полным шагом в 1.8 градуса (200 шагов на 2п). Как я понимаю - необходимо смещать код, но почему нельзя просто сдвинуть и все, без всяких подпрограмм, я не догоняю(

Последний раз редактировалось NixHound; 13.12.2009 в 14:05.
NixHound вне форума Ответить с цитированием
Старый 13.12.2009, 20:39   #5
NixHound
 
Регистрация: 13.12.2009
Сообщений: 4
По умолчанию

Эх...ну я не знаю или подскажите как реализовать сию тему. Мне под asm надо...
NixHound вне форума Ответить с цитированием
Старый 14.12.2009, 00:25   #6
NixHound
 
Регистрация: 13.12.2009
Сообщений: 4
По умолчанию

Я тут попробовал сам написать....Посмотрите кто-нибудь...

Код:
SHAG_F:  CLRF 	PORTC	  	;подпрограмма "ШАГ ДВ1"
	MOVF  	SH_DV2,0
	IORWF	PORTC,1	
	CALL 	TIME
	RLF  	SH_DV2,1
	BTFSS 	SH_DV2,4
	GOTO	M8
	BSF 	SH_DV2,0
	GOTO	M9
M8:	BCF	SH_DV2,0
M9:	BCF	SH_DV2,4
	RETURN
NixHound вне форума Ответить с цитированием
Старый 21.08.2017, 21:32   #7
AdisPrint
 
Регистрация: 21.08.2017
Сообщений: 5
По умолчанию

Привет. Сразу скажу, я не программист и быть им не собираюсь, так что прошу не отсылать изучать ассемблер. Есть драйвер управления шаговым двигателем на PIC16F84. Данная программа выдает от 27 до 128 оборотов в минуту. Частота корректируется переменным резистором, меняется тактовая частота генератора прямоугольных импульсов. Появилась потребность увеличить обороты двигателя в 5-10 раз. Аппаратно путем замены кварца и других деталей удалось немного увеличить частоту, но не кардинально и больше не выжать без переделки схемы. Собственно вопрос, можно ли увеличить частоту программно?

Цитата:
; Stepper Motor controller
;
; Author : Seiichi Inoue
;********************************** **********************

list p=pic16f84a
include p16f84a.inc
__config _hs_osc & _wdt_off & _pwrte_on & _cp_off

;**************** Label Definition ********************
cblock h'0c'
mode ;Operation mode
;0=stop 1=right 2=left
count1 ;Wait counter
count2 ;Wait counter(for 1msec)
endc

rb0 equ 0 ;RB0 of PORTB
rb1 equ 1 ;RB1 of PORTB
rb2 equ 2 ;RB2 of PORTB
rb5 equ 5 ;RB5 of PORTB
rb7 equ 7 ;RB7 of PORTB

;**************** Program Start ***********************
org 0 ;Reset Vector
goto init
org 4 ;Interrupt Vector
clrf intcon ;Clear Interruption reg

;**************** Initial Process *********************
init
bsf status,rp0 ;Change to Bank1
clrf trisa ;Set PORTA all OUT
movlw b'00100111' ;RB0,1,2.5=IN RB7=OUT
movwf trisb ;Set PORTB
movlw b'10000000' ;RBPU=1 Pull up not use
movwf option_reg ;Set OPTION_REG
bcf status,rp0 ;Change to Bank0
clrf mode ;Set mode = stop
clrf count1 ;Clear counter
clrf count2 ;Clear counter
movlw b'00000101' ;Set PORTA initial value
movwf porta ;Write PORTA
bsf portb,rb7 ;Set RB7 = 1
btfsc portb,rb5 ;RB5 = 0 ?
goto $-1 ;No. Wait

start
;************* Check switch condition *****************
btfsc portb,rb1 ;RB1(stop key) = ON ?
goto check1 ;No. Next
clrf mode ;Yes. Set stop mode
goto drive ;No. Jump to motor drive
check1
btfsc portb,rb2 ;RB2(right key) = ON ?
goto check2 ;No. Next
movlw d'1' ;Yes. Set right mode
movwf mode ;Save mode
goto drive ;No. Jump to motor drive
check2
btfsc portb,rb0 ;RB0(left key) = ON ?
goto drive ;No. Jump to motor drive
movlw d'2' ;Yes. Set left mode
movwf mode ;Save mode

;******************** Motor drive *********************
drive
movf mode,w ;Read mode
bz start ;mode = stop
bsf portb,rb7 ;Set RB7 = 1
btfsc portb,rb5 ;RB5 = 0 ?
goto $-1 ;No. Wait
movlw d'5' ;Set loop count(5msec)
movwf count1 ;Save loop count
loop call timer ;Wait 1msec
decfsz count1,f ;count - 1 = 0 ?
goto loop ;No. Continue
bcf portb,rb7 ;Set RB7 = 0
btfss portb,rb5 ;RB5 = 1 ?
goto $-1 ;No. Wait
movf porta,w ;Read PORTA
sublw b'000000101' ;Check motor position
bnz drive2 ;Unmatch
movf mode,w ;Read mode
sublw d'1' ;Right ?
bz drive1 ;Yes. Right
movlw b'00001001' ;No. Set Left data
goto drive_end ;Jump to PORTA write
drive1
movlw b'00000110' ;Set Right data
goto drive_end ;Jump to PORTA write
;-------
drive2
movf porta,w ;Read PORTA
sublw b'000000110' ;Check motor position
bnz drive4 ;Unmatch
movf mode,w ;Read mode
sublw d'1' ;Right ?
bz drive3 ;Yes. Right
movlw b'00000101' ;No. Set Left data
goto drive_end ;Jump to PORTA write
drive3
movlw b'00001010' ;Set Right data
goto drive_end ;Jump to PORTA write
;-------
drive4
movf porta,w ;Read PORTA
sublw b'000001010' ;Check motor position
bnz drive6 ;Unmatch
movf mode,w ;Read mode
sublw d'1' ;Right ?
bz drive5 ;Yes. Right
movlw b'00000110' ;No. Set Left data
goto drive_end ;Jump to PORTA write
drive5
movlw b'00001001' ;Set Right data
goto drive_end ;Jump to PORTA write
;-------
drive6
movf porta,w ;Read PORTA
sublw b'000001001' ;Check motor position
bnz drive8 ;Unmatch
movf mode,w ;Read mode
sublw d'1' ;Right ?
bz drive7 ;Yes. Right
movlw b'00001010' ;No. Set Left data
goto drive_end ;Jump to PORTA write
drive7
movlw b'00000101' ;Set Right data
goto drive_end ;Jump to PORTA write
;-------
drive8
movlw b'00000101' ;Compulsion setting

drive_end
movwf porta ;Write PORTA
goto start ;Jump to start

;************* 1msec Timer Subroutine *****************
timer
movlw d'200' ;Set loop count
movwf count2 ;Save loop count
tmlp nop ;Time adjust
nop ;Time adjust
decfsz count2,f ;count - 1 = 0 ?
goto tmlp ;No. Continue
return ;Yes. Count end

;********************************** **********************
; END of Stepper Motor controller
;********************************** **********************

end
AdisPrint вне форума Ответить с цитированием
Старый 22.08.2017, 10:30   #8
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Там, между прочим, в описании программы написано:
Цитата:
In the high-speed control, the rotor doesn't follow the change of the magnetic pole and the step motor doesn't rotate normally. It sets a timer value to turn a full speed normally.
In case of the motor which was used this time, it doesn't rotate normally when making less than 5 milliseconds.

При высокоскоростном управлении ротор не успевает за изменением магнитного поля, и шаговый двигатель не вращается нормально. Устанавливается значение таймера для нормального вращения на полной скорости.

В случае двигателя, который был использован в этот раз, он не вращается нормально, когда задержка составляет менее 5 миллисекунд.
Black Fregat вне форума Ответить с цитированием
Старый 22.08.2017, 10:32   #9
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от AdisPrint Посмотреть сообщение
movlw d'5' ;Set loop count(5msec)
Вот строчка, где устанавливается задержка 5 мс
Black Fregat вне форума Ответить с цитированием
Старый 22.08.2017, 16:05   #10
AdisPrint
 
Регистрация: 21.08.2017
Сообщений: 5
По умолчанию

Black Fregat Спасибо, но честно говоря не понял про какое описание Вы говорите. Не знаю какой движок использовал автор, у меня DYNASYN 4SHG-023A 39S. И я видел в инете ролики где его раскручивают, ну мягко говоря значительно быстрее 100 об/мин.
Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Вот строчка, где устанавливается задержка 5 мс
Т.е. уменьшая значение можно увеличить число оборотов?

А что вот эта строчка делает?
Цитата:
movlw d'200' ;Set loop count
AdisPrint вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление шаговым двигателем KillJoy Помощь студентам 2 09.12.2009 15:20
Управление ярлыками FatumS Общие вопросы Delphi 31 10.07.2009 20:31
Управление фокусом JOHNKZ1 Общие вопросы Delphi 9 17.04.2009 17:03
Управление памятью Raz0r Помощь студентам 4 02.03.2009 18:42
Управление с клавиатуры kpishnik Помощь студентам 10 27.07.2008 18:38