Sida 1 av 2
Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 29 april 2012, 23:44:46
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
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 30 april 2012, 07:13:22
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.
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 30 april 2012, 08:16:35
av Walle
Har du verifierat att du verkligen driver den i halvsteg och inte helsteg?
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 30 april 2012, 08:54:57
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
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 30 april 2012, 10:53:57
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
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 30 april 2012, 18:23:37
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
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 30 april 2012, 18:28:21
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

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 30 april 2012, 23:22:26
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.
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 1 maj 2012, 09:53:27
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?
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 1 maj 2012, 13:19:26
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'
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 3 maj 2012, 17:22:01
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.
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 3 maj 2012, 20:26:47
av PopUnoNkoK
Hhmmm...
Jag tror inte det.

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
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 3 maj 2012, 23:50:30
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

Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 5 maj 2012, 20:47:03
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
Re: Räkna ut antal steg för 1 helt varv på växlad stegmotor
Postat: 5 maj 2012, 20:56:34
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?