Hello program for PCA9629A. Demonstrates basic operations of PCA9629A component library.

Dependencies:   PCA9629A mbed

Committer:
nxp_ip
Date:
Fri Sep 12 08:14:47 2014 +0000
Revision:
1:0ff3203c6899
Parent:
0:e867e795937c
PCA9629A Hello program.; Demonstrates basic operation of the PCA9629A component library.

Who changed what in which revision?

UserRevisionLine numberNew 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 }