Shop OBEX P1 Docs P2 Docs Learn Events
A little Stepping motor Help — Parallax Forums

A little Stepping motor Help

Zap-oZap-o Posts: 452
edited 2010-05-23 01:01 in Propeller 1
A little Stepping motor Help is needed.

I am running the code below and it works great. it basically runs 2 times in the repeat loop (Full Step). The idea is that I will store the byte array "StepArray" in eeprom for dynamic reasons. Now instead of running 2 times I want to run it once so that I can half step. My problem is that I cant get a bit pattern "StepArray" that works for 1/2 stepping.
Any ideas ?
CON
                                                     
  _clkmode = xtal1 + pll16x                            
  _xinfreq = 5_000_000  


  StepMotor1            = 9   'A-
  StepMotor2            = 10  'B-
  StepMotor3            = 11  'B+
  StepMotor4            = 12  'A+
                               
VAR

  Byte  StepArray [noparse][[/noparse] 8 ]
        
Pub Start

  Dira [noparse][[/noparse] StepMotor1..StepMotor4 ]~~
     
  StepArray [noparse][[/noparse] 0 ] := %1010 '
  StepArray [noparse][[/noparse] 1 ] := %0110
  StepArray [noparse][[/noparse] 2 ] := %1001
  StepArray [noparse][[/noparse] 3 ] := %0101

  StepArray [noparse][[/noparse] 4 ] := %1010 ' same as above in full step mode
  StepArray [noparse][[/noparse] 5 ] := %0110 ' same as above in full step mode
  StepArray [noparse][[/noparse] 6 ] := %1001 ' same as above in full step mode
  StepArray [noparse][[/noparse] 7 ] := %0101 ' same as above in full step mode
  
  Running(200)
  
Pub Running(Speed) 
  
  Repeat     
           
        outa [noparse][[/noparse] StepMotor1..StepMotor4 ] := StepArray [noparse][[/noparse] 0 ]                
        pauseMs(Speed)
        
        outa [noparse][[/noparse] StepMotor1..StepMotor4 ] := StepArray [noparse][[/noparse] 1 ]                
        pauseMs(Speed)
        
        outa [noparse][[/noparse] StepMotor1..StepMotor4 ] := StepArray [noparse][[/noparse] 2 ]                
        pauseMs(Speed)
            
        outa [noparse][[/noparse] StepMotor1..StepMotor4 ] := StepArray [noparse][[/noparse] 3 ]                
        pauseMs(Speed)

        outa [noparse][[/noparse] StepMotor1..StepMotor4 ] := StepArray [noparse][[/noparse] 4 ]                
        pauseMs(Speed)
        
        outa [noparse][[/noparse] StepMotor1..StepMotor4 ] := StepArray [noparse][[/noparse] 5 ]                
        pauseMs(Speed)
        
        outa [noparse][[/noparse] StepMotor1..StepMotor4 ] := StepArray [noparse][[/noparse] 6 ]                
        pauseMs(Speed)
            
        outa [noparse][[/noparse] StepMotor1..StepMotor4 ] := StepArray [noparse][[/noparse] 7 ]                
        pauseMs(Speed)
        
                            
Pub pauseMs(Delay)
         
  waitcnt((clkfreq / 10_000) * Delay + cnt)

