Stepper motor driver for FRDM-33879A-EVB (MC33879A). See application note AN5221 at www.nxp.com for more information.
Dependencies: mbed
Fork of FRDM-33879A-EVB_Stepper_Motor_Control by
The sample code provided is described in NXP's application note AN5221 found at http://www.nxp.com/products/power-management/engine-and-dc-motor-control/h-bridges/evaluation-kit-33879configurable-octal-serial-switch:FRDM-33879A-EVB. It drives a stepper motor using a configurable switch.
STEPPER MOTOR DRIVER
-> 5 seconds CW, 5 seconds CCW
-> 250ms steps
-> green LED indicates forward direction
-> red LED indicates backward direction
main.cpp@0:ffe2ac8461c1, 2015-12-14 (annotated)
- Committer:
- mareikeFSL
- Date:
- Mon Dec 14 16:58:53 2015 +0000
- Revision:
- 0:ffe2ac8461c1
Initial upload
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mareikeFSL | 0:ffe2ac8461c1 | 1 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 2 | /* Stepper motor driver for FRDM-33879A-EVB (MC33879A) */ |
mareikeFSL | 0:ffe2ac8461c1 | 3 | /* See application note AN5221 at www.nxp.com for more information */ |
mareikeFSL | 0:ffe2ac8461c1 | 4 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 5 | |
mareikeFSL | 0:ffe2ac8461c1 | 6 | /*--COMPANY-----AUTHOR------DATE------------REVISION----NOTES-------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 7 | /* NXP mareikeFSL 2015.12.14 rev 1.0 initial */ |
mareikeFSL | 0:ffe2ac8461c1 | 8 | /* */ |
mareikeFSL | 0:ffe2ac8461c1 | 9 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 10 | /* STEPPER MOTOR DRIVER */ |
mareikeFSL | 0:ffe2ac8461c1 | 11 | /* -> 5 seconds CW, 5 seconds CCW */ |
mareikeFSL | 0:ffe2ac8461c1 | 12 | /* -> 250ms steps */ |
mareikeFSL | 0:ffe2ac8461c1 | 13 | /* -> green LED indicates forward direction */ |
mareikeFSL | 0:ffe2ac8461c1 | 14 | /* -> red LED indicates backward direction */ |
mareikeFSL | 0:ffe2ac8461c1 | 15 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 16 | |
mareikeFSL | 0:ffe2ac8461c1 | 17 | /*--SPI-------------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 18 | /* CLK (CLK) = PTD1 (J2/12) */ |
mareikeFSL | 0:ffe2ac8461c1 | 19 | /* MOSI (MOSI) = PTD2 (J2/8) */ |
mareikeFSL | 0:ffe2ac8461c1 | 20 | /* MISO (MISO) = PTD3 (J2/10) */ |
mareikeFSL | 0:ffe2ac8461c1 | 21 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 22 | /*--GPIO------------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 23 | /* CS (CS) = PTD0 (J2/6) */ |
mareikeFSL | 0:ffe2ac8461c1 | 24 | /* IO12 (EN) = PTA1 (J1/2) */ |
mareikeFSL | 0:ffe2ac8461c1 | 25 | /* PWM0 (IN5) = PTA12 (J1/8) */ |
mareikeFSL | 0:ffe2ac8461c1 | 26 | /* PWM1 (IN6) = PTA5 (J1/12) */ |
mareikeFSL | 0:ffe2ac8461c1 | 27 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 28 | |
mareikeFSL | 0:ffe2ac8461c1 | 29 | |
mareikeFSL | 0:ffe2ac8461c1 | 30 | /*--INCLUDES--------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 31 | #include "mbed.h" |
mareikeFSL | 0:ffe2ac8461c1 | 32 | |
mareikeFSL | 0:ffe2ac8461c1 | 33 | |
mareikeFSL | 0:ffe2ac8461c1 | 34 | /*--DEFINES---------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 35 | |
mareikeFSL | 0:ffe2ac8461c1 | 36 | |
mareikeFSL | 0:ffe2ac8461c1 | 37 | /*--INITS-----------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 38 | SPI spi(PTD2, PTD3, PTD1); //mosi, miso, clk |
mareikeFSL | 0:ffe2ac8461c1 | 39 | DigitalOut cs(PTD0); //cs |
mareikeFSL | 0:ffe2ac8461c1 | 40 | |
mareikeFSL | 0:ffe2ac8461c1 | 41 | DigitalOut en(PTA1); //en |
mareikeFSL | 0:ffe2ac8461c1 | 42 | |
mareikeFSL | 0:ffe2ac8461c1 | 43 | DigitalOut in5(PTA12); //in5 |
mareikeFSL | 0:ffe2ac8461c1 | 44 | DigitalOut in6(PTA5); //in6 |
mareikeFSL | 0:ffe2ac8461c1 | 45 | |
mareikeFSL | 0:ffe2ac8461c1 | 46 | Ticker timer1; //direction timer |
mareikeFSL | 0:ffe2ac8461c1 | 47 | Ticker timer2; //step timer |
mareikeFSL | 0:ffe2ac8461c1 | 48 | |
mareikeFSL | 0:ffe2ac8461c1 | 49 | DigitalOut cw(LED_GREEN); //forward LED |
mareikeFSL | 0:ffe2ac8461c1 | 50 | DigitalOut ccw(LED_RED); //backward LED |
mareikeFSL | 0:ffe2ac8461c1 | 51 | |
mareikeFSL | 0:ffe2ac8461c1 | 52 | |
mareikeFSL | 0:ffe2ac8461c1 | 53 | /*--CONSTANTS-------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 54 | unsigned const ClockwiseA = 0x55; //turn on 1-7, 3-5 |
mareikeFSL | 0:ffe2ac8461c1 | 55 | unsigned const ClockwiseB = 0x69; //turn on 1-7, 4-6 |
mareikeFSL | 0:ffe2ac8461c1 | 56 | unsigned const ClockwiseC = 0xAA; //turn on 2-8, 4-6 |
mareikeFSL | 0:ffe2ac8461c1 | 57 | unsigned const ClockwiseD = 0x96; //turn on 2-8, 3-5 |
mareikeFSL | 0:ffe2ac8461c1 | 58 | |
mareikeFSL | 0:ffe2ac8461c1 | 59 | |
mareikeFSL | 0:ffe2ac8461c1 | 60 | /*--VARIABLES-------------------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 61 | unsigned short direction = 1; //direction of motor |
mareikeFSL | 0:ffe2ac8461c1 | 62 | unsigned short step = 0; //step of stepper motor |
mareikeFSL | 0:ffe2ac8461c1 | 63 | |
mareikeFSL | 0:ffe2ac8461c1 | 64 | |
mareikeFSL | 0:ffe2ac8461c1 | 65 | /*--FUNCTION DECLARATIONS-------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 66 | void init_spi(void); //initializes SPI |
mareikeFSL | 0:ffe2ac8461c1 | 67 | void send_spi(unsigned const word); //sends SPI commands |
mareikeFSL | 0:ffe2ac8461c1 | 68 | void reverse(void); //changes LED color |
mareikeFSL | 0:ffe2ac8461c1 | 69 | void turn_motor(void); //spins motor |
mareikeFSL | 0:ffe2ac8461c1 | 70 | int main(void); //main |
mareikeFSL | 0:ffe2ac8461c1 | 71 | |
mareikeFSL | 0:ffe2ac8461c1 | 72 | |
mareikeFSL | 0:ffe2ac8461c1 | 73 | /*--FUNCTION DEFINITIONS--------------------------------------------------------------*/ |
mareikeFSL | 0:ffe2ac8461c1 | 74 | |
mareikeFSL | 0:ffe2ac8461c1 | 75 | /***************************************************************************INIT_SPI***/ |
mareikeFSL | 0:ffe2ac8461c1 | 76 | void init_spi(void) |
mareikeFSL | 0:ffe2ac8461c1 | 77 | { |
mareikeFSL | 0:ffe2ac8461c1 | 78 | spi.format(8,1); //8-bit transfer, mode 1 (POL 0, PHA 1) |
mareikeFSL | 0:ffe2ac8461c1 | 79 | spi.frequency(4000000); //freq |
mareikeFSL | 0:ffe2ac8461c1 | 80 | |
mareikeFSL | 0:ffe2ac8461c1 | 81 | } //end init_spi() |
mareikeFSL | 0:ffe2ac8461c1 | 82 | |
mareikeFSL | 0:ffe2ac8461c1 | 83 | /***************************************************************************SEND_SPI***/ |
mareikeFSL | 0:ffe2ac8461c1 | 84 | void send_spi(unsigned const word) |
mareikeFSL | 0:ffe2ac8461c1 | 85 | { |
mareikeFSL | 0:ffe2ac8461c1 | 86 | cs = 0; //set cs low |
mareikeFSL | 0:ffe2ac8461c1 | 87 | spi.write(0x00); //send 0x00 |
mareikeFSL | 0:ffe2ac8461c1 | 88 | spi.write(word); //send 0xXX |
mareikeFSL | 0:ffe2ac8461c1 | 89 | cs = 1; //set cs high |
mareikeFSL | 0:ffe2ac8461c1 | 90 | |
mareikeFSL | 0:ffe2ac8461c1 | 91 | } //end send_spi() |
mareikeFSL | 0:ffe2ac8461c1 | 92 | |
mareikeFSL | 0:ffe2ac8461c1 | 93 | /****************************************************************************REVERSE***/ |
mareikeFSL | 0:ffe2ac8461c1 | 94 | void reverse(void) |
mareikeFSL | 0:ffe2ac8461c1 | 95 | { |
mareikeFSL | 0:ffe2ac8461c1 | 96 | direction = !direction; //switch direction |
mareikeFSL | 0:ffe2ac8461c1 | 97 | if(direction) |
mareikeFSL | 0:ffe2ac8461c1 | 98 | { |
mareikeFSL | 0:ffe2ac8461c1 | 99 | cw = 0; //turn on green LED |
mareikeFSL | 0:ffe2ac8461c1 | 100 | ccw = 1; //turn off red LED |
mareikeFSL | 0:ffe2ac8461c1 | 101 | } |
mareikeFSL | 0:ffe2ac8461c1 | 102 | else |
mareikeFSL | 0:ffe2ac8461c1 | 103 | { |
mareikeFSL | 0:ffe2ac8461c1 | 104 | cw = 1; //turn off green LED |
mareikeFSL | 0:ffe2ac8461c1 | 105 | ccw = 0; //turn on red LED |
mareikeFSL | 0:ffe2ac8461c1 | 106 | } |
mareikeFSL | 0:ffe2ac8461c1 | 107 | |
mareikeFSL | 0:ffe2ac8461c1 | 108 | } //end reverse() |
mareikeFSL | 0:ffe2ac8461c1 | 109 | |
mareikeFSL | 0:ffe2ac8461c1 | 110 | /*************************************************************************TURN_MOTOR***/ |
mareikeFSL | 0:ffe2ac8461c1 | 111 | void turn_motor(void) |
mareikeFSL | 0:ffe2ac8461c1 | 112 | { |
mareikeFSL | 0:ffe2ac8461c1 | 113 | switch(step%4) |
mareikeFSL | 0:ffe2ac8461c1 | 114 | { |
mareikeFSL | 0:ffe2ac8461c1 | 115 | case 0: |
mareikeFSL | 0:ffe2ac8461c1 | 116 | send_spi(ClockwiseA); //send 0x0055 |
mareikeFSL | 0:ffe2ac8461c1 | 117 | if(direction) |
mareikeFSL | 0:ffe2ac8461c1 | 118 | step++; //if forward, increase step |
mareikeFSL | 0:ffe2ac8461c1 | 119 | else |
mareikeFSL | 0:ffe2ac8461c1 | 120 | step--; //if backward, decrease step |
mareikeFSL | 0:ffe2ac8461c1 | 121 | break; |
mareikeFSL | 0:ffe2ac8461c1 | 122 | case 1: |
mareikeFSL | 0:ffe2ac8461c1 | 123 | send_spi(ClockwiseB); //send 0x0069 |
mareikeFSL | 0:ffe2ac8461c1 | 124 | if(direction) step++; //if forward, increase step |
mareikeFSL | 0:ffe2ac8461c1 | 125 | else step--; //if backward, decrease step |
mareikeFSL | 0:ffe2ac8461c1 | 126 | break; |
mareikeFSL | 0:ffe2ac8461c1 | 127 | case 2: |
mareikeFSL | 0:ffe2ac8461c1 | 128 | send_spi(ClockwiseC); //send 0x00AA |
mareikeFSL | 0:ffe2ac8461c1 | 129 | if(direction) |
mareikeFSL | 0:ffe2ac8461c1 | 130 | step++; //if forward, increase step |
mareikeFSL | 0:ffe2ac8461c1 | 131 | else |
mareikeFSL | 0:ffe2ac8461c1 | 132 | step--; //if backward, decrease step |
mareikeFSL | 0:ffe2ac8461c1 | 133 | break; |
mareikeFSL | 0:ffe2ac8461c1 | 134 | case 3: |
mareikeFSL | 0:ffe2ac8461c1 | 135 | send_spi(ClockwiseD); //send 0x0096 |
mareikeFSL | 0:ffe2ac8461c1 | 136 | if(direction) |
mareikeFSL | 0:ffe2ac8461c1 | 137 | step++; //if forward, increase step |
mareikeFSL | 0:ffe2ac8461c1 | 138 | else |
mareikeFSL | 0:ffe2ac8461c1 | 139 | step--; //if backward, decrease step |
mareikeFSL | 0:ffe2ac8461c1 | 140 | break; |
mareikeFSL | 0:ffe2ac8461c1 | 141 | default: |
mareikeFSL | 0:ffe2ac8461c1 | 142 | break; |
mareikeFSL | 0:ffe2ac8461c1 | 143 | } //end switch |
mareikeFSL | 0:ffe2ac8461c1 | 144 | |
mareikeFSL | 0:ffe2ac8461c1 | 145 | } //end turn_motor() |
mareikeFSL | 0:ffe2ac8461c1 | 146 | |
mareikeFSL | 0:ffe2ac8461c1 | 147 | /*******************************************************************************MAIN***/ |
mareikeFSL | 0:ffe2ac8461c1 | 148 | int main(void) |
mareikeFSL | 0:ffe2ac8461c1 | 149 | { |
mareikeFSL | 0:ffe2ac8461c1 | 150 | cw = 1; //turn off green LED |
mareikeFSL | 0:ffe2ac8461c1 | 151 | ccw = 1; //turn off red LED |
mareikeFSL | 0:ffe2ac8461c1 | 152 | cs = 1; //set cs high |
mareikeFSL | 0:ffe2ac8461c1 | 153 | |
mareikeFSL | 0:ffe2ac8461c1 | 154 | reverse(); //set initial direction |
mareikeFSL | 0:ffe2ac8461c1 | 155 | |
mareikeFSL | 0:ffe2ac8461c1 | 156 | init_spi(); //initialize SPI |
mareikeFSL | 0:ffe2ac8461c1 | 157 | |
mareikeFSL | 0:ffe2ac8461c1 | 158 | in5 = 0; //set in5 PWM low (not in use) |
mareikeFSL | 0:ffe2ac8461c1 | 159 | in6 = 0; //set in6 PWM low (not in use) |
mareikeFSL | 0:ffe2ac8461c1 | 160 | en = 1; //set en high (enable device) |
mareikeFSL | 0:ffe2ac8461c1 | 161 | |
mareikeFSL | 0:ffe2ac8461c1 | 162 | timer1.attach(&reverse, 5); //reverse direction every 5 seconds |
mareikeFSL | 0:ffe2ac8461c1 | 163 | timer2.attach_us(&turn_motor, 250000); //step every 250ms seconds |
mareikeFSL | 0:ffe2ac8461c1 | 164 | |
mareikeFSL | 0:ffe2ac8461c1 | 165 | while(true){} |
mareikeFSL | 0:ffe2ac8461c1 | 166 | |
mareikeFSL | 0:ffe2ac8461c1 | 167 | } //end main() |