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 Freescale

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

Committer:
mareikeFSL
Date:
Mon Dec 14 16:58:53 2015 +0000
Revision:
0:ffe2ac8461c1
Initial upload

Who changed what in which revision?

UserRevisionLine numberNew 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()