Bi Polar step motor / Linux CNC

Discussion in 'The Projects Forum' started by nerdegutta, Oct 21, 2012.

  1. nerdegutta

    Thread Starter Moderator

    Dec 15, 2009
    2,517
    785
    Hi.

    I've been designing a bi polar step motor controller, based on the PIC 16F628 and the L293DNE IC. The plan is to control it with Linux CNC.

    http://www.linuxcnc.org/


    The output from Linux CNC's LPT is step and direction. One puls for each step. Direction is held LOW/HIGH.

    I've made it on a breadboard, and need some feedback/thoughts/comments, before I start etching.

    The program run through the steps according to the input. No "softstart" or PWM.

    Code ( (Unknown Language)):
    1.  
    2. // Program      : main_v3.c
    3. // Description  : Program to control bi polar step motor
    4. // Compiler     : Hi Tech C
    5. // IDE          : MPLAB v8.83
    6. // Date         : June 2012
    7. // Author       : nerdegutta
    8. // WEB          : www.nerdegutta.org
    9.  
    10.  
    11. #include <htc.h>
    12.  
    13. #define _XTAL_FREQ 4000000
    14.  
    15. #define step1 5
    16. #define step2 4
    17. #define step3 6
    18. #define step4 2
    19. #define step5 10
    20. #define step6 8
    21. #define step7 9
    22. #define step8 1
    23.  
    24. #define step RA0
    25. #define dir RA1
    26.  
    27. #define stepDelay 7000
    28.  
    29. unsigned char stepPosition;
    30.  
    31. __CONFIG (FOSC_HS &
    32. WDTE_ON &
    33. PWRTE_ON &
    34. MCLRE_OFF &
    35. BOREN_OFF &
    36. LVP_OFF &
    37. CPD_OFF &
    38. CP_OFF);
    39.  
    40.  
    41. void main()
    42. {
    43. CMCON = 0x07;
    44.  
    45. TRISA = 0b00000011;
    46. TRISB = 0b00000000;
    47.  
    48. PORTA = 0b00000000;
    49. PORTB = 0b00000000;
    50.  
    51. stepPosition = 0;
    52.  
    53. while (1)
    54. {
    55. if (!dir)       // check if dir pin is high,
    56. {               // if it's high, go counterclockwise
    57.  
    58. if (step)
    59. {
    60.     stepPosition++;
    61.     if (stepPosition > 8)
    62.         {
    63.         stepPosition = 1;
    64.         }
    65.     if (stepPosition == 1)
    66.         {
    67.         PORTB = step1;
    68.         __delay_us(stepDelay);
    69.         PORTB = 0;
    70.         }
    71.     if (stepPosition == 2)
    72.         {
    73.         PORTB = step2;
    74.         __delay_us(stepDelay);
    75.         PORTB = 0;
    76.         }
    77.     if (stepPosition == 3)
    78.         {
    79.         PORTB = step3;
    80.         __delay_us(stepDelay);
    81.         PORTB = 0;
    82.         }
    83.     if (stepPosition == 4)
    84.         {
    85.         PORTB = step4;
    86.         __delay_us(stepDelay);
    87.         PORTB = 0;
    88.         }
    89.  
    90.     if (stepPosition == 5)
    91.         {
    92.         PORTB = step5;
    93.         __delay_us(stepDelay);
    94.         PORTB = 0;
    95.         }
    96.     if (stepPosition == 6)
    97.         {
    98.         PORTB = step6;
    99.         __delay_us(stepDelay);
    100.         PORTB = 0;
    101.         }
    102.     if (stepPosition == 7)
    103.         {
    104.         PORTB = step7;
    105.         __delay_us(stepDelay);
    106.         PORTB = 0;
    107.         }
    108.     if (stepPosition == 8)
    109.         {
    110.         PORTB = step8;
    111.         __delay_us(stepDelay);
    112.         PORTB = 0;
    113.         }
    114.  
    115. } // end if step
    116. } // end if dir
    117.  
    118. if (dir)        // check if dir pin is high
    119. {               // if not high, go clockwise
    120. if (step)
    121. {
    122.     stepPosition--;
    123.     if (stepPosition < 1)
    124.         {
    125.         stepPosition = 8;
    126.         }
    127.  
    128.     if (stepPosition == 8)
    129.         {
    130.         PORTB = step8;
    131.         __delay_us(stepDelay);
    132.         PORTB = 0;
    133.         }
    134.     if (stepPosition == 7)
    135.         {
    136.         PORTB = step7;
    137.         __delay_us(stepDelay);
    138.         PORTB = 0;
    139.         }
    140.     if (stepPosition == 6)
    141.         {
    142.         PORTB = step6;
    143.         __delay_us(stepDelay);
    144.         PORTB = 0;
    145.         }
    146.     if (stepPosition == 5)
    147.         {
    148.         PORTB = step5;
    149.         __delay_us(stepDelay);
    150.         PORTB = 0;
    151.         }
    152.  
    153.  
    154.     if (stepPosition == 4)
    155.         {
    156.         PORTB = step4;
    157.         __delay_us(stepDelay);
    158.         PORTB = 0;
    159.         }
    160.     if (stepPosition == 3)
    161.         {
    162.         PORTB = step3;
    163.         __delay_us(stepDelay);
    164.         PORTB = 0;
    165.         }
    166.     if (stepPosition == 2)
    167.         {
    168.         PORTB = step2;
    169.         __delay_us(stepDelay);
    170.         PORTB = 0;
    171.         }
    172.     if (stepPosition == 1)
    173.         {
    174.         PORTB = step1;
    175.         __delay_us(stepDelay);
    176.         PORTB = 0;
    177.         }
    178.  
    179.  
    180. } // end if step
    181. } // end if !dir
    182.    
    183. } // end while
    184. } // end main
    185.  
    186.  
    187.  
     
Loading...