Codice per pilotare il motore IHM01A1
Dependencies: mbed X_NUCLEO_IHM01A1
Diff: main.cpp
- Revision:
- 19:1cd7f65c155c
- Parent:
- 17:4830b25fec7f
- Child:
- 21:0189493b15ec
diff -r 19d177002292 -r 1cd7f65c155c main.cpp --- 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();