Räkna ut antal steg för 1 helt varv på växlad stegmotor

Robot, CNC, Pneumatik, Hydraulik, mm
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av PopUnoNkoK »

Hej

Har ställt denna fråga i långt in i en tråd om en klocka. Den tråden är dock ganska död så jag ställer frågan här i stället.
Då stegmotorn i fråga är en vanlig "nybörjar motor" så kanske någon annan kan ha nytta av frågan.

Så här ser frågan ut:

StegMotorn

När jag i koden testar att bara driva motorn ett varv och sedan stanna så stämmer det inte med mina uträkningar.
När jag nu lyckats få den att köra ett varv och sedan stanna så kör den 2048helsteg.

Hur ska jag med denna info komma fram till det svaret.

Citera:
•Step angle: 5.625 x 1/64
•Reduction ratio: 1/64

Alltså så här ser det ut just nu.
Min kod där jag byter vilket "steg" som ska skickas till stegmotorn har 8 steg. Men det är med halvsteg så det motsvarar bara 4 helsteg.

Jag räknar nu varje gång den nollar, börjar om från början på denna "stegserie".
Alltså när jag räknar så motsvarar varje räkning 4 helsteg.

Sedan har jag två register. Ett som som räknar ner från 128.
Sedan ett som räknar ner från 4, ett steg varjegång den andra räknaren når noll.

Detta blir enligt mig: 4*128*4=2048.

Hur jag kommit fram till denna siffra är att när jag räknade själv så fick jag det till att ett varv skulle vara 4096 steg. När jag sedan testade så såg jag att den gick 2 varv.

Så om någon orkar och vill, hur gör jag för att räkna ut antalet steg på ett varv via mattematisk väg.

MVH Peter
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av Bola »

Fick det också till att ett varav skulle vara 4096 steg. Men är du säker på att du tar 4096 steg och inte 8192?
Jag tänker på detta som du skrev:
Min kod där jag byter vilket "steg" som ska skickas till stegmotorn har 8 steg. Men det är med halvsteg så det motsvarar bara 4 helsteg.
Där skiljer det ju nämligen en faktor två vilket det också gör i slutresultatet.
Användarvisningsbild
Walle
Moderator
Inlägg: 7701
Blev medlem: 14 december 2004, 10:32:18
Ort: Stockholm

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av Walle »

Har du verifierat att du verkligen driver den i halvsteg och inte helsteg?
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av PopUnoNkoK »

Ja alltså jag är (ganska) säker på att jag driver den med halvsteg. Har skrivit koden helt själv och det är som sagt första gången jag sysslar med en stegmotor.

Så här ser min tabell ut där PICen hämtar info om vilkar bitar den ska lägga ut till motorn på PORTC.

Kod: Markera allt

rulla_bitar		ADDWF PCL,F					; Hoppa till rätt "Steg" med värdet i w.
				RETLW b'10000000'			; Halvsteg      
				RETLW b'11000000' 
				RETLW b'01000000' 
				RETLW b'01001000' 
				RETLW b'00001000'                
				RETLW b'00011000' 
				RETLW b'00010000' 
				RETLW b'10010000'   
Bitarna sitter inte i "konologisk ordning" här i tabellen eftersom jag har gjprt det så enkelt som möjligt när jag skulle designa kretskortet.
Men om man bara tittar på de tre första raderna. Visst måste det där vara det som kallas halvsteg?

Jag ska gå igenom koden igen och kolla om det är min "räkna-steg-rutin" som är knasigt skriven.

Återkommer.

MVH Peter
bildgravyr
Inlägg: 150
Blev medlem: 8 augusti 2010, 15:53:13
Ort: Umeå

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av bildgravyr »

1 varv på motorn är 360/5.625 = 64 steg, 1 varv på axeln (efter 1/64 utväxling) blir 64*64=4096 steg
DavidS
Inlägg: 77
Blev medlem: 26 maj 2008, 14:56:34
Ort: Falun

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av DavidS »

PopUnoNkoK skrev:Ja alltså jag är (ganska) säker på att jag driver den med halvsteg. Har skrivit koden helt själv och det är som sagt första gången jag sysslar med en stegmotor.

Så här ser min tabell ut där PICen hämtar info om vilkar bitar den ska lägga ut till motorn på PORTC.

Kod: Markera allt

