Expansion SW library to control high power stepper motor(s) using IHM03A1 expansion board(s) with Powerstep01 driver.
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Dependents: IHM03A1_ExampleFor1Motor HelloWorld_IHM03A1 IHM03A1_ExampleFor3Motors KYPHOS_Stepper_Motor_Control
Fork of X_NUCLEO_IHM03A1 by
Motor Control Library
Library to handle the X-NUCLEO-IHM03A1 Motor Control Expansion Board based on the Powerstep01 component.
It features the:
- read and write of Powerstep01 registers
- Nucleo and expansion board configuration (GPIOs, PWMs, IRQs, etc.)
- Powerstep01 application commands handling
- FLAG and BUSY interrupt handling (alarm reporting)
- Daisy chain handling
The API allows to easily:
- perform various positioning, moves and stops
- get/set or monitor the motor positions
- set home position and mark another position
- get/set minimum and maximum speed
- get current speed
- get/set acceleration and deceleration
- get/set the step mode (up to 1/128)
- get/set the control method
- get/set parameters for voltage mode driving
- get/set parameters for current mode driving
- get/set parameters for gate driving
- configure various protections such as overcurrent detection
- enable/disable alarms
- handle step-clock
- get system status
Daisy-Chain Configuration
The IHM03A1 board can be stacked up to three times so that the Powerstep01 components will be connected in daisy-chain configuration. For this purpose, some resistors must be correctly connected on the boards as depicted here below:
Platform compatibility
Compatible platforms have been tested with the default configuration provided by the HelloWorld_IHM03A1 example.
Diff: Components/PowerStep01/PowerStep01.cpp
- Revision:
- 7:9d772e2a9dbe
- Parent:
- 5:e7dca8c6ae9f
--- a/Components/PowerStep01/PowerStep01.cpp Mon May 08 15:41:45 2017 +0000
+++ b/Components/PowerStep01/PowerStep01.cpp Fri Jul 14 12:51:38 2017 +0000
@@ -1478,55 +1478,83 @@
{
case POWERSTEP01_EL_POS:
if ((value > (POWERSTEP01_ELPOS_STEP_MASK|POWERSTEP01_ELPOS_MICROSTEP_MASK))||
- ((value!=0)&&(value < (1<<(7-(POWERSTEP01_STEP_MODE_STEP_SEL&Powerstep01_CmdGetParam(POWERSTEP01_STEP_MODE))))))) result = FALSE;
- else registerValue = ((uint32_t) value)&(POWERSTEP01_ELPOS_STEP_MASK|POWERSTEP01_ELPOS_MICROSTEP_MASK);
+ ((value!=0)&&(value < (1<<(7-(POWERSTEP01_STEP_MODE_STEP_SEL&Powerstep01_CmdGetParam(POWERSTEP01_STEP_MODE))))))) {
+ result = FALSE;
+ } else {
+ registerValue = ((uint32_t) value)&(POWERSTEP01_ELPOS_STEP_MASK|POWERSTEP01_ELPOS_MICROSTEP_MASK);
+ }
break;
case POWERSTEP01_ABS_POS:
case POWERSTEP01_MARK:
if (value < 0)
{
value=-value;
- if (((uint32_t)value)<=(POWERSTEP01_MAX_POSITION+1))
- registerValue = (POWERSTEP01_ABS_POS_VALUE_MASK+1-(uint32_t)value)&POWERSTEP01_ABS_POS_VALUE_MASK;
- else result = FALSE;
+ if (((uint32_t)value)<=(POWERSTEP01_MAX_POSITION+1)) {
+ registerValue = (POWERSTEP01_ABS_POS_VALUE_MASK+1-(uint32_t)value)&POWERSTEP01_ABS_POS_VALUE_MASK;
+ } else {
+ result = FALSE;
+ }
}
else
{
- if (((uint32_t)value)<=POWERSTEP01_MAX_POSITION)
- registerValue = ((uint32_t) value)&POWERSTEP01_ABS_POS_VALUE_MASK;
- else result = FALSE;
+ if (((uint32_t)value)<=POWERSTEP01_MAX_POSITION) {
+ registerValue = ((uint32_t) value)&POWERSTEP01_ABS_POS_VALUE_MASK;
+ } else {
+ result = FALSE;
+ }
}
break;
case POWERSTEP01_ACC:
case POWERSTEP01_DEC:
- if (value > POWERSTEP01_ACC_DEC_MAX_VALUE) result = FALSE;
- else registerValue = acc_dec_steps_s2_to_reg_val(value);
+ if (value > POWERSTEP01_ACC_DEC_MAX_VALUE) {
+ result = FALSE;
+ } else {
+ registerValue = acc_dec_steps_s2_to_reg_val(value);
+ }
break;
case POWERSTEP01_MAX_SPEED:
- if (value > POWERSTEP01_MAX_SPEED_MAX_VALUE) result = FALSE;
- else registerValue = max_spd_steps_s_to_reg_val(value);
+ if (value > POWERSTEP01_MAX_SPEED_MAX_VALUE) {
+ result = FALSE;
+ } else {
+ registerValue = max_spd_steps_s_to_reg_val(value);
+ }
break;
case POWERSTEP01_MIN_SPEED:
- if (value > POWERSTEP01_MIN_SPEED_MAX_VALUE) result = FALSE;
- else registerValue = (POWERSTEP01_LSPD_OPT&Powerstep01_CmdGetParam(param))|min_spd_steps_s_to_reg_val(value);
+ if (value > POWERSTEP01_MIN_SPEED_MAX_VALUE) {
+ result = FALSE;
+ } else {
+ registerValue = (POWERSTEP01_LSPD_OPT&Powerstep01_CmdGetParam(param))|min_spd_steps_s_to_reg_val(value);
+ }
break;
case POWERSTEP01_FS_SPD:
- if (value > POWERSTEP01_FS_SPD_MAX_VALUE) result = FALSE;
- else registerValue = (POWERSTEP01_BOOST_MODE&Powerstep01_CmdGetParam(param))|fs_spd_steps_s_to_reg_val(value);
+ if (value > POWERSTEP01_FS_SPD_MAX_VALUE) {
+ result = FALSE;
+ } else {
+ registerValue = (POWERSTEP01_BOOST_MODE&Powerstep01_CmdGetParam(param))|fs_spd_steps_s_to_reg_val(value);
+ }
break;
case POWERSTEP01_INT_SPD:
- if (value > POWERSTEP01_INT_SPD_MAX_VALUE) result = FALSE;
- else registerValue = int_spd_steps_s_to_reg_val(value);
+ if (value > POWERSTEP01_INT_SPD_MAX_VALUE) {
+ result = FALSE;
+ } else {
+ registerValue = int_spd_steps_s_to_reg_val(value);
+ }
break;
case POWERSTEP01_K_THERM:
if ((value < POWERSTEP01_K_THERM_MIN_VALUE)||
- (value > POWERSTEP01_K_THERM_MAX_VALUE)) result = FALSE;
- else registerValue = k_therm_comp_to_reg_val(value);
+ (value > POWERSTEP01_K_THERM_MAX_VALUE)) {
+ result = FALSE;
+ } else {
+ registerValue = k_therm_comp_to_reg_val(value);
+ }
break;
case POWERSTEP01_OCD_TH:
case POWERSTEP01_STALL_TH:
- if (value > POWERSTEP01_STALL_OCD_TH_MAX_VALUE) result = FALSE;
- else registerValue = stall_ocd_th_to_reg_val(value);
+ if (value > POWERSTEP01_STALL_OCD_TH_MAX_VALUE) {
+ result = FALSE;
+ } else {
+ registerValue = stall_ocd_th_to_reg_val(value);
+ }
break;
case POWERSTEP01_KVAL_HOLD: //POWERSTEP01_TVAL_HOLD
case POWERSTEP01_KVAL_RUN: //POWERSTEP01_TVAL_RUN
@@ -1534,13 +1562,19 @@
case POWERSTEP01_KVAL_DEC: //POWERSTEP01_TVAL_DEC
if (voltageMode==FALSE)
{
- if (value > POWERSTEP01_TVAL_MAX_VALUE) result = FALSE;
- else registerValue = t_val_ref_voltage_to_reg_val(value);
+ if (value > POWERSTEP01_TVAL_MAX_VALUE) {
+ result = FALSE;
+ } else {
+ registerValue = t_val_ref_voltage_to_reg_val(value);
+ }
}
else
{
- if (value > POWERSTEP01_KVAL_MAX_VALUE) result = FALSE;
- else registerValue = k_val_perc_to_reg_val(value);
+ if (value > POWERSTEP01_KVAL_MAX_VALUE) {
+ result = FALSE;
+ } else {
+ registerValue = k_val_perc_to_reg_val(value);
+ }
}
break;
case POWERSTEP01_ST_SLP:
@@ -1553,13 +1587,19 @@
case POWERSTEP01_FN_SLP_DEC: //POWERSTEP01_TOFF_MIN
if (voltageMode==FALSE)
{
- if (value>POWERSTEP01_TOFF_TON_MIN_MAX_VALUE) result = FALSE;
- else registerValue = t_min_time_to_reg_val(value);
+ if (value>POWERSTEP01_TOFF_TON_MIN_MAX_VALUE) {
+ result = FALSE;
+ } else {
+ registerValue = t_min_time_to_reg_val(value);
+ }
}
else
{
- if (value > POWERSTEP01_SLP_MAX_VALUE) result = FALSE;
- else registerValue = bemf_slope_perc_to_reg_val(value);
+ if (value > POWERSTEP01_SLP_MAX_VALUE) {
+ result = FALSE;
+ } else {
+ registerValue = bemf_slope_perc_to_reg_val(value);
+ }
}
break;
default:

X-NUCLEO-IHM03A1 High Power Stepper Motor Driver