
Hello program for PCA9629A. Demonstrates basic operations of PCA9629A component library.
main.cpp@0:e867e795937c, 2014-09-12 (annotated)
- Committer:
- nxp_ip
- Date:
- Fri Sep 12 08:11:25 2014 +0000
- Revision:
- 0:e867e795937c
PCA9629 "A". Hello program.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nxp_ip | 0:e867e795937c | 1 | /** A sample code for PCA9629A |
nxp_ip | 0:e867e795937c | 2 | * |
nxp_ip | 0:e867e795937c | 3 | * @author Akifumi (Tedd) OKANO, NXP Semiconductors |
nxp_ip | 0:e867e795937c | 4 | * @version 1.1 |
nxp_ip | 0:e867e795937c | 5 | * @date 12-Sep-2012 |
nxp_ip | 0:e867e795937c | 6 | * |
nxp_ip | 0:e867e795937c | 7 | * revision history (PCA9629A) |
nxp_ip | 0:e867e795937c | 8 | * version 0.1 (05-Jun-2013) : PCA9629"A" initial version |
nxp_ip | 0:e867e795937c | 9 | * version 0.2 (05-Jun-2013) : register name fix, register description added |
nxp_ip | 0:e867e795937c | 10 | * version 1.0 (23-Apr-2014) : sample code for revision 1.0 library |
nxp_ip | 0:e867e795937c | 11 | * version 1.1 (12-Sep-2014) : sample code for revision 1.1 library |
nxp_ip | 0:e867e795937c | 12 | * |
nxp_ip | 0:e867e795937c | 13 | * Released under the Apache 2 license License |
nxp_ip | 0:e867e795937c | 14 | * |
nxp_ip | 0:e867e795937c | 15 | * An operation sample of PCU9629A stepper motor controller. |
nxp_ip | 0:e867e795937c | 16 | * The mbed accesses the PCU9629A registers through I2C. |
nxp_ip | 0:e867e795937c | 17 | * |
nxp_ip | 0:e867e795937c | 18 | * This sample code demonstrates 4 type of PCA9629A operation |
nxp_ip | 0:e867e795937c | 19 | * |
nxp_ip | 0:e867e795937c | 20 | * About PCA9629A: |
nxp_ip | 0:e867e795937c | 21 | * http://www.nxp.com/products/interface_and_connectivity/i2c/i2c_bus_controller_and_bridge_ics/PCA9629APW.html |
nxp_ip | 0:e867e795937c | 22 | */ |
nxp_ip | 0:e867e795937c | 23 | |
nxp_ip | 0:e867e795937c | 24 | #include "mbed.h" |
nxp_ip | 0:e867e795937c | 25 | #include "PCA9629A.h" |
nxp_ip | 0:e867e795937c | 26 | |
nxp_ip | 0:e867e795937c | 27 | BusOut leds( LED4, LED3, LED2, LED1 ); |
nxp_ip | 0:e867e795937c | 28 | |
nxp_ip | 0:e867e795937c | 29 | PCA9629A motor_controller( p28, p27, 0x42 ); // SDA, SCL, Steps/rotation, I2C_address (option) |
nxp_ip | 0:e867e795937c | 30 | |
nxp_ip | 0:e867e795937c | 31 | void motor_action_0( void ); |
nxp_ip | 0:e867e795937c | 32 | void motor_action_1( void ); |
nxp_ip | 0:e867e795937c | 33 | void motor_action_2( void ); |
nxp_ip | 0:e867e795937c | 34 | void motor_action_3( void ); |
nxp_ip | 0:e867e795937c | 35 | void motor_action_CDE( void ); |
nxp_ip | 0:e867e795937c | 36 | |
nxp_ip | 0:e867e795937c | 37 | int main() |
nxp_ip | 0:e867e795937c | 38 | { |
nxp_ip | 0:e867e795937c | 39 | printf( "PCA9629A simple sample program\r\n" ); |
nxp_ip | 0:e867e795937c | 40 | |
nxp_ip | 0:e867e795937c | 41 | while ( 1 ) { |
nxp_ip | 0:e867e795937c | 42 | leds = 0x1; |
nxp_ip | 0:e867e795937c | 43 | motor_action_0(); // demo 0 |
nxp_ip | 0:e867e795937c | 44 | |
nxp_ip | 0:e867e795937c | 45 | leds = 0x3; |
nxp_ip | 0:e867e795937c | 46 | motor_action_1(); // demo 1 |
nxp_ip | 0:e867e795937c | 47 | |
nxp_ip | 0:e867e795937c | 48 | leds = 0x7; |
nxp_ip | 0:e867e795937c | 49 | motor_action_2(); // demo 2 |
nxp_ip | 0:e867e795937c | 50 | |
nxp_ip | 0:e867e795937c | 51 | leds = 0xF; |
nxp_ip | 0:e867e795937c | 52 | motor_action_3(); // demo 3 |
nxp_ip | 0:e867e795937c | 53 | } |
nxp_ip | 0:e867e795937c | 54 | } |
nxp_ip | 0:e867e795937c | 55 | |
nxp_ip | 0:e867e795937c | 56 | void motor_action_0( void ) |
nxp_ip | 0:e867e795937c | 57 | { |
nxp_ip | 0:e867e795937c | 58 | // simple motor operation |
nxp_ip | 0:e867e795937c | 59 | // the motor spins 2 times (200pps) for clockwise (CW), 1 time (100pps) for counter-clockwise. |
nxp_ip | 0:e867e795937c | 60 | |
nxp_ip | 0:e867e795937c | 61 | motor_controller.stop(); |
nxp_ip | 0:e867e795937c | 62 | motor_controller.init_registers(); |
nxp_ip | 0:e867e795937c | 63 | |
nxp_ip | 0:e867e795937c | 64 | motor_controller.pps( PCA9629A::CW, 200 ); |
nxp_ip | 0:e867e795937c | 65 | motor_controller.steps( PCA9629A::CW, 96 ); |
nxp_ip | 0:e867e795937c | 66 | |
nxp_ip | 0:e867e795937c | 67 | motor_controller.pps( PCA9629A::CCW, 100 ); |
nxp_ip | 0:e867e795937c | 68 | motor_controller.steps( PCA9629A::CCW, 48 ); |
nxp_ip | 0:e867e795937c | 69 | |
nxp_ip | 0:e867e795937c | 70 | for ( int i = 0; i < 2; i++ ) { |
nxp_ip | 0:e867e795937c | 71 | motor_controller.start( PCA9629A::CW ); |
nxp_ip | 0:e867e795937c | 72 | wait( 2.0 ); |
nxp_ip | 0:e867e795937c | 73 | |
nxp_ip | 0:e867e795937c | 74 | motor_controller.start( PCA9629A::CCW ); |
nxp_ip | 0:e867e795937c | 75 | wait( 2.0 ); |
nxp_ip | 0:e867e795937c | 76 | } |
nxp_ip | 0:e867e795937c | 77 | } |
nxp_ip | 0:e867e795937c | 78 | |
nxp_ip | 0:e867e795937c | 79 | void motor_action_1( void ) |
nxp_ip | 0:e867e795937c | 80 | { |
nxp_ip | 0:e867e795937c | 81 | // ramp control demo |
nxp_ip | 0:e867e795937c | 82 | |
nxp_ip | 0:e867e795937c | 83 | motor_controller.stop(); |
nxp_ip | 0:e867e795937c | 84 | motor_controller.init_registers(); |
nxp_ip | 0:e867e795937c | 85 | |
nxp_ip | 0:e867e795937c | 86 | motor_controller.write( PCA9629A::RUCNTL, 0x27 ); |
nxp_ip | 0:e867e795937c | 87 | motor_controller.write( PCA9629A::RDCNTL, 0x27 ); |
nxp_ip | 0:e867e795937c | 88 | motor_controller.write( PCA9629A::CW__STEP_WIDTH, 1175 ); |
nxp_ip | 0:e867e795937c | 89 | motor_controller.write( PCA9629A::CW__STEP_COUNT, 131 ); |
nxp_ip | 0:e867e795937c | 90 | |
nxp_ip | 0:e867e795937c | 91 | for ( int i = 0; i < 2; i++ ) { |
nxp_ip | 0:e867e795937c | 92 | motor_controller.start( PCA9629A::CW ); // start |
nxp_ip | 0:e867e795937c | 93 | wait( 2.5 ); |
nxp_ip | 0:e867e795937c | 94 | } |
nxp_ip | 0:e867e795937c | 95 | } |
nxp_ip | 0:e867e795937c | 96 | |
nxp_ip | 0:e867e795937c | 97 | void motor_action_2( void ) |
nxp_ip | 0:e867e795937c | 98 | { |
nxp_ip | 0:e867e795937c | 99 | // interrupt operation demo |
nxp_ip | 0:e867e795937c | 100 | |
nxp_ip | 0:e867e795937c | 101 | motor_controller.stop(); |
nxp_ip | 0:e867e795937c | 102 | |
nxp_ip | 0:e867e795937c | 103 | // this array is a sample for PCA9629A local interrupt operation |
nxp_ip | 0:e867e795937c | 104 | // the P0 and P1 inputs enabled for interrupt in. |
nxp_ip | 0:e867e795937c | 105 | // motor rotation will be reversed by interrupt signals. |
nxp_ip | 0:e867e795937c | 106 | // the motor direction will be changed 12 steps after when the interrupt happened |
nxp_ip | 0:e867e795937c | 107 | // |
nxp_ip | 0:e867e795937c | 108 | // CW = 40.69pps, CCW = 81.38pps |
nxp_ip | 0:e867e795937c | 109 | |
nxp_ip | 0:e867e795937c | 110 | char init_array2[] = { 0x80, |
nxp_ip | 0:e867e795937c | 111 | 0x20, 0x0A, 0x00, 0x03, 0x13, 0x1C, // for registers MODE - MSK (0x00 - 0x07 |
nxp_ip | 0:e867e795937c | 112 | 0x00, 0x00, 0x69, 0x00, 0x00, // for registers INTSTAT - EXTRASTEPS1 (0x06, 0xA) |
nxp_ip | 0:e867e795937c | 113 | 0x10, 0x80, // for registers OP_CFG_PHS and OP_STAT_TO (0x0B - 0xC) |
nxp_ip | 0:e867e795937c | 114 | 0x09, 0x09, 0x00, 0x00, 0x00, // for registers RUCNTL - LOOPDLY_CCW (0xD- 0x10) |
nxp_ip | 0:e867e795937c | 115 | 0x60, 0x00, 0x60, 0x00, 0x05, 0x0D, 0x05, 0x0D, // for registers CWSCOUNTL - MCNTL (0x12 - 0x1A) |
nxp_ip | 0:e867e795937c | 116 | 0x82, // for register MCNTL (0x1A) |
nxp_ip | 0:e867e795937c | 117 | 0xE2, 0xE4, 0xE6, 0xE0 // for registers SUBADR1 - ALLCALLADR (0x1B - 0x1E) |
nxp_ip | 0:e867e795937c | 118 | }; |
nxp_ip | 0:e867e795937c | 119 | |
nxp_ip | 0:e867e795937c | 120 | motor_controller.set_all_registers( init_array2, sizeof( init_array2 )); |
nxp_ip | 0:e867e795937c | 121 | wait( 5.0 ); |
nxp_ip | 0:e867e795937c | 122 | |
nxp_ip | 0:e867e795937c | 123 | motor_controller.stop(); |
nxp_ip | 0:e867e795937c | 124 | wait( 0.5 ); |
nxp_ip | 0:e867e795937c | 125 | } |
nxp_ip | 0:e867e795937c | 126 | |
nxp_ip | 0:e867e795937c | 127 | void motor_action_3( void ) |
nxp_ip | 0:e867e795937c | 128 | { |
nxp_ip | 0:e867e795937c | 129 | // speed change sample while the motor is running |
nxp_ip | 0:e867e795937c | 130 | |
nxp_ip | 0:e867e795937c | 131 | motor_controller.stop(); |
nxp_ip | 0:e867e795937c | 132 | motor_controller.init_registers(); |
nxp_ip | 0:e867e795937c | 133 | |
nxp_ip | 0:e867e795937c | 134 | motor_controller.steps( PCA9629A::CCW, 0xFFFF ); |
nxp_ip | 0:e867e795937c | 135 | |
nxp_ip | 0:e867e795937c | 136 | for ( int i = 0; i < 2; i++ ) { |
nxp_ip | 0:e867e795937c | 137 | for ( int s = 1; s <= 5; s++ ) { |
nxp_ip | 0:e867e795937c | 138 | motor_controller.pps( PCA9629A::CCW, 55 * s ); |
nxp_ip | 0:e867e795937c | 139 | motor_controller.start( PCA9629A::CCW ); |
nxp_ip | 0:e867e795937c | 140 | wait( 1.0 ); |
nxp_ip | 0:e867e795937c | 141 | } |
nxp_ip | 0:e867e795937c | 142 | } |
nxp_ip | 0:e867e795937c | 143 | } |
nxp_ip | 0:e867e795937c | 144 | |
nxp_ip | 0:e867e795937c | 145 | void motor_action_CDE( void ) |
nxp_ip | 0:e867e795937c | 146 | { |
nxp_ip | 0:e867e795937c | 147 | char scale[ 8 ] = { 4, 6, 8, 9, 11, 13, 15, 16 }; // CDEFGABC (A=0) |
nxp_ip | 0:e867e795937c | 148 | float freq[ 8 ]; |
nxp_ip | 0:e867e795937c | 149 | |
nxp_ip | 0:e867e795937c | 150 | for ( int i = 0; i < 8; i++ ) |
nxp_ip | 0:e867e795937c | 151 | freq[ i ] = (440.0 / 8.0) * pow( 2.0, (float)(scale[ i ]) / 12.0 ); |
nxp_ip | 0:e867e795937c | 152 | |
nxp_ip | 0:e867e795937c | 153 | motor_controller.stop(); |
nxp_ip | 0:e867e795937c | 154 | motor_controller.init_registers(); |
nxp_ip | 0:e867e795937c | 155 | motor_controller.steps( PCA9629A::CCW, 0xFFFF ); |
nxp_ip | 0:e867e795937c | 156 | |
nxp_ip | 0:e867e795937c | 157 | for ( int i = 0; i < 2; i++ ) { |
nxp_ip | 0:e867e795937c | 158 | motor_controller.stop(); |
nxp_ip | 0:e867e795937c | 159 | for ( int s = 0; s < 8; s++ ) { |
nxp_ip | 0:e867e795937c | 160 | motor_controller.pps( PCA9629A::CCW, freq[ s ] ); |
nxp_ip | 0:e867e795937c | 161 | motor_controller.start( PCA9629A::CCW ); |
nxp_ip | 0:e867e795937c | 162 | wait( 1 ); |
nxp_ip | 0:e867e795937c | 163 | } |
nxp_ip | 0:e867e795937c | 164 | } |
nxp_ip | 0:e867e795937c | 165 | } |