please dont rip this site

Linistepper Equatorial Drive Source

/******************************************************************************
  Lini_Telescope.c   v1.0    10th Dec 2011 - Roman Black
  written in MikroC, open-source (but please credit me as the author)
  Code size is small, this should compile ok in the free version of MikroC.

  This code drives the LiniStepper open-source stepper motor controller
  at either of 2 fixed speeds. The speeds can be adjusted to a very high
  resolution (suitable for telescope or other precision movement).

  The stepper motor always drives in microsteps (usteps), 6 usteps to a
  full step, which gives 1200 usteps per motor rotation.

  PIC 16F628A, using 3 control input pins;
  PORTA.F0 = INPUT_RUN run; (0v=run, 5v=stop)
  PORTA.F1 = INPUT_DIR motor direction; (0v=forward, 5v=reverse)
  PORTA.F2 = INPUT_SPEED selects speed 1 or speed 2; (0v=speed1, 5v=speed2)
  (note! the 2 dipswitches on the LiniStepper are not used).

// NOTE! Set TABS to 2 for best viewing
******************************************************************************/
/*
PIC16F628A;
_BODEN_OFF   // these configs are set in MikroC compiler options.
_PWRTE_ON
_WDT_OFF
_LVP_OFF
_MCLRE_ON
_HS_OSC
*/

// PIC pin defines for the user control pins
#define INPUT_RUN    PORTA.F0
#define INPUT_DIR    PORTA.F1
#define INPUT_SPEED  PORTA.F2

// set these values to the periods you want, to set the 2 possible motor speeds
// these set the period for a ustep. period is in nanoseconds,
// so a period of 15 million = 15mS = 15 milliSeconds
// 15mS times 1200 usteps (1 motor rev) is 1200*0.015 or 18 seconds per motor rev.
// (the largest value you can use here is about 1 billion, as signed long vars are used)
#define SPEED1   15000000     // approx 18 secs/rev
#define SPEED2     833000     // approx 1 sec/rev

// set the value of the XTAL you are using with the PIC
// value is in Hz, so a 16MHz XTAL = 16 million
#define XTAL_HZ  8000000      // tested with 8MHz xtal

// DO NOT CHANGE this define below! it calculates the nanoseconds of 1 interrupt
#define PERIOD_INT (1024000000 / (XTAL_HZ/4000))


// variables
unsigned char ustep;      // used for motor microstep sequencing
signed long bres;         // used for ustep period generation
signed long speed;        // "

// table of stepper currents; CCCCxxxx and phasing; xxxxPPPP, all on PORTB
const unsigned char table[24] = {
                  // CURRENT              PHASING
  0b11001010,     // 1100xxxx (100:0)     A+ B+  xxxx1010
  0b11011010,     // 1101xxxx (100:25)
  0b11101010,     // 1110xxxx (100:55)
  0b11111010,     // 1111xxxx (100:100)
  0b10111010,     // 1011xxxx (55:100)
  0b01111010,     // 0111xxxx (25:100)

  0b00110110,     // 0011xxxx (0:100)     A- B+  xxxx0110
  0b01110110,     // 0111xxxx (25:100)
  0b10110110,     // 1011xxxx (55:100)
  0b11110110,     // 1111xxxx (100:100)
  0b11100110,     // 1110xxxx (100:55)
  0b11010110,     // 1101xxxx (100:25)

  0b11000101,     //                      A- B-  xxxx0101
  0b11010101,     //
  0b11100101,     // 
  0b11110101,     //
  0b10110101,     //
  0b01110101,     //

  0b00111001,     //                      A+ B-  xxxx1001
  0b01111001,     //
  0b10111001,     // 
  0b11111001,     //
  0b11101001,     //
  0b11011001      //
};


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//  INTERRUPT
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void interrupt(void)
{
  //---------------------------------------------
  // this is the TMR0 overflow interrupt, TMR0 is prescaled at
  // 4:1 so int occurs every 1024 instructions.
  // this int is a bresenham system that generates a very precise AVERAGE
  // time period for every ustep (which gives a precise motor speed).
  //---------------------------------------------
  // if motor running is selected, add one more interrupt time period (in nS)
  // to bresenham accumulator
  if(INPUT_RUN == 0) bres += PERIOD_INT;

  // set the motor ustep period, depending on speed control input pin
  if(INPUT_SPEED == 0) speed = SPEED1;
  else                 speed = SPEED2;

  // test for bresenham overflow, and if so, move one ustep
  if(bres >= speed)
  {
    bres -= speed;              // remove one ustep from bres accumulator
    if(INPUT_DIR == 0)
    {
      ustep++;                  // move forward a ustep
      if(ustep >= 24) ustep = 0;
    }
    else
    {
      ustep--;                  // else move backward a ustep
      if(ustep >= 24) ustep = 23;
    }
    PORTB = table[ustep];       // set motor currents to the new ustep
  }
  //---------------------------------------------
  INTCON.T0IF = 0;              // must clear TMR0 overflow flag before exit
}
//-----------------------------------------------------------------------------



//=============================================================================
//  MAIN
//=============================================================================
void main()
{
  //---------------------------------------------
  // setup the PIC port registers etc
  CMCON = 0x07;      // set all pins to digital, comparators off

  PORTA =  0b00000000;    // start values for pins
  TRISA  = 0b00011111;    // all PORTA pins are inputs

  PORTB =  0b00000000;    // start values for pins
  TRISB  = 0b00000000;     // all PORTB pins are outputs

  //-------------------------------------------------
  // PIC TIMER setups;
  // TMR0 is used for generating the ustep period
  OPTION_REG = 0b10000001;  // TMR0 ON, at 4:1, PORTB pullups OFF

  //-------------------------------------------------
  // setup variables etc
  delay_ms(200);            // a small delay to allow voltages to stabilise

  ustep = 0;                // start with motor on ustep 0 (of 0-23)
  PORTB = table[ustep];

  INTCON.T0IE = 1;          // turn the TMR0 interrupt on
  INTCON.GIE = 1;           // and enable interrupts

  //-------------------------------------------------
  // as everything is done in the interrupt, the main loop
  // does nothing!
  //-------------------------------------------------
  // main run loop here
  while(1)
  {
    // do nothing and allow interrupt to do its job
  }
  //-------------------------------------------------
}
//-----------------------------------------------------------------------------








file: /Techref/io/stepper/linistep/equatorial_c.htm, 6KB, , updated: 2012/1/20 16:32, local time: 2024/11/15 22:49,
TOP NEW HELP FIND: 
18.223.196.123:LOG IN

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://linistepper.com/techref/io/stepper/linistep/equatorial_c.htm"> Lini_Telescope.c</A>

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.


Link? Put it here: 
if you want a response, please enter your email address: 
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
Did you find what you needed?