rulla_bitar		ADDWF PCL,F					; Hoppa till rätt "Steg" med värdet i w.
				RETLW b'10000000'			; Halvsteg      
				RETLW b'11000000' 
				RETLW b'01000000' 
				RETLW b'01001000' 
				RETLW b'00001000'                
				RETLW b'00011000' 
				RETLW b'00010000' 
				RETLW b'10010000' t
Bitarna sitter inte i "konologisk ordning" här i tabellen eftersom jag har gjprt det så enkelt som möjligt när jag skulle designa kretskortet.
Men om man bara tittar på de tre första raderna. Visst måste det där vara det som kallas halvsteg?

Jag ska gå igenom koden igen och kolla om det är min "räkna-steg-rutin" som är knasigt skriven.

Återkommer.

MVH Peter
Försökte hitta felet men såg att det inte var kronologisk ordning så det blir ju lite svårt att hitta problemet med koden om det är något knas med den.

Man brukar ha den här sekvensen:
1000
1100
0100
0110
0010
0011
0001
1001

Men i ditt fall eftersom du kör på övre fyra bitarna och inte använder bit5 så borde din stegsekvens vara denna:
10000000
11000000
01000000
01010000
00010000
00011000
00001000
10001000
Senast redigerad av DavidS 30 april 2012, 18:45:18, redigerad totalt 4 gånger.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av v-g »

Mitt tips är att sätta en pinne på axeln och sen köra och se hur det blir! Har man bara axeln ser man inget.

Tex en penna och limpistolen ;)
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av PopUnoNkoK »

DavidS: Ordningen på bitarna ser ut så pga hur pinnarna ligger på PORTC på PIC16f690. Om du tittar på bilden där man ser ledningsbanorna på kretskortet så har jag ringat in de raka banorna. Hade jag kört koden så att PORTC registret såg ut som i ditt exempel hade jag inte kunnat haft sånna enkla ledningsbanor, i alla fall inte utan att löda om stegmotorns kontakt.
Motorn går dessutom väldigt jämt och fint så jag tror inte att det är där problemet ligger. I bilden med från simulatorns logicAnalyser så ligger bitarna i den ordningen som jag har kopplat dom och det ser rätt ut tycker jag.
(Jo förresten, jag har ändrat till att enbart köra helsteg för tillfället för att minimera antalet saker som jag kan räkna fel på)

V-G: Det första jag gjorde när jag fick stegmotorn var att fräsa en liten "testrigg" för att kunna labba med stegmotorn. :)
logic.jpg
bild_2.JPG
bild_3.JPG
Som sagt så har jag ändrat lookUp tablen till helsteg. Så här ser det ut nu.

Kod: Markera allt

rulla_bitar		ADDWF PCL,F					; Hoppa till rätt "Steg" med värdet i w.
				RETLW b'10000000'			; Helsteg      
				RETLW b'01000000'			; 
				RETLW b'00001000'			;
				RETLW b'00010000' 			; 
I övrigt har jag inte kommit närmare någon lösning.

Här är koden som räknar antalet steg som den har gjort. Rutinen "rulla_bitar" tar alltså nästa steg i LookUp tablen. Alltså ett helsteg varje gång denna kod körs.

Kod: Markera allt

	
MISC_C_1_VALUE		EQU		.128
MISC_C_2_VALUE		EQU		.32


	BANKSEL	STEP_COUNTER
		MOVFW	STEP_COUNTER		;Kolla vilken "steg" vi är på
		BANKSEL	PCL
		CALL	rulla_bitar			;Hämta rätt bitar från LookUpTable
		BANKSEL	PORTC
		MOVWF	PORTC				;Lägg ut till världen
;-----------------------------------------------------
;             
;-----------------------------------------------------
		BANKSEL	MISC_COUNTER_1

		DECFSZ	MISC_COUNTER_1		
		GOTO	ISR_SLUT_1

		MOVLW	MISC_C_1_VALUE		;Återställ ettan
		MOVWF	MISC_COUNTER_1


		BANKSEL	MISC_COUNTER_2

		DECFSZ	MISC_COUNTER_2
		GOTO	ISR_SLUT_1

		MOVLW	MISC_C_2_VALUE		;Återställ tvåan
		MOVWF	MISC_COUNTER_2

		BANKSEL	INTCON
		MOVLW	b'00000000'			;Slå av Global interrupt OCH TMRO Interuppt, så att den stannar efter ett(!?) varv.
		MOVWF	INTCON
Nu måste jag sova, ska göra ett nytt försök imorgon.

