DC 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_Brushed_DC_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 DC motor using a configurable switch.
DC MOTOR DRIVER
-> 1 second full on forward, 1 second full on backward
-> 3 seconds PWMing forward, 3 seconds PWMing backward
-> green LED indicates forward direction
-> red LED indicates backward direction
main.cpp@0:bf2ba94eb7e0, 2015-12-14 (annotated)
- Committer:
- mareikeFSL
- Date:
- Mon Dec 14 16:44:50 2015 +0000
- Revision:
- 0:bf2ba94eb7e0
Initial upload
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mareikeFSL | 0:bf2ba94eb7e0 | 1 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 2 | /* DC motor driver for FRDM-33879A-EVB (MC33879A) */ |
mareikeFSL | 0:bf2ba94eb7e0 | 3 | /* See application note AN5221 at www.nxp.com for more information */ |
mareikeFSL | 0:bf2ba94eb7e0 | 4 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 5 | |
mareikeFSL | 0:bf2ba94eb7e0 | 6 | /*--COMPANY-----AUTHOR------DATE------------REVISION----NOTES-------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 7 | /* NXP mareikeFSL 2015.12.14 rev 1.0 initial */ |
mareikeFSL | 0:bf2ba94eb7e0 | 8 | /* */ |
mareikeFSL | 0:bf2ba94eb7e0 | 9 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 10 | /* DC MOTOR DRIVER */ |
mareikeFSL | 0:bf2ba94eb7e0 | 11 | /* -> 1 second full on forward, 1 second full on backward */ |
mareikeFSL | 0:bf2ba94eb7e0 | 12 | /* -> 3 seconds PWMing forward, 3 seconds PWMing backward */ |
mareikeFSL | 0:bf2ba94eb7e0 | 13 | /* -> green LED indicates forward direction */ |
mareikeFSL | 0:bf2ba94eb7e0 | 14 | /* -> red LED indicates backward direction */ |
mareikeFSL | 0:bf2ba94eb7e0 | 15 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 16 | |
mareikeFSL | 0:bf2ba94eb7e0 | 17 | /*--SPI-------------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 18 | /* CLK (CLK) = PTD1 (J2/12) */ |
mareikeFSL | 0:bf2ba94eb7e0 | 19 | /* MOSI (MOSI) = PTD2 (J2/8) */ |
mareikeFSL | 0:bf2ba94eb7e0 | 20 | /* MISO (MISO) = PTD3 (J2/10) */ |
mareikeFSL | 0:bf2ba94eb7e0 | 21 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 22 | /*--GPIO------------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 23 | /* CS (CS) = PTD0 (J2/6) */ |
mareikeFSL | 0:bf2ba94eb7e0 | 24 | /* IO12 (EN) = PTA1 (J1/2) */ |
mareikeFSL | 0:bf2ba94eb7e0 | 25 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 26 | /*--PWM-------------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 27 | /* PWM0 (IN5) = PTA12 (J1/8) */ |
mareikeFSL | 0:bf2ba94eb7e0 | 28 | /* PWM1 (IN6) = PTA5 (J1/12) */ |
mareikeFSL | 0:bf2ba94eb7e0 | 29 | /*------------------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 30 | |
mareikeFSL | 0:bf2ba94eb7e0 | 31 | |
mareikeFSL | 0:bf2ba94eb7e0 | 32 | /*--INCLUDES--------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 33 | #include "mbed.h" |
mareikeFSL | 0:bf2ba94eb7e0 | 34 | |
mareikeFSL | 0:bf2ba94eb7e0 | 35 | |
mareikeFSL | 0:bf2ba94eb7e0 | 36 | /*--DEFINES---------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 37 | |
mareikeFSL | 0:bf2ba94eb7e0 | 38 | |
mareikeFSL | 0:bf2ba94eb7e0 | 39 | /*--INITS-----------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 40 | SPI spi(PTD2, PTD3, PTD1); //mosi, miso, clk |
mareikeFSL | 0:bf2ba94eb7e0 | 41 | DigitalOut cs(PTD0); //cs |
mareikeFSL | 0:bf2ba94eb7e0 | 42 | |
mareikeFSL | 0:bf2ba94eb7e0 | 43 | DigitalOut en(PTA1); //en |
mareikeFSL | 0:bf2ba94eb7e0 | 44 | |
mareikeFSL | 0:bf2ba94eb7e0 | 45 | PwmOut in5(PTA12); //in5 |
mareikeFSL | 0:bf2ba94eb7e0 | 46 | PwmOut in6(PTA5); //in6 |
mareikeFSL | 0:bf2ba94eb7e0 | 47 | |
mareikeFSL | 0:bf2ba94eb7e0 | 48 | DigitalOut cw(LED_GREEN); //forward LED |
mareikeFSL | 0:bf2ba94eb7e0 | 49 | DigitalOut ccw(LED_RED); //backward LED |
mareikeFSL | 0:bf2ba94eb7e0 | 50 | |
mareikeFSL | 0:bf2ba94eb7e0 | 51 | |
mareikeFSL | 0:bf2ba94eb7e0 | 52 | /*--CONSTANTS-------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 53 | unsigned const ON1 = 0x01; |
mareikeFSL | 0:bf2ba94eb7e0 | 54 | unsigned const ON2 = 0x02; |
mareikeFSL | 0:bf2ba94eb7e0 | 55 | unsigned const ON3 = 0x04; |
mareikeFSL | 0:bf2ba94eb7e0 | 56 | unsigned const ON4 = 0x08; |
mareikeFSL | 0:bf2ba94eb7e0 | 57 | unsigned const ON5 = 0x10; |
mareikeFSL | 0:bf2ba94eb7e0 | 58 | unsigned const ON6 = 0x20; |
mareikeFSL | 0:bf2ba94eb7e0 | 59 | unsigned const ON7 = 0x40; |
mareikeFSL | 0:bf2ba94eb7e0 | 60 | unsigned const ON8 = 0x80; |
mareikeFSL | 0:bf2ba94eb7e0 | 61 | unsigned const ALL_OFF = 0x00; |
mareikeFSL | 0:bf2ba94eb7e0 | 62 | |
mareikeFSL | 0:bf2ba94eb7e0 | 63 | |
mareikeFSL | 0:bf2ba94eb7e0 | 64 | /*--VARIABLES-------------------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 65 | |
mareikeFSL | 0:bf2ba94eb7e0 | 66 | |
mareikeFSL | 0:bf2ba94eb7e0 | 67 | /*--FUNCTION DECLARATIONS-------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 68 | void init_spi(void); //initializes SPI |
mareikeFSL | 0:bf2ba94eb7e0 | 69 | void send_spi(unsigned const word); //sends SPI commands |
mareikeFSL | 0:bf2ba94eb7e0 | 70 | int main(void); //main |
mareikeFSL | 0:bf2ba94eb7e0 | 71 | |
mareikeFSL | 0:bf2ba94eb7e0 | 72 | |
mareikeFSL | 0:bf2ba94eb7e0 | 73 | /*--FUNCTION DEFINITIONS--------------------------------------------------------------*/ |
mareikeFSL | 0:bf2ba94eb7e0 | 74 | |
mareikeFSL | 0:bf2ba94eb7e0 | 75 | /***************************************************************************INIT_SPI***/ |
mareikeFSL | 0:bf2ba94eb7e0 | 76 | void init_spi(void) |
mareikeFSL | 0:bf2ba94eb7e0 | 77 | { |
mareikeFSL | 0:bf2ba94eb7e0 | 78 | spi.format(8,1); //8-bit transfer, mode 1 (POL 0, PHA 1) |
mareikeFSL | 0:bf2ba94eb7e0 | 79 | spi.frequency(4000000); //freq |
mareikeFSL | 0:bf2ba94eb7e0 | 80 | |
mareikeFSL | 0:bf2ba94eb7e0 | 81 | } //end init_spi() |
mareikeFSL | 0:bf2ba94eb7e0 | 82 | |
mareikeFSL | 0:bf2ba94eb7e0 | 83 | /***************************************************************************SEND_SPI***/ |
mareikeFSL | 0:bf2ba94eb7e0 | 84 | void send_spi(unsigned const word) |
mareikeFSL | 0:bf2ba94eb7e0 | 85 | { |
mareikeFSL | 0:bf2ba94eb7e0 | 86 | cs = 0; //set cs low |
mareikeFSL | 0:bf2ba94eb7e0 | 87 | spi.write(0x00); //send 0x00 |
mareikeFSL | 0:bf2ba94eb7e0 | 88 | spi.write(word); //send 0xXX |
mareikeFSL | 0:bf2ba94eb7e0 | 89 | cs = 1; //set cs high |
mareikeFSL | 0:bf2ba94eb7e0 | 90 | |
mareikeFSL | 0:bf2ba94eb7e0 | 91 | } //end send_spi() |
mareikeFSL | 0:bf2ba94eb7e0 | 92 | |
mareikeFSL | 0:bf2ba94eb7e0 | 93 | /*******************************************************************************MAIN***/ |
mareikeFSL | 0:bf2ba94eb7e0 | 94 | int main(void) |
mareikeFSL | 0:bf2ba94eb7e0 | 95 | { |
mareikeFSL | 0:bf2ba94eb7e0 | 96 | cw = 1; //turn off green LED |
mareikeFSL | 0:bf2ba94eb7e0 | 97 | ccw = 1; //turn off red LED |
mareikeFSL | 0:bf2ba94eb7e0 | 98 | cs = 1; //set cs high |
mareikeFSL | 0:bf2ba94eb7e0 | 99 | |
mareikeFSL | 0:bf2ba94eb7e0 | 100 | init_spi(); //initialize SPI |
mareikeFSL | 0:bf2ba94eb7e0 | 101 | |
mareikeFSL | 0:bf2ba94eb7e0 | 102 | in5 = 0; //set in5 PWM low |
mareikeFSL | 0:bf2ba94eb7e0 | 103 | in6 = 0; //set in6 PWM low |
mareikeFSL | 0:bf2ba94eb7e0 | 104 | en = 1; //set en high (enable device) |
mareikeFSL | 0:bf2ba94eb7e0 | 105 | |
mareikeFSL | 0:bf2ba94eb7e0 | 106 | while(true) |
mareikeFSL | 0:bf2ba94eb7e0 | 107 | { |
mareikeFSL | 0:bf2ba94eb7e0 | 108 | //SPI only |
mareikeFSL | 0:bf2ba94eb7e0 | 109 | cw = 0; //turn on green LED |
mareikeFSL | 0:bf2ba94eb7e0 | 110 | ccw = 1; //turn off red LED |
mareikeFSL | 0:bf2ba94eb7e0 | 111 | send_spi(ON5 | ON7); //5 and 7 ON (forward) |
mareikeFSL | 0:bf2ba94eb7e0 | 112 | wait_ms(1000); //wait 1 second |
mareikeFSL | 0:bf2ba94eb7e0 | 113 | |
mareikeFSL | 0:bf2ba94eb7e0 | 114 | cw = 1; //turn off green LED |
mareikeFSL | 0:bf2ba94eb7e0 | 115 | ccw = 0; //turn on red LED |
mareikeFSL | 0:bf2ba94eb7e0 | 116 | send_spi(ON6 | ON8); //6 and 8 ON (backward) |
mareikeFSL | 0:bf2ba94eb7e0 | 117 | wait_ms(1000); //wait 1 second |
mareikeFSL | 0:bf2ba94eb7e0 | 118 | |
mareikeFSL | 0:bf2ba94eb7e0 | 119 | //SPI with PWMing |
mareikeFSL | 0:bf2ba94eb7e0 | 120 | cw = 0; //turn on green LED |
mareikeFSL | 0:bf2ba94eb7e0 | 121 | ccw = 1; //turn off red LED |
mareikeFSL | 0:bf2ba94eb7e0 | 122 | in5.period_us(100); //set period for 5 |
mareikeFSL | 0:bf2ba94eb7e0 | 123 | in5.write(0.5); //set duty cycle for 5 |
mareikeFSL | 0:bf2ba94eb7e0 | 124 | send_spi(ON7); //7 ON |
mareikeFSL | 0:bf2ba94eb7e0 | 125 | wait_ms(3000); //wait 3 seconds |
mareikeFSL | 0:bf2ba94eb7e0 | 126 | in5.write(0); //set duty cycle for 5 (OFF) |
mareikeFSL | 0:bf2ba94eb7e0 | 127 | send_spi(ALL_OFF); //turn all outputs off |
mareikeFSL | 0:bf2ba94eb7e0 | 128 | |
mareikeFSL | 0:bf2ba94eb7e0 | 129 | cw = 1; //turn off green LED |
mareikeFSL | 0:bf2ba94eb7e0 | 130 | ccw = 0; //turn on red LED |
mareikeFSL | 0:bf2ba94eb7e0 | 131 | in6.period_us(100); //set period for 6 |
mareikeFSL | 0:bf2ba94eb7e0 | 132 | in6.write(0.5); //set duty cycle for 6 |
mareikeFSL | 0:bf2ba94eb7e0 | 133 | send_spi(ON8); //8 ON |
mareikeFSL | 0:bf2ba94eb7e0 | 134 | wait_ms(3000); //wait 3 seconds |
mareikeFSL | 0:bf2ba94eb7e0 | 135 | in6.write(0); //set duty cycle for 6 (OFF) |
mareikeFSL | 0:bf2ba94eb7e0 | 136 | send_spi(ALL_OFF); //turn all outputs off |
mareikeFSL | 0:bf2ba94eb7e0 | 137 | |
mareikeFSL | 0:bf2ba94eb7e0 | 138 | } //end while() |
mareikeFSL | 0:bf2ba94eb7e0 | 139 | |
mareikeFSL | 0:bf2ba94eb7e0 | 140 | } //end main() |