Comments

  • JonnyMacJonnyMac Posts: 9,208
    edited 2010-05-21 18:31
    I've always used two arrays for stepping: one for full steps, the other for half steps. What you might want to do is create routines like this:

    PUB FullStepFwd
    
      outa[noparse][[/noparse]COIL4..COIL1] := FullSteps[noparse][[/noparse]++stpIdx // 4]
    
      
    PUB FullStepRev
    
      outa[noparse][[/noparse]COIL4..COIL1] := FullSteps[noparse][[/noparse](stpIdx += 3) // 4]
    
    
    PUB HalfStepFwd
    
      outa[noparse][[/noparse]COIL4..COIL1] := HalfSteps[noparse][[/noparse]++stpIdx // 8]
    
      
    PUB HalfStepRev
    
      outa[noparse][[/noparse]COIL4..COIL1] := HalfSteps[noparse][[/noparse](stpIdx += 7) // 8]
    
    
    DAT
    
    FullSteps               byte    %0011, %0110, %1100, %1001
    
    HalfSteps               byte    %0001, %0011, %0010, %0110
                            byte    %0100, %1100, %1000, %1001
    


    You can easily move a block of 12 bytes from the EEPROM into the table (@FullSteps) to change the table for a given motor.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Jon McPhalen
    Hollywood, CA
  • Zap-oZap-o Posts: 452
    edited 2010-05-21 18:42
    JohnnyMac

    Problem is that using data in the DAT section makes my code not update-able. I like to store most variables in the 12c EEprom. This allows my firmware to be updated sort of like Microsoft will do with windows.

    What I am after is a pattern of %1s and %0s to half step that is derived from the code above that I posted. I have the full step working with said code its trying to do half stepping.


    ---

    Another way of asking...

    If I can full step using this
    Dat 
        SepArray Byte %1010, %0110, %1001 , %0101
    
    



    How can I half step?

    Post Edited (Zap-o) : 5/21/2010 6:47:37 PM GMT
  • JonnyMacJonnyMac Posts: 9,208
    edited 2010-05-21 20:16
    Not so, Zap-o. As I indicated, at start-up your program would read the step data out of the EEPROM and then write it into the DAT tables. Now, as you're running, you're using RAM which is fast instead of the EEPROM (slow....). I'm all about updating -- I'm working on a product for EFX-TEK that lets our customers install a firmware upgrade by dropping a file onto the SD card. At the beginning of the program I look for that file; if it's there I copy it to the EEPROM, erase it (to prevent a loop), and then reboot the Propeller with the new code. In your case the process easier: just reading 12 bytes, and if you align them on a page boundary you can do it very easily with a page read.

    Perhaps you don't understand the full-step/half-step thing. Full steps engage two coils, half steps engage just one. I've never seen any stepper code that used the full-step table for half steps. Even if you could come up with an algorithmic solution, chances are that it would be far less elegant (and maintainable) than a two-table solution.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Jon McPhalen
    Hollywood, CA
  • Zap-oZap-o Posts: 452
    edited 2010-05-22 00:14
    JonnyMac

    Yea I am a bit lost on the half step concept. Mainly because a stepper motor can be wired up several ways hence my desire to keep my program flexible at run time. I have a solution that allows me to update my code while the propeller is running and store this update permanently in EEprom. This allows the customer or me to tweak all settings versus me sending them a firmware upgrade - sort of like plug and play. The example code I posted above is just an example for simplicity. True its not elegant [noparse]:)[/noparse]

    I appreciate the explanation of full step vs. half step. I think I am understanding the concept clearer.
  • JonnyMacJonnyMac Posts: 9,208
    edited 2010-05-22 01:03
    Another thing to keep in mind is that DAT tables work just like arrays -- you can update them on the fly and then save them back out to an EEPROM. For me, I like to use them because a DAT table is an array that you can pre-initialize in code.

    I'm not sure what you mean "wired up several ways" -- for correct motion you need to wire the coils in the correct order. I seems like you're trying to add flexibility to your code so you can allow the coils to be wired willy-nilly; do you really want to do that?

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Jon McPhalen
    Hollywood, CA
  • RaymanRayman Posts: 14,887
    edited 2010-05-22 01:06
    Here's my unipolar stepper test code:

    http://www.rayslogic.com/propeller/Programming/Stepper/Stepper1.zip

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    My Prop Info&Apps: ·http://www.rayslogic.com/propeller/propeller.htm

    My Prop Products:· http://www.rayslogic.com/Propeller/Products/Products.htm
  • Zap-oZap-o Posts: 452
    edited 2010-05-22 02:39
    JonnyMac,
    Yea I don't want to "willy nilly" the coils but you never know what a customer is going to do and once the motor is installed its a night mare to un-hook everything. I work with grad students and as smart as some are I am always amazed at how the small things hang them up.

    Rayman,
    Ill look over the code example

    Gents - thanks for the help
  • JonnyMacJonnyMac Posts: 9,208
    edited 2010-05-22 02:55
    You are a brave soul. If you get it working, do post -- I'd like to see what you come up with.

    For further reference I wrote about controlling steppers in my column a few years ago:
    -- www.parallax.com/Portals/0/Downloads/docs/cols/nv/vol7/col/NV136.pdf

    This shows how to write a Spin method that you can launch into its own cog, letting it run "in the background" while your main program does other things.

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Jon McPhalen
    Hollywood, CA
  • StefanL38StefanL38 Posts: 2,292
    edited 2010-05-22 16:01
    as you want to keep it very flexible. How about ONE array that contains both. I'm not too familiar with the details of fullstep/halfstep if my assuming that
    halfstep switches on one coil A then two coil A and coil B then switches off coil A etc. you would store this pattern in an array
    and for fullstepmode you would not use
    index 1 coil A on B off
    index 2 coil A and B on
    index 3 coil A off B on

    but
    index 1 coil A on B off jump over index 2 right to
    index 3 coil A off B on

    anyway
    you said something you don't want to use the DAT-section

    Whenever you store a program to the EEPROM EVERYTHING of your code gets stored in the EEPROM including all DAT-sections
    now if you are worried about the adresses you could store your values at the upperend of the RAM/EEPROM

    the "ultrahyper-felxible" solution that allows your customers to wire whatever they want has its price by having more hardware with autodetecting everything wiring uni/bipolar number of coils etc. etc.
    set a limit to the flexibility and describe it very well in the manual. If you write an EASY to understand manual your customers will be very happy and follow and obey your restrictions described in the manual.
    (most manuals are written very fast and are more a repetitorium to the author than a manual you can learn from)

    How about a hardware that allows halfstepping and can be switched by software to fullstepping?

    best regards

    Stefan
  • JonnyMacJonnyMac Posts: 9,208
    edited 2010-05-23 01:01
    The "ultra-flexible" method requires some sort of UI to allow for coil configuration -- that's the tricky bit, I think, and will "cost" are more than simply having the coils wired in the correct order to start with.

    Even if wired incorrectly, you can get there without know the details of the motor; the process is explained here:
    -- digital.ni.com/public.nsf/allkb/0AEE7B9AD4B3E04186256ACE005D833B

    And my memory tells me to do this if the motor doesn't move or just vibrates/buzzes:

    A) Swap outer leads -- if that doesn't work, then...
    B) Swap inner leads -- if motor runs backward then...
    C) Flip all

    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
    Jon McPhalen
    Hollywood, CA
Sign In or Register to comment.