Tack för svaren.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av Bola »

Har du nått schema över hur allt sitter ihop (vilken ingång på PIC som går till vilken ingång på drivaren)? Vad är det för drivare?
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av PopUnoNkoK »

Jani, nu är goda råd dyra. :)
Det har gått så långt att jag börjar tro att motorn är "fel specad" trots att jag är heeeelt övertygad om att så inte är fallet.
När man inte lyckas lösa problemet måste man juh hitta på en anledning till att problemet inte beror på mig. :)

Här är ett schema över hur det är kopplat.
IC1 = 16F690
IC2 = ULN2003
screen-capture-4.png
Där ser man att det är samma ordning på pinnarna som i skärmdumpen från logikanalysern i inlägget här ovan. I den schematiska bilden här ovan är både PICen och ULN2003an identisk med sin fysiska kapsel. Alltså om man tittar på ordningen på pinnarna.

Har nu gjort ett ganska långt felsökningspass i koden och den snurrar 2 varv vid 4096 pulser.

tack för alla svar.

PS. Jag lägger upp hela koden, den har blivit ganska rörig på slutet (I och med många försök att kasta om saker i jakt på problemet) och inte så bra kommenterad men i alla fall. Jag förväntar mig inte att någon ska traggla igenom den. Det är mest i "referenssyfte" eller nåt.

Kod: Markera allt

;**********************************************************************
;   This file is a basic code template for object module code         *
;   generation on the PIC16F690. This file contains the               *
;   basic code building blocks to build upon.                         *
;                                                                     *
;   Refer to the MPASM User's Guide for additional information on     *
;   features of the assembler and linker (Document DS33014).          *
;                                                                     *
;   Refer to the respective PIC data sheet for additional             *
;   information on the instruction set.                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Filename:      xxx.asm                                           *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:                                                          *
;    Company:                                                         *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required: P16F690.INC                                      *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes: Det gåt 3600 sekunder på en timma.                                                         *
;           Det är ca 2048? steg på ett vart                                                          *
;           Detta innebär att 1 steg ska motorn vridas var 1,7578125 sekund                                                          *
;                                                                     *
;                                                                     *
;**********************************************************************

    list      p=16F690           ; list directive to define processor
    #include <p16F690.inc>        ; processor specific variable definitions

    errorlevel  -302              ; suppress message 302 from list file

    __CONFIG   _CP_OFF & _CPD_OFF & _BOR_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _LP_OSC & _FCMEN_OFF & _IESO_OFF 

;_INTRC_OSC_NOCLKOUT

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.

;***** VARIABLE DEFINITIONS (examples)

;4096 steps för ett helvarv.
;Konstanta variabler
TMRO_EXTRA_COUNT	EQU		.255	;229

TMRO_interrupt_value	EQU		.200	;40    Högre tal ger snabbare rotation

TMRO_EXTRA_SLOW		EQU		.1	;16         blir en sekund med 32.768kHz
TMRO_EXTRA_FAST		EQU		.1

MISC_C_1_VALUE		EQU		.128			;128
MISC_C_2_VALUE		EQU		.32				;32

sec_16_extra_value	EQU		.255



; example of using Shared Uninitialized Data Section
INT_VAR     	UDATA_SHR     
w_temp      	RES     1       ; variable used for context saving 
status_temp 	RES     1       ; variable used for context saving
pclath_temp 	RES     1       ; variable used for context saving

TMRO_EXTRA		RES		1		;TMROs extraräknare
STEP_COUNTER 	RES		1		;Håller koll på vilket "steg" som ska användas

MISC_COUNTER_1	RES		1
MISC_COUNTER_2	RES		1

sec_16_extra	RES		1

;**********************************************************************
RESET_VECTOR    CODE    0x0000       ; processor reset vector
        goto    SETUP                ; go to beginning of program

INT_VECTOR      CODE    0x0004       ; interrupt vector location

INTERRUPT

        movwf   w_temp            ; save off current W register contents
        movf    STATUS,w          ; move status register into W register
        movwf   status_temp       ; save off contents of STATUS register
        movf    PCLATH,w          ; move pclath register into W register
        movwf   pclath_temp       ; save off contents of PCLATH register

; isr code can go here or be located as a call subroutine elsewhere
		BCF		INTCON, T0IF	;Rensa TMRO Interruptflaggan
		nop
		nop
		nop
		nop
		nop
		nop
		;MOVLW	TMRO_interrupt_value
		;MOVWF	TMR0


		BTFSS	PORTA, 2			;Kolla om knappen är intryckt
		GOTO	intryckt		


