Simple test application for the STMicroelectronics X-NUCLEO-IHM01A1 Stepper Motor Control Expansion Board.

Dependencies:   X_NUCLEO_IHM01A1 mbed

Fork of HelloWorld_IHM01A1 by ST Expansion SW Team

Motor Control with the X-NUCLEO-IHM01A1 Expansion Board

This application provides a simple example of usage of the X-NUCLEO-IHM01A1 Stepper Motor Control Expansion Board.
It shows how to use one stepper motor connected to the board, moving the rotor to a specific position, with a given speed value, direction of rotation, etc.

Revision:
19:1cd7f65c155c
Parent:
17:4830b25fec7f
Child:
21:0189493b15ec
--- a/main.cpp	Mon Jan 04 15:57:57 2016 +0000
+++ b/main.cpp	Wed Jan 13 14:53:48 2016 +0000
@@ -57,10 +57,68 @@
 
 /* Variables -----------------------------------------------------------------*/
 
+/* Initialization parameters. */
+L6474_InitTypeDef init =
+{
+    160,                              /* Acceleration rate in step/s2. Range: (0..+inf). */
+    160,                              /* Deceleration rate in step/s2. Range: (0..+inf). */
+    1600,                             /* Maximum speed in step/s. Range: (30..10000]. */
+    800,                              /* Minimum speed in step/s. Range: [30..10000). */
+    250,                              /* Torque regulation current in mA. Range: 31.25mA to 4000mA. */
+    L6474_OCD_TH_750mA,               /* Overcurrent threshold (OCD_TH register). */
+    L6474_CONFIG_OC_SD_ENABLE,        /* Overcurrent shutwdown (OC_SD field of CONFIG register). */
+    L6474_CONFIG_EN_TQREG_TVAL_USED,  /* Torque regulation method (EN_TQREG field of CONFIG register). */
+    L6474_STEP_SEL_1_4,               /* Step selection (STEP_SEL field of STEP_MODE register). */
+    L6474_SYNC_SEL_1_2,               /* Sync selection (SYNC_SEL field of STEP_MODE register). */
+    L6474_FAST_STEP_12us,             /* Fall time value (T_FAST field of T_FAST register). Range: 2us to 32us. */
+    L6474_TOFF_FAST_8us,              /* Maximum fast decay time (T_OFF field of T_FAST register). Range: 2us to 32us. */
+    3,                                /* Minimum ON time in us (TON_MIN register). Range: 0.5us to 64us. */
+    21,                               /* Minimum OFF time in us (TOFF_MIN register). Range: 0.5us to 64us. */
+    L6474_CONFIG_TOFF_044us,          /* Target Swicthing Period (field TOFF of CONFIG register). */
+    L6474_CONFIG_SR_320V_us,          /* Slew rate (POW_SR field of CONFIG register). */
+    L6474_CONFIG_INT_16MHZ,           /* Clock setting (OSC_CLK_SEL field of CONFIG register). */
+    L6474_ALARM_EN_OVERCURRENT |
+    L6474_ALARM_EN_THERMAL_SHUTDOWN |
+    L6474_ALARM_EN_THERMAL_WARNING |
+    L6474_ALARM_EN_UNDERVOLTAGE |
+    L6474_ALARM_EN_SW_TURN_ON |
+    L6474_ALARM_EN_WRONG_NPERF_CMD    /* Alarm (ALARM_EN register). */
+};
+
 /* Motor Control Component. */
 L6474 *motor;
 
 
+/* Functions -----------------------------------------------------------------*/
+
+/**
+  * @brief  This is an example of user handler for the flag interrupt.
+  * @param  None
+  * @retval None
+  * @note   If needed, implement it, and then attach and enable it:
+  *           + motor->AttachFlagIRQ(&FlagIRQHandler);
+  *           + motor->EnableFlagIRQ();
+  *         To disable it:
+  *           + motor->DisbleFlagIRQ();
+  */
+void FlagIRQHandler(void)
+{
+    /* Set ISR flag. */
+    motor->isr_flag = TRUE;
+
+    /* Get the value of the status register. */
+    unsigned int status = motor->GetStatus();
+    
+    /* Check NOTPERF_CMD flag: if set, the command received by SPI can't be performed. */
+    /* This often occures when a command is sent to the L6474 while it is not in HiZ state. */
+    if ((status & L6474_STATUS_NOTPERF_CMD) == L6474_STATUS_NOTPERF_CMD)
+        printf("    WARNING: \"FLAG\" interrupt triggered. Non-performable command detected when updating L6474's registers while not in HiZ state.\r\n");
+    
+    /* Reset ISR flag. */
+    motor->isr_flag = FALSE;
+}
+
+
 /* Main ----------------------------------------------------------------------*/
 
 int main()
@@ -72,9 +130,13 @@
 
     /* Initializing Motor Control Component. */
     motor = new L6474(D2, D8, D7, D9, D10, dev_spi);
-    if (motor->Init() != COMPONENT_OK)
+    if (motor->Init(&init) != COMPONENT_OK)
         exit(EXIT_FAILURE);
 
+    /* Attaching and enabling interrupt handlers. */
+    motor->AttachFlagIRQ(&FlagIRQHandler);
+    motor->EnableFlagIRQ();
+
     /* Printing to the console. */
     printf("Motor Control Application Example for 1 Motor\r\n\n");
 
@@ -99,14 +161,32 @@
     /* Waiting 2 seconds. */
     wait_ms(2000);
 
-    
+
+    /*----- Changing motor setting. -----*/
+
+    /* Printing to the console. */
+    printf("--> Changing Step Mode and Torque.\r\n");
+
+    /* Setting High Impedance State to update L6474's registers. */
+    motor->SoftHiZ();
+
+    /* Changing step mode. */
+    motor->SetParameter(L6474_STEP_MODE, (unsigned int) L6474_STEP_SEL_1_16 | (unsigned int) L6474_SYNC_SEL_1_2);
+
+    /* Increasing the torque regulation current to 500mA. */
+    motor->SetParameter(L6474_TVAL, 500);
+
+    /* Waiting 1 second. */
+    wait_ms(1000);
+
+
     /*----- Moving. -----*/
     
     /* Printing to the console. */
-    printf("--> Moving backward %d steps.\r\n", STEPS >> 1);
+    printf("--> Moving backward %d steps.\r\n", STEPS);
 
     /* Moving N steps in the backward direction. */
-    motor->Move(StepperMotor::BWD, STEPS >> 1);
+    motor->Move(StepperMotor::BWD, STEPS);
     
     /* Waiting while the motor is active. */
     motor->WaitWhileActive();
@@ -128,10 +208,10 @@
     /*----- Going to a specified position. -----*/
 
     /* Printing to the console. */
-    printf("--> Going to position %d.\r\n", STEPS >> 1);
+    printf("--> Going to position %d.\r\n", STEPS);
     
     /* Requesting to go to a specified position. */
-    motor->GoTo(STEPS >> 1);
+    motor->GoTo(STEPS);
     
     /* Waiting while the motor is active. */
     motor->WaitWhileActive();