-

Dependencies:   X_NUCLEO_IHM01A1 mbed

Fork of joy_buttons_versao_2 by InsperX

Committer:
NathanLederman
Date:
Wed Apr 18 14:12:03 2018 +0000
Revision:
38:6e846a303dec
joy_buttons;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NathanLederman 38:6e846a303dec 1 /**
NathanLederman 38:6e846a303dec 2 ******************************************************************************
NathanLederman 38:6e846a303dec 3 * @file main.cpp
NathanLederman 38:6e846a303dec 4 * @author Davide Aliprandi, STMicroelectronics
NathanLederman 38:6e846a303dec 5 * @version V1.0.0
NathanLederman 38:6e846a303dec 6 * @date October 14th, 2015
NathanLederman 38:6e846a303dec 7 * @brief mbed test application for the STMicroelectronics X-NUCLEO-IHM01A1
NathanLederman 38:6e846a303dec 8 * Motor Control Expansion Board: control of 1 motor.
NathanLederman 38:6e846a303dec 9 ******************************************************************************
NathanLederman 38:6e846a303dec 10 * @attention
NathanLederman 38:6e846a303dec 11 *
NathanLederman 38:6e846a303dec 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
NathanLederman 38:6e846a303dec 13 *
NathanLederman 38:6e846a303dec 14 * Redistribution and use in source and binary forms, with or without modification,
NathanLederman 38:6e846a303dec 15 * are permitted provided that the following conditions are met:
NathanLederman 38:6e846a303dec 16 * 1. Redistributions of source code must retain the above copyright notice,
NathanLederman 38:6e846a303dec 17 * this list of conditions and the following disclaimer.
NathanLederman 38:6e846a303dec 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
NathanLederman 38:6e846a303dec 19 * this list of conditions and the following disclaimer in the documentation
NathanLederman 38:6e846a303dec 20 * and/or other materials provided with the distribution.
NathanLederman 38:6e846a303dec 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
NathanLederman 38:6e846a303dec 22 * may be used to endorse or promote products derived from this software
NathanLederman 38:6e846a303dec 23 * without specific prior written permission.
NathanLederman 38:6e846a303dec 24 *
NathanLederman 38:6e846a303dec 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
NathanLederman 38:6e846a303dec 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
NathanLederman 38:6e846a303dec 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
NathanLederman 38:6e846a303dec 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
NathanLederman 38:6e846a303dec 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
NathanLederman 38:6e846a303dec 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
NathanLederman 38:6e846a303dec 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
NathanLederman 38:6e846a303dec 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
NathanLederman 38:6e846a303dec 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
NathanLederman 38:6e846a303dec 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NathanLederman 38:6e846a303dec 35 *
NathanLederman 38:6e846a303dec 36 ******************************************************************************
NathanLederman 38:6e846a303dec 37 */
NathanLederman 38:6e846a303dec 38
NathanLederman 38:6e846a303dec 39
NathanLederman 38:6e846a303dec 40 /* Includes ------------------------------------------------------------------*/
NathanLederman 38:6e846a303dec 41
NathanLederman 38:6e846a303dec 42 /* mbed specific header files. */
NathanLederman 38:6e846a303dec 43 #include "mbed.h"
NathanLederman 38:6e846a303dec 44
NathanLederman 38:6e846a303dec 45 /* Helper header files. */
NathanLederman 38:6e846a303dec 46 #include "DevSPI.h"
NathanLederman 38:6e846a303dec 47
NathanLederman 38:6e846a303dec 48 /* Component specific header files. */
NathanLederman 38:6e846a303dec 49 #include "L6474.h"
NathanLederman 38:6e846a303dec 50
NathanLederman 38:6e846a303dec 51
NathanLederman 38:6e846a303dec 52 /* Definitions ---------------------------------------------------------------*/
NathanLederman 38:6e846a303dec 53
NathanLederman 38:6e846a303dec 54 /* Number of steps. */
NathanLederman 38:6e846a303dec 55 #define STEPS_1 (400 * 8) /* 1 revolution given a 400 steps motor configured at 1/8 microstep mode. */
NathanLederman 38:6e846a303dec 56
NathanLederman 38:6e846a303dec 57 /* Delay in milliseconds. */
NathanLederman 38:6e846a303dec 58 #define DELAY_1 1000
NathanLederman 38:6e846a303dec 59 #define DELAY_2 2000
NathanLederman 38:6e846a303dec 60 #define DELAY_3 6000
NathanLederman 38:6e846a303dec 61 #define DELAY_4 8000
NathanLederman 38:6e846a303dec 62
NathanLederman 38:6e846a303dec 63 /* Speed in pps (Pulses Per Second).
NathanLederman 38:6e846a303dec 64 In Full Step mode: 1 pps = 1 step/s).
NathanLederman 38:6e846a303dec 65 In 1/N Step Mode: N pps = 1 step/s). */
NathanLederman 38:6e846a303dec 66 #define SPEED_1 2400
NathanLederman 38:6e846a303dec 67 #define SPEED_2 1200
NathanLederman 38:6e846a303dec 68
NathanLederman 38:6e846a303dec 69
NathanLederman 38:6e846a303dec 70 /* Variables -----------------------------------------------------------------*/
NathanLederman 38:6e846a303dec 71
NathanLederman 38:6e846a303dec 72 /* Initialization parameters. */
NathanLederman 38:6e846a303dec 73 L6474_init_t init = {
NathanLederman 38:6e846a303dec 74 160, /* Acceleration rate in pps^2. Range: (0..+inf). */
NathanLederman 38:6e846a303dec 75 160, /* Deceleration rate in pps^2. Range: (0..+inf). */
NathanLederman 38:6e846a303dec 76 1600, /* Maximum speed in pps. Range: (30..10000]. */
NathanLederman 38:6e846a303dec 77 800, /* Minimum speed in pps. Range: [30..10000). */
NathanLederman 38:6e846a303dec 78 250, /* Torque regulation current in mA. Range: 31.25mA to 4000mA. */
NathanLederman 38:6e846a303dec 79 L6474_OCD_TH_750mA, /* Overcurrent threshold (OCD_TH register). */
NathanLederman 38:6e846a303dec 80 L6474_CONFIG_OC_SD_ENABLE, /* Overcurrent shutwdown (OC_SD field of CONFIG register). */
NathanLederman 38:6e846a303dec 81 L6474_CONFIG_EN_TQREG_TVAL_USED, /* Torque regulation method (EN_TQREG field of CONFIG register). */
NathanLederman 38:6e846a303dec 82 L6474_STEP_SEL_1_8, /* Step selection (STEP_SEL field of STEP_MODE register). */
NathanLederman 38:6e846a303dec 83 L6474_SYNC_SEL_1_2, /* Sync selection (SYNC_SEL field of STEP_MODE register). */
NathanLederman 38:6e846a303dec 84 L6474_FAST_STEP_12us, /* Fall time value (T_FAST field of T_FAST register). Range: 2us to 32us. */
NathanLederman 38:6e846a303dec 85 L6474_TOFF_FAST_8us, /* Maximum fast decay time (T_OFF field of T_FAST register). Range: 2us to 32us. */
NathanLederman 38:6e846a303dec 86 3, /* Minimum ON time in us (TON_MIN register). Range: 0.5us to 64us. */
NathanLederman 38:6e846a303dec 87 21, /* Minimum OFF time in us (TOFF_MIN register). Range: 0.5us to 64us. */
NathanLederman 38:6e846a303dec 88 L6474_CONFIG_TOFF_044us, /* Target Swicthing Period (field TOFF of CONFIG register). */
NathanLederman 38:6e846a303dec 89 L6474_CONFIG_SR_320V_us, /* Slew rate (POW_SR field of CONFIG register). */
NathanLederman 38:6e846a303dec 90 L6474_CONFIG_INT_16MHZ, /* Clock setting (OSC_CLK_SEL field of CONFIG register). */
NathanLederman 38:6e846a303dec 91 L6474_ALARM_EN_OVERCURRENT |
NathanLederman 38:6e846a303dec 92 L6474_ALARM_EN_THERMAL_SHUTDOWN |
NathanLederman 38:6e846a303dec 93 L6474_ALARM_EN_THERMAL_WARNING |
NathanLederman 38:6e846a303dec 94 L6474_ALARM_EN_UNDERVOLTAGE |
NathanLederman 38:6e846a303dec 95 L6474_ALARM_EN_SW_TURN_ON |
NathanLederman 38:6e846a303dec 96 L6474_ALARM_EN_WRONG_NPERF_CMD /* Alarm (ALARM_EN register). */
NathanLederman 38:6e846a303dec 97 };
NathanLederman 38:6e846a303dec 98
NathanLederman 38:6e846a303dec 99 /* Motor Control Component. */
NathanLederman 38:6e846a303dec 100 L6474 *motor;
NathanLederman 38:6e846a303dec 101
NathanLederman 38:6e846a303dec 102
NathanLederman 38:6e846a303dec 103 /* Functions -----------------------------------------------------------------*/
NathanLederman 38:6e846a303dec 104
NathanLederman 38:6e846a303dec 105 /**
NathanLederman 38:6e846a303dec 106 * @brief This is an example of user handler for the flag interrupt.
NathanLederman 38:6e846a303dec 107 * @param None
NathanLederman 38:6e846a303dec 108 * @retval None
NathanLederman 38:6e846a303dec 109 * @note If needed, implement it, and then attach and enable it:
NathanLederman 38:6e846a303dec 110 * + motor->attach_flag_irq(&flag_irq_handler);
NathanLederman 38:6e846a303dec 111 * + motor->enable_flag_irq();
NathanLederman 38:6e846a303dec 112 * To disable it:
NathanLederman 38:6e846a303dec 113 * + motor->disble_flag_irq();
NathanLederman 38:6e846a303dec 114 */
NathanLederman 38:6e846a303dec 115 void flag_irq_handler(void)
NathanLederman 38:6e846a303dec 116 {
NathanLederman 38:6e846a303dec 117 /* Set ISR flag. */
NathanLederman 38:6e846a303dec 118 motor->isr_flag = TRUE;
NathanLederman 38:6e846a303dec 119
NathanLederman 38:6e846a303dec 120 /* Get the value of the status register. */
NathanLederman 38:6e846a303dec 121 unsigned int status = motor->get_status();
NathanLederman 38:6e846a303dec 122
NathanLederman 38:6e846a303dec 123 /* Check NOTPERF_CMD flag: if set, the command received by SPI can't be performed. */
NathanLederman 38:6e846a303dec 124 /* This often occures when a command is sent to the L6474 while it is not in HiZ state. */
NathanLederman 38:6e846a303dec 125 if ((status & L6474_STATUS_NOTPERF_CMD) == L6474_STATUS_NOTPERF_CMD) {
NathanLederman 38:6e846a303dec 126 printf(" WARNING: \"FLAG\" interrupt triggered. Non-performable command detected when updating L6474's registers while not in HiZ state.\r\n");
NathanLederman 38:6e846a303dec 127 }
NathanLederman 38:6e846a303dec 128
NathanLederman 38:6e846a303dec 129 /* Reset ISR flag. */
NathanLederman 38:6e846a303dec 130 motor->isr_flag = FALSE;
NathanLederman 38:6e846a303dec 131 }
NathanLederman 38:6e846a303dec 132
NathanLederman 38:6e846a303dec 133
NathanLederman 38:6e846a303dec 134
NathanLederman 38:6e846a303dec 135
NathanLederman 38:6e846a303dec 136
NathanLederman 38:6e846a303dec 137
NathanLederman 38:6e846a303dec 138
NathanLederman 38:6e846a303dec 139
NathanLederman 38:6e846a303dec 140
NathanLederman 38:6e846a303dec 141
NathanLederman 38:6e846a303dec 142
NathanLederman 38:6e846a303dec 143
NathanLederman 38:6e846a303dec 144 DigitalIn botao_A(D6);
NathanLederman 38:6e846a303dec 145 DigitalIn botao_B(D5);
NathanLederman 38:6e846a303dec 146 DigitalIn botao_C(D4);
NathanLederman 38:6e846a303dec 147 DigitalIn botao_D(D3);
NathanLederman 38:6e846a303dec 148
NathanLederman 38:6e846a303dec 149
NathanLederman 38:6e846a303dec 150 DigitalOut myled(LED1);
NathanLederman 38:6e846a303dec 151 Serial pc(USBTX, USBRX);
NathanLederman 38:6e846a303dec 152
NathanLederman 38:6e846a303dec 153 int main() {
NathanLederman 38:6e846a303dec 154 /*----- Initialization. -----*/
NathanLederman 38:6e846a303dec 155
NathanLederman 38:6e846a303dec 156 /* Initializing SPI bus. */
NathanLederman 38:6e846a303dec 157 DevSPI dev_spi(D11, D12, D13);
NathanLederman 38:6e846a303dec 158
NathanLederman 38:6e846a303dec 159 /* Initializing Motor Control Component. */
NathanLederman 38:6e846a303dec 160 motor = new L6474(D2, D8, D7, D9, D10, dev_spi);
NathanLederman 38:6e846a303dec 161 if (motor->init(&init) != COMPONENT_OK) {
NathanLederman 38:6e846a303dec 162 exit(EXIT_FAILURE);
NathanLederman 38:6e846a303dec 163 }
NathanLederman 38:6e846a303dec 164
NathanLederman 38:6e846a303dec 165 /* Attaching and enabling interrupt handlers. */
NathanLederman 38:6e846a303dec 166 motor->attach_flag_irq(&flag_irq_handler);
NathanLederman 38:6e846a303dec 167 motor->enable_flag_irq();
NathanLederman 38:6e846a303dec 168
NathanLederman 38:6e846a303dec 169 int a,b,c,d;
NathanLederman 38:6e846a303dec 170 pc.baud(9600);
NathanLederman 38:6e846a303dec 171
NathanLederman 38:6e846a303dec 172
NathanLederman 38:6e846a303dec 173 a=b=c=d=0;
NathanLederman 38:6e846a303dec 174
NathanLederman 38:6e846a303dec 175 pc.printf("\f\rA=%d, B=%d, C=%d, D=%d",a,b,c,d);
NathanLederman 38:6e846a303dec 176 pc.printf("\n\rHello World!!!");
NathanLederman 38:6e846a303dec 177
NathanLederman 38:6e846a303dec 178 while(1) {
NathanLederman 38:6e846a303dec 179 if (botao_A==0) {
NathanLederman 38:6e846a303dec 180 a++;
NathanLederman 38:6e846a303dec 181 pc.printf("\n\rTecla A=%d",a);
NathanLederman 38:6e846a303dec 182 motor->move(StepperMotor::FWD, 400);
NathanLederman 38:6e846a303dec 183 }
NathanLederman 38:6e846a303dec 184 if (botao_B==0) {
NathanLederman 38:6e846a303dec 185 b++;
NathanLederman 38:6e846a303dec 186 pc.printf("\n\rTecla B=%d",b);
NathanLederman 38:6e846a303dec 187 motor->move(StepperMotor::BWD, 400);
NathanLederman 38:6e846a303dec 188 }
NathanLederman 38:6e846a303dec 189 if (botao_C==0) {
NathanLederman 38:6e846a303dec 190 c++;
NathanLederman 38:6e846a303dec 191 pc.printf("\n\rTecla C=%d",c);
NathanLederman 38:6e846a303dec 192 }
NathanLederman 38:6e846a303dec 193 if (botao_D==0) {
NathanLederman 38:6e846a303dec 194 d++;
NathanLederman 38:6e846a303dec 195 pc.printf("\n\rTecla D=%d",d);
NathanLederman 38:6e846a303dec 196 }
NathanLederman 38:6e846a303dec 197 wait(0.2);
NathanLederman 38:6e846a303dec 198 }
NathanLederman 38:6e846a303dec 199 }