ej_intryckt
		BANKSEL	TMRO_EXTRA		;Hantera Extraräknaren
		DECFSZ	TMRO_EXTRA,1
		GOTO	ISR_SLUT		;Om den inte är noll än, skippa resten av ISRen.	
		MOVLW	TMRO_EXTRA_SLOW	;Annars, återställ extraräknaren och fortsätt
		MOVWF	TMRO_EXTRA
		GOTO	ISR_MAIN

intryckt
		BANKSEL	TMRO_EXTRA		;Hantera Extraräknaren
		DECFSZ	TMRO_EXTRA,1
		GOTO	ISR_SLUT		;Om den inte är noll än, skippa resten av ISRen.		
		MOVLW	TMRO_EXTRA_FAST	;Annars, återställ extraräknaren och fortsätt
		MOVWF	TMRO_EXTRA
		GOTO	ISR_MAIN



ISR_MAIN
		
;-----------------------------------------------------
;              Rulla och lägg ut bitar till stegmotorn
;-----------------------------------------------------
		BANKSEL	STEP_COUNTER
		MOVFW	STEP_COUNTER		;Kolla vilken "steg" vi är på
		BANKSEL	PCL
		CALL	rulla_bitar			;Hämta rätt bitar från LookUpTable
		BANKSEL	PORTC
		MOVWF	PORTC				;Lägg ut till världen
;-----------------------------------------------------
;             
;-----------------------------------------------------
		BANKSEL	MISC_COUNTER_1

		DECFSZ	MISC_COUNTER_1		
		GOTO	ISR_SLUT_1

		MOVLW	MISC_C_1_VALUE		;Återställ ettan
		MOVWF	MISC_COUNTER_1


		BANKSEL	MISC_COUNTER_2

		DECFSZ	MISC_COUNTER_2
		GOTO	ISR_SLUT_1

		MOVLW	MISC_C_2_VALUE		;Återställ tvåan
		MOVWF	MISC_COUNTER_2

		BANKSEL	INTCON
		MOVLW	b'00000000'			;Slå av Global interrupt OCH TMRO Interuppt, så att den stannar efter ett(!?) varv.
		MOVWF	INTCON
		NOP
		NOP
;----------------------------------------------------------------------------
ISR_SLUT_1
		BANKSEL	STEP_COUNTER
		INCF	STEP_COUNTER, F		;Öka så vi är redo för nästa "steg"
	
		NOP

		MOVLW	.4					;Kolla om vi är vid det sista "steget"
		BSF		STATUS,C
		SUBWF	STEP_COUNTER, 0		;Ta bort antalet steg från Step_Counter
		BTFSS	STATUS,C			;Blev det noll, alltså sista steget.
		GOTO	ISR_SLUT			;Nej, fortsätt som vanligt
		CLRF	STEP_COUNTER		;Ja, Rensa Step_Counter så att vi börjar om från början
;------------------- Denna del bara för att testa ett varv.



ISR_SLUT


        movf    pclath_temp,w     ; retrieve copy of PCLATH register
        movwf   PCLATH            ; restore pre-isr PCLATH register contents
        movf    status_temp,w     ; retrieve copy of STATUS register
        movwf   STATUS            ; restore pre-isr STATUS register contents
        swapf   w_temp,f
        swapf   w_temp,w          ; restore pre-isr W register contents
        retfie                    ; return from interrupt

;------------------------------------------------------------------------




MAIN_PROG       CODE
SETUP

		BANKSEL	INTCON
		MOVLW	b'10100000'		;Slå på Global interrupt OCH TMRO Interuppt.
		MOVWF	INTCON

		BANKSEL	OPTION_REG
		MOVLW	b'00000000'		;Här sätter vi prescaler på de sista 3 bitarna
		MOVWF	OPTION_REG

		BANKSEL	TRISC
		MOVLW	b'00000000'			
		MOVWF	TRISC			;Sätter alla I/O till utgångar, Utom MCLR
		BANKSEL	ANSEL
		CLRF	ANSEL
		BANKSEL	ANSELH
		CLRF	ANSELH

		BANKSEL	TRISA
		MOVLW	b'00000100'			
		MOVWF	TRISA

		BANKSEL	TMRO_EXTRA		;rensa extraräknaren
		MOVLW	TMRO_EXTRA_SLOW
		MOVWF	TMRO_EXTRA

		BANKSEL	STEP_COUNTER
		CLRF	STEP_COUNTER





		BANKSEL	sec_16_extra
		MOVLW	sec_16_extra_value
		MOVWF	sec_16_extra


		BANKSEL	PORTC
		MOVLW	b'10000000'
		MOVWF	PORTC						;Sätter första pinnen hög

		BANKSEL	MISC_COUNTER_1
		MOVLW	MISC_C_1_VALUE
		MOVWF	MISC_COUNTER_1

		BANKSEL	MISC_COUNTER_2
		MOVLW	MISC_C_2_VALUE
		MOVWF	MISC_COUNTER_2
		


