Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Dependents: Stepper_Matlab_Control SunTracker_BLE Stepper_Matlab_Control MemsMotorControl ... more
Fork of X_NUCLEO_IHM01A1 by
Motor Control Library
Introduction
Library to handle the X-NUCLEO-IHM01A1 Motor Control Expansion Board based on the the L6474 component.
Daisy-Chain Configuration
This board can be stacked up to three times so that the L6474 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
- NUCLEO boards have been tested with the default configuration provided by the HelloWorld_IHM01A1 example.
- LPCXpresso11U68 board has been tested with the following patch:
- to connect with a wire from the LPCX’s
D4pin to the IHM01A1’sD9pin; - to initialize the pwm PinName variable with
D4rather thanD9.
- to connect with a wire from the LPCX’s
- FRDM-K64F board has been tested with the following patch:
- to connect with a wire from the FRDM’s
D4pin to the IHM01A1’sD8pin; - to initialize the standby_reset PinName variable with
D4rather thanD8.
- to connect with a wire from the FRDM’s
Example Applications
- HelloWorld_IHM01A1
- HelloWorld_IHM01A1_2Motors
- MotorControl_IHM01A1
- MemsMotorControl
- MemsMotorControl_IHM01A1_IKS01A2
Diff: Components/l6474/l6474_class.h
- Revision:
- 5:d3c78f12a78d
- Parent:
- 4:83a1eb397a65
- Child:
- 6:a47569fc7534
--- a/Components/l6474/l6474_class.h Fri Nov 13 12:56:06 2015 +0000
+++ b/Components/l6474/l6474_class.h Wed Nov 18 18:41:55 2015 +0000
@@ -108,13 +108,13 @@
*--------------------------------------------------------------------*/
flagInterruptCallback = 0;
errorHandlerCallback = 0;
- memset(spiTxBursts, 0, L6474_CMD_ARG_MAX_NB_BYTES);
- memset(spiRxBursts, 0, L6474_CMD_ARG_MAX_NB_BYTES);
spiPreemtionByIsr = 0;
isrFlag = 0;
//devicePrm = 0;
deviceInstance = numberOfDevices;
numberOfDevices++;
+ memset(spiTxBursts, 0, L6474_CMD_ARG_MAX_NB_BYTES * MAX_NUMBER_OF_DEVICES * sizeof(uint8_t));
+ memset(spiRxBursts, 0, L6474_CMD_ARG_MAX_NB_BYTES * MAX_NUMBER_OF_DEVICES * sizeof(uint8_t));
}
/**
@@ -175,11 +175,6 @@
return (signed int) L6474_GetMark();
}
- virtual direction_t GetDirection(void)
- {
- return (direction_t) L6474_GetDirection();
- }
-
virtual unsigned int GetSpeed(void)
{
return (unsigned int) L6474_GetCurrentSpeed();
@@ -205,6 +200,11 @@
return (unsigned int) L6474_GetDeceleration();
}
+ virtual direction_t GetDirection(void)
+ {
+ return (direction_t) (L6474_GetDirection() == FORWARD ? StepperMotor::FWD : StepperMotor::BWD);
+ }
+
virtual void SetParameter(unsigned int parameter, unsigned int value)
{
L6474_CmdSetParam((unsigned int) parameter, (unsigned int) value);
@@ -220,11 +220,6 @@
L6474_SetMark();
}
- virtual void SetDirection(direction_t direction)
- {
- L6474_SetDirection((direction_t) direction);
- }
-
virtual void SetMaxSpeed(unsigned int speed)
{
L6474_SetMaxSpeed((unsigned int) speed);
@@ -262,12 +257,12 @@
virtual void Run(direction_t direction)
{
- L6474_Run((direction_t) direction);
+ L6474_Run((motorDir_t) (direction == StepperMotor::FWD ? FORWARD : BACKWARD));
}
virtual void Move(direction_t direction, unsigned int steps)
{
- L6474_Move((direction_t) direction, (unsigned int) steps);
+ L6474_Move((motorDir_t) (direction == StepperMotor::FWD ? FORWARD : BACKWARD), (unsigned int) steps);
}
virtual void SoftStop(void)
@@ -290,6 +285,11 @@
return (uint8_t) L6474_GetFwVersion();
}
+ virtual void SetDirection(direction_t direction)
+ {
+ L6474_SetDirection((motorDir_t) (direction == StepperMotor::FWD ? FORWARD : BACKWARD));
+ }
+
virtual void StepClockHandler(void)
{
L6474_StepClockHandler();
@@ -425,8 +425,8 @@
void L6474_GoMark(void); //Move to the Mark position
void L6474_GoTo(int32_t targetPosition); //Go to the specified position
void L6474_HardStop(void); //Stop the motor and disable the power bridge
- void L6474_Move(direction_t direction, uint32_t stepCount); //Move the motor of the specified number of steps
- void L6474_Run(direction_t direction); //Run the motor
+ void L6474_Move(motorDir_t direction, uint32_t stepCount); //Move the motor of the specified number of steps
+ void L6474_Run(motorDir_t direction); //Run the motor
bool L6474_SetAcceleration(uint16_t newAcc); //Set the acceleration in pps^2
bool L6474_SetDeceleration(uint16_t newDec); //Set the deceleration in pps^2
void L6474_SetHome(void); //Set current position to be the home position
@@ -443,8 +443,8 @@
void L6474_CmdSetParam(uint32_t param, uint32_t value); //Send the L6474_SET_PARAM command
uint16_t L6474_ReadStatusRegister(void); //Read the L6474_STATUS register without clearing the flags
void L6474_SelectStepMode(motorStepMode_t stepMod); //Step mode selection
- direction_t L6474_GetDirection(void); //Get the direction of rotation
- void L6474_SetDirection(direction_t direction); //Set the direction of rotation
+ motorDir_t L6474_GetDirection(void); //Get the direction of rotation
+ void L6474_SetDirection(motorDir_t direction); //Set the direction of rotation
void L6474_ApplySpeed(uint16_t newSpeed);
void L6474_ComputeSpeedProfile(uint32_t nbSteps);
int32_t L6474_ConvertPosition(uint32_t abs_position_reg);
@@ -511,7 +511,7 @@
*/
void L6474_Delay(uint32_t delay)
{
- /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs */
+ /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs.*/
wait_ms(delay);
}
@@ -520,7 +520,7 @@
*/
void L6474_EnableIrq(void)
{
- /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs */
+ /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs.*/
__enable_irq();
}
@@ -529,7 +529,7 @@
*/
void L6474_DisableIrq(void)
{
- /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs */
+ /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs.*/
__disable_irq();
}
@@ -539,7 +539,7 @@
*/
void L6474_PwmSetFreq(uint16_t newFreq)
{
- /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs */
+ /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs.*/
double period = 1.0f / newFreq;
pwm.period(period);
pwm.write(0.5f);
@@ -554,7 +554,7 @@
*/
void L6474_PwmInit(void)
{
- /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs */
+ /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs.*/
}
/*
@@ -562,7 +562,7 @@
*/
void L6474_PwmStop(void)
{
- /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs */
+ /* TO BE IMPLEMENTED BY USING TARGET PLATFORM'S APIs.*/
pwm.write(0.0f);
ticker.detach();
}
@@ -655,13 +655,13 @@
*------------------------------------------------------------------------*/
void (*flagInterruptCallback)(void);
void (*errorHandlerCallback)(uint16_t error);
- uint8_t spiTxBursts[L6474_CMD_ARG_MAX_NB_BYTES];
- uint8_t spiRxBursts[L6474_CMD_ARG_MAX_NB_BYTES];
bool spiPreemtionByIsr;
bool isrFlag;
deviceParams_t devicePrm;
+ uint8_t deviceInstance;
static uint8_t numberOfDevices;
- uint8_t deviceInstance;
+ static uint8_t spiTxBursts[L6474_CMD_ARG_MAX_NB_BYTES][MAX_NUMBER_OF_DEVICES];
+ static uint8_t spiRxBursts[L6474_CMD_ARG_MAX_NB_BYTES][MAX_NUMBER_OF_DEVICES];
};
#endif // __L6474_CLASS_H

X-NUCLEO-IHM01A1 Stepper Motor Driver