MAIN_LOOP
		NOP
		GOTO	MAIN_LOOP					; loop forever

;---------------------------------------------------------------------------------

rulla_bitar		ADDWF PCL,F					; Hoppa till rätt "Steg" med värdet i w.
				;RETLW b'10000000'			; Halvsteg      
				;RETLW b'11000000' 
				;RETLW b'01000000' 
				;RETLW b'01001000' 
				;RETLW b'00001000'                
				;RETLW b'00011000' 
				;RETLW b'00010000' 
				;RETLW b'10010000'     

				RETLW b'10000000'			; Helsteg      
				RETLW b'01000000'			; 
				RETLW b'00001000'			;
				RETLW b'00010000' 			; 
			 
 

;---------------------------------------------------------------------------------



; initialize eeprom locations

EE      CODE    0x2100
        DE  0x00, 0x01, 0x02, 0x03

        END                       ; directive 'end of program'
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
JohnGalt
Inlägg: 1214
Blev medlem: 17 maj 2010, 21:16:39
Ort: Helsingborg (omnejd)

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av JohnGalt »

Nu har jag bara kollat som hastigast, så jag kan ha helt fel :-)
Men jag tycker din sekvens ser helt fel ut, du aktiverar ju bara en lindning åt gången.
Det borde vara något i stil med:
RC7=1 RC6=0 RC3=1 RC4=0
RC7=1 RC6=0 RC3=0 RC4=1
RC7=0 RC6=1 RC3=0 RC4=1
RC7=0 RC6=1 RC3=1 RC4=0
ungefär så, lite bråttom så lite dåligt förklarat.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av PopUnoNkoK »

Hhmmm...
Jag tror inte det.

Bild
Så ser lindningen ut.

Som jag förstått det så styr man motorn genom att upprepa en fyrastegssekvens. Tex här ser man ett exempel med halvsteg i den stil jag gjort när jag körde halvsteg.

http://arduino.cc/forum/index.php?topic=85335.0;wap2

Sen känns det konstigt att om det var felet att motorn skulle snurra bra och gå exakt ett varv extra.

Men jag säger inte att du har fel, jag vet på tok för lite för det. Ska "läsa runt" lite. Jag antar att det du beskriver kanske gäller en motor med annan lindning.

mvh Peter
Användarvisningsbild
JohnGalt
Inlägg: 1214
Blev medlem: 17 maj 2010, 21:16:39
Ort: Helsingborg (omnejd)

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av JohnGalt »

Korrigerat för pinout på motorn:

RC7=1 RC3=0 RC4=1 RC6=0
RC7=1 RC3=0 RC4=0 RC6=1
RC7=0 RC3=1 RC4=0 RC6=1
RC7=0 RC3=1 RC4=1 RC6=0
Bild
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av PopUnoNkoK »

JohanGalt: Nu har jag ändrat så att min LookUp table ser ut som du visade. Motorn fungerar bra med den "innställningen" men det löste tyvärr inte grundproblemet som jag skriver om i trådstarten.
När jag kör 4096 steg så snurrar motorn 2 varv i alla fall.
Känns som ett skumt problem, jag börjar dessutom bli lite lur om att det inte är exakt 2 varv utan 2 varv och 1 eller ett par steg extra.

Alla tips mottages tacksamt.

MVH Peter
Användarvisningsbild
säter
Inlägg: 35284
Blev medlem: 22 februari 2009, 21:16:35
Ort: Säter

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor

Inlägg av säter »

När jag kör 4096 steg så snurrar motorn 2 varv i alla fall.
Det måste väl vara reduktionsväxeln som snurrar 2 varv?
Har du verifierat att utväxlingen är 1:64?
Skriv svar