form of HeloWorld_IHM04A1

Dependencies:   FastPWM mbed ST_INTERFACES

Fork of HelloWorld_IHM04A1 by ST

Committer:
cerimis
Date:
Fri Jul 21 11:19:39 2017 +0000
Revision:
9:b7fc55bf70b2
Parent:
8:05340e740644
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brdirais 0:dcc35ef6effc 1 /**
brdirais 0:dcc35ef6effc 2 ******************************************************************************
davide.aliprandi@st.com 6:b9b32d6c2b40 3 * @file main.cpp
brdirais 0:dcc35ef6effc 4 * @author IPC Rennes
brdirais 0:dcc35ef6effc 5 * @version V1.0.0
brdirais 1:4d9b9123d9e1 6 * @date May 16, 2016
brdirais 0:dcc35ef6effc 7 * @brief This example shows how to use 1 IHM04A1 expansion board with
brdirais 0:dcc35ef6effc 8 * 4 unidirectionnal Brush DC motors.
brdirais 0:dcc35ef6effc 9 * Each motor has one lead connected to one of the bridge output,
brdirais 0:dcc35ef6effc 10 * the other lead to the ground. The input bridges are not parallelised.
brdirais 0:dcc35ef6effc 11 * The demo sequence starts when the user button is pressed.
brdirais 1:4d9b9123d9e1 12 * Each time, the user button is pressed, one new motor is activated
brdirais 0:dcc35ef6effc 13 ******************************************************************************
brdirais 0:dcc35ef6effc 14 * @attention
brdirais 0:dcc35ef6effc 15 *
brdirais 0:dcc35ef6effc 16 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
brdirais 0:dcc35ef6effc 17 *
brdirais 0:dcc35ef6effc 18 * Redistribution and use in source and binary forms, with or without modification,
brdirais 0:dcc35ef6effc 19 * are permitted provided that the following conditions are met:
brdirais 0:dcc35ef6effc 20 * 1. Redistributions of source code must retain the above copyright notice,
brdirais 0:dcc35ef6effc 21 * this list of conditions and the following disclaimer.
brdirais 0:dcc35ef6effc 22 * 2. Redistributions in binary form must reproduce the above copyright notice,
brdirais 0:dcc35ef6effc 23 * this list of conditions and the following disclaimer in the documentation
brdirais 0:dcc35ef6effc 24 * and/or other materials provided with the distribution.
brdirais 0:dcc35ef6effc 25 * 3. Neither the name of STMicroelectronics nor the names of its contributors
brdirais 0:dcc35ef6effc 26 * may be used to endorse or promote products derived from this software
brdirais 0:dcc35ef6effc 27 * without specific prior written permission.
brdirais 0:dcc35ef6effc 28 *
brdirais 0:dcc35ef6effc 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
brdirais 0:dcc35ef6effc 30 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
brdirais 0:dcc35ef6effc 31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
brdirais 0:dcc35ef6effc 32 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
brdirais 0:dcc35ef6effc 33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
brdirais 0:dcc35ef6effc 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
brdirais 0:dcc35ef6effc 35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
brdirais 0:dcc35ef6effc 36 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
brdirais 0:dcc35ef6effc 37 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
brdirais 0:dcc35ef6effc 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
brdirais 0:dcc35ef6effc 39 *
brdirais 0:dcc35ef6effc 40 ******************************************************************************
brdirais 0:dcc35ef6effc 41 */
brdirais 0:dcc35ef6effc 42
davide.aliprandi@st.com 6:b9b32d6c2b40 43
brdirais 0:dcc35ef6effc 44 /* Includes ------------------------------------------------------------------*/
brdirais 0:dcc35ef6effc 45
brdirais 0:dcc35ef6effc 46 /* mbed specific header files. */
brdirais 0:dcc35ef6effc 47 #include "mbed.h"
brdirais 0:dcc35ef6effc 48
brdirais 0:dcc35ef6effc 49 /* Component specific header files. */
davide.aliprandi@st.com 6:b9b32d6c2b40 50 #include "L6206.h"
brdirais 0:dcc35ef6effc 51
brdirais 0:dcc35ef6effc 52
brdirais 0:dcc35ef6effc 53 /* Definitions ---------------------------------------------------------------*/
brdirais 0:dcc35ef6effc 54
brdirais 0:dcc35ef6effc 55 #define MAX_MOTOR (4)
brdirais 0:dcc35ef6effc 56
brdirais 0:dcc35ef6effc 57
brdirais 0:dcc35ef6effc 58 /* Variables -----------------------------------------------------------------*/
brdirais 0:dcc35ef6effc 59
brdirais 0:dcc35ef6effc 60 static volatile uint16_t gLastError;
brdirais 0:dcc35ef6effc 61 static volatile uint8_t gStep = 0;
brdirais 0:dcc35ef6effc 62
brdirais 0:dcc35ef6effc 63
brdirais 0:dcc35ef6effc 64 /* Variables -----------------------------------------------------------------*/
brdirais 0:dcc35ef6effc 65
brdirais 0:dcc35ef6effc 66 /* Initialization parameters. */
davide.aliprandi@st.com 6:b9b32d6c2b40 67 L6206_init_t init =
brdirais 0:dcc35ef6effc 68 {
brdirais 0:dcc35ef6effc 69 L6206_CONF_PARAM_PARALLE_BRIDGES,
brdirais 0:dcc35ef6effc 70 {L6206_CONF_PARAM_FREQ_PWM1A, L6206_CONF_PARAM_FREQ_PWM2A, L6206_CONF_PARAM_FREQ_PWM1B, L6206_CONF_PARAM_FREQ_PWM2B},
cerimis 9:b7fc55bf70b2 71 {0,0,0,0},
cerimis 9:b7fc55bf70b2 72 {FORWARD,FORWARD,FORWARD,FORWARD},
brdirais 0:dcc35ef6effc 73 {INACTIVE,INACTIVE,INACTIVE,INACTIVE},
brdirais 0:dcc35ef6effc 74 {FALSE,FALSE}
brdirais 0:dcc35ef6effc 75 };
brdirais 0:dcc35ef6effc 76
brdirais 0:dcc35ef6effc 77 /* Motor Control Component. */
brdirais 0:dcc35ef6effc 78 L6206 *motor;
brdirais 0:dcc35ef6effc 79
brdirais 0:dcc35ef6effc 80 /* User button on Nucleo board */
davide.aliprandi@st.com 6:b9b32d6c2b40 81 InterruptIn my_button_irq(USER_BUTTON);
brdirais 0:dcc35ef6effc 82
brdirais 0:dcc35ef6effc 83
brdirais 0:dcc35ef6effc 84 /* Functions -----------------------------------------------------------------*/
brdirais 0:dcc35ef6effc 85
brdirais 0:dcc35ef6effc 86 /**
brdirais 0:dcc35ef6effc 87 * @brief This function is executed in case of error occurrence.
brdirais 0:dcc35ef6effc 88 * @param error number of the error
brdirais 0:dcc35ef6effc 89 * @retval None
brdirais 0:dcc35ef6effc 90 */
davide.aliprandi@st.com 6:b9b32d6c2b40 91 void my_error_handler(uint16_t error)
brdirais 0:dcc35ef6effc 92 {
brdirais 0:dcc35ef6effc 93 /* Backup error number */
brdirais 0:dcc35ef6effc 94 gLastError = error;
brdirais 0:dcc35ef6effc 95
brdirais 0:dcc35ef6effc 96 /* Enter your own code here */
cerimis 9:b7fc55bf70b2 97 printf("Error: %u\r\n\n",error);
brdirais 0:dcc35ef6effc 98 }
brdirais 0:dcc35ef6effc 99
brdirais 0:dcc35ef6effc 100 /**
brdirais 0:dcc35ef6effc 101 * @brief This function is the User handler for the flag interrupt
brdirais 0:dcc35ef6effc 102 * @param None
brdirais 0:dcc35ef6effc 103 * @retval None
brdirais 0:dcc35ef6effc 104 * @note If needed, implement it, and then attach and enable it:
davide.aliprandi@st.com 6:b9b32d6c2b40 105 * + motor->attach_flag_interrupt(my_flag_irq_handler);
brdirais 0:dcc35ef6effc 106 */
davide.aliprandi@st.com 6:b9b32d6c2b40 107 void my_flag_irq_handler(void)
brdirais 0:dcc35ef6effc 108 {
brdirais 0:dcc35ef6effc 109 /* Code to be customised */
brdirais 0:dcc35ef6effc 110 /************************/
brdirais 0:dcc35ef6effc 111 /* Get the state of bridge A */
davide.aliprandi@st.com 6:b9b32d6c2b40 112 uint16_t bridgeState = motor->get_bridge_status(0);
brdirais 0:dcc35ef6effc 113
davide.aliprandi@st.com 6:b9b32d6c2b40 114 if (bridgeState == 0) {
davide.aliprandi@st.com 6:b9b32d6c2b40 115 if ((motor->get_device_state(0) != INACTIVE)||
davide.aliprandi@st.com 6:b9b32d6c2b40 116 (motor->get_device_state(1) != INACTIVE)) {
brdirais 0:dcc35ef6effc 117 /* Bridge A was disabling due to overcurrent or over temperature */
brdirais 0:dcc35ef6effc 118 /* When at least on of its motor was running */
davide.aliprandi@st.com 6:b9b32d6c2b40 119 my_error_handler(0XBAD0);
brdirais 0:dcc35ef6effc 120 }
brdirais 0:dcc35ef6effc 121 }
brdirais 0:dcc35ef6effc 122
brdirais 0:dcc35ef6effc 123 /* Get the state of bridge B */
davide.aliprandi@st.com 6:b9b32d6c2b40 124 bridgeState = motor->get_bridge_status(1);
brdirais 0:dcc35ef6effc 125
davide.aliprandi@st.com 6:b9b32d6c2b40 126 if (bridgeState == 0) {
davide.aliprandi@st.com 6:b9b32d6c2b40 127 if ((motor->get_device_state(2) != INACTIVE)||
davide.aliprandi@st.com 6:b9b32d6c2b40 128 (motor->get_device_state(3) != INACTIVE)) {
brdirais 0:dcc35ef6effc 129 /* Bridge A was disabling due to overcurrent or over temperature */
brdirais 0:dcc35ef6effc 130 /* When at least on of its motor was running */
davide.aliprandi@st.com 6:b9b32d6c2b40 131 my_error_handler(0XBAD1);
brdirais 0:dcc35ef6effc 132 }
brdirais 0:dcc35ef6effc 133 }
davide.aliprandi@st.com 6:b9b32d6c2b40 134 }
brdirais 0:dcc35ef6effc 135
brdirais 0:dcc35ef6effc 136
brdirais 0:dcc35ef6effc 137 /* Private functions ---------------------------------------------------------*/
brdirais 0:dcc35ef6effc 138
brdirais 0:dcc35ef6effc 139 /**
brdirais 0:dcc35ef6effc 140 * @brief Button Irq
brdirais 0:dcc35ef6effc 141 * @param None
brdirais 0:dcc35ef6effc 142 * @retval None
brdirais 0:dcc35ef6effc 143 */
brdirais 0:dcc35ef6effc 144
davide.aliprandi@st.com 6:b9b32d6c2b40 145 void my_button_pressed(void)
brdirais 0:dcc35ef6effc 146 {
davide.aliprandi@st.com 6:b9b32d6c2b40 147 my_button_irq.disable_irq();
brdirais 0:dcc35ef6effc 148 gStep++;
davide.aliprandi@st.com 6:b9b32d6c2b40 149 if (gStep > MAX_MOTOR) {
brdirais 0:dcc35ef6effc 150 gStep = 0;
brdirais 0:dcc35ef6effc 151 }
brdirais 0:dcc35ef6effc 152 wait_ms(200);
davide.aliprandi@st.com 6:b9b32d6c2b40 153 my_button_irq.enable_irq();
brdirais 0:dcc35ef6effc 154 }
brdirais 0:dcc35ef6effc 155
brdirais 0:dcc35ef6effc 156
brdirais 0:dcc35ef6effc 157 /**
brdirais 0:dcc35ef6effc 158 * @brief Main program
brdirais 0:dcc35ef6effc 159 * @param None
brdirais 0:dcc35ef6effc 160 * @retval None
brdirais 0:dcc35ef6effc 161 */
brdirais 0:dcc35ef6effc 162 int main(void)
brdirais 0:dcc35ef6effc 163 {
brdirais 0:dcc35ef6effc 164 /*----- Initialization. -----*/
brdirais 0:dcc35ef6effc 165
brdirais 0:dcc35ef6effc 166 /* Initializing Motor Control Component. */
brdirais 0:dcc35ef6effc 167 motor = new L6206( D2, A4, D5, D4, A0, A1);
cerimis 9:b7fc55bf70b2 168 DigitalIn Pin_d4(D4);
cerimis 9:b7fc55bf70b2 169 DigitalIn Pin_a0(A0);
cerimis 9:b7fc55bf70b2 170 DigitalIn Pin_a1(A1);
cerimis 9:b7fc55bf70b2 171
cerimis 9:b7fc55bf70b2 172 Pin_d4.mode(PullNone);
cerimis 9:b7fc55bf70b2 173 Pin_a0.mode(PullNone);
cerimis 9:b7fc55bf70b2 174 Pin_a1.mode(PullNone);
cerimis 9:b7fc55bf70b2 175
davide.aliprandi@st.com 6:b9b32d6c2b40 176 /* When init method is called with NULL pointer, the L6206 parameters are set */
brdirais 0:dcc35ef6effc 177 /* with the predefined values from file l6206_target_config.h, otherwise the */
cerimis 9:b7fc55bf70b2 178 /* parameters are set using the init structure values. */
davide.aliprandi@st.com 6:b9b32d6c2b40 179 if (motor->init(&init) != COMPONENT_OK) {
brdirais 0:dcc35ef6effc 180 exit(EXIT_FAILURE);
davide.aliprandi@st.com 6:b9b32d6c2b40 181 }
cerimis 9:b7fc55bf70b2 182
davide.aliprandi@st.com 6:b9b32d6c2b40 183 /* Attach the function my_flag_irq_handler (defined below) to the flag interrupt */
davide.aliprandi@st.com 6:b9b32d6c2b40 184 motor->attach_flag_interrupt(my_flag_irq_handler);
brdirais 0:dcc35ef6effc 185
davide.aliprandi@st.com 6:b9b32d6c2b40 186 /* Attach the function my_error_handler (defined below) to the error Handler*/
davide.aliprandi@st.com 6:b9b32d6c2b40 187 motor->attach_error_handler(my_error_handler);
brdirais 0:dcc35ef6effc 188
brdirais 0:dcc35ef6effc 189 /* Printing to the console. */
Davidroid 7:20ff5668f5fe 190 printf("Motor Control Application Example for 4 Motors\r\n\n");
brdirais 0:dcc35ef6effc 191
brdirais 0:dcc35ef6effc 192 /* Select the configuration with no bridge paralleling, two unidirectionnal motors on bridge A
brdirais 0:dcc35ef6effc 193 and two unidirectionnal motors on bridge B */
cerimis 9:b7fc55bf70b2 194 //motor->set_dual_full_bridge_config(PARALLELING_NONE___2_UNDIR_MOTOR_BRIDGE_A__2_UNDIR_MOTOR_BRIDGE_B);
cerimis 9:b7fc55bf70b2 195 motor->set_dual_full_bridge_config(PARALLELING_ALL_WITH_IN1A___1_UNDIR_MOTOR);
brdirais 0:dcc35ef6effc 196
brdirais 1:4d9b9123d9e1 197 /* Set PWM Frequency of bridge A inputs to 1000 Hz */
cerimis 9:b7fc55bf70b2 198 // motor->set_bridge_input_pwm_freq(0,10000);
brdirais 0:dcc35ef6effc 199
brdirais 1:4d9b9123d9e1 200 /* Set PWM Frequency of bridge B inputs to 2000 Hz */
cerimis 9:b7fc55bf70b2 201 //motor->set_bridge_input_pwm_freq(1,2000);
cerimis 9:b7fc55bf70b2 202 motor->set_bridge_input_pwm_freq(0,1000);
cerimis 9:b7fc55bf70b2 203 //motor->set_bridge_input_pwm_freq(1,50000);
cerimis 9:b7fc55bf70b2 204 Pin_d4.mode(PullNone);
cerimis 9:b7fc55bf70b2 205 Pin_a0.mode(PullNone);
cerimis 9:b7fc55bf70b2 206 Pin_a1.mode(PullNone);
brdirais 0:dcc35ef6effc 207
davide.aliprandi@st.com 6:b9b32d6c2b40 208 // Attach my_button_pressed function to Irq
davide.aliprandi@st.com 6:b9b32d6c2b40 209 my_button_irq.fall(&my_button_pressed);
brdirais 0:dcc35ef6effc 210
brdirais 0:dcc35ef6effc 211 /* Infinite loop */
davide.aliprandi@st.com 6:b9b32d6c2b40 212 while (true) {
cerimis 9:b7fc55bf70b2 213
cerimis 9:b7fc55bf70b2 214 if (gStep == 0) {
cerimis 9:b7fc55bf70b2 215 printf("stopping motor 0\r\n");
cerimis 9:b7fc55bf70b2 216 /* Set speed of motor 0 to 5% */
cerimis 9:b7fc55bf70b2 217 motor->hard_hiz(0);
cerimis 9:b7fc55bf70b2 218 }
brdirais 0:dcc35ef6effc 219
cerimis 9:b7fc55bf70b2 220
cerimis 9:b7fc55bf70b2 221
cerimis 9:b7fc55bf70b2 222 if (gStep == 1) {
cerimis 9:b7fc55bf70b2 223 printf("Running motor 0 at 1%% of the maximum speed\r\n");
cerimis 9:b7fc55bf70b2 224 /* Set speed of motor 0 to 5% */
cerimis 9:b7fc55bf70b2 225 motor->set_speed(0,100);
cerimis 9:b7fc55bf70b2 226 /* start motor 0 */
cerimis 9:b7fc55bf70b2 227 motor->run(0, BDCMotor::FWD);
cerimis 9:b7fc55bf70b2 228
cerimis 9:b7fc55bf70b2 229 }
cerimis 9:b7fc55bf70b2 230
cerimis 9:b7fc55bf70b2 231 if (gStep == 2) {
Davidroid 8:05340e740644 232 printf("Running motor 0 at 5%% of the maximum speed\r\n");
cerimis 9:b7fc55bf70b2 233 /* Set speed of motor 1 to 10 % */
cerimis 9:b7fc55bf70b2 234 motor->set_speed(0,500);
cerimis 9:b7fc55bf70b2 235 /* start motor 1 */
cerimis 9:b7fc55bf70b2 236 //motor->run(1, BDCMotor::FWD);
davide.aliprandi@st.com 6:b9b32d6c2b40 237 motor->run(0, BDCMotor::FWD);
brdirais 0:dcc35ef6effc 238 }
brdirais 0:dcc35ef6effc 239
cerimis 9:b7fc55bf70b2 240 if (gStep == 3) {
cerimis 9:b7fc55bf70b2 241 printf("Running motor 0 at 10%% of the maximum speed\r\n");
Davidroid 8:05340e740644 242 /* Set speed of motor 2 to 15 % */
cerimis 9:b7fc55bf70b2 243 motor->set_speed(0,1000);
brdirais 0:dcc35ef6effc 244 /* start motor 2 */
cerimis 9:b7fc55bf70b2 245 //motor->run(2, BDCMotor::FWD);
cerimis 9:b7fc55bf70b2 246 motor->run(0, BDCMotor::FWD);
brdirais 0:dcc35ef6effc 247 }
brdirais 0:dcc35ef6effc 248
cerimis 9:b7fc55bf70b2 249 if (gStep == 4) {
cerimis 9:b7fc55bf70b2 250 printf("Running motor 0 at 50%% of the maximum speed\r\n");
Davidroid 8:05340e740644 251 /* Set speed of motor 3 to 20 % */
cerimis 9:b7fc55bf70b2 252 motor->set_speed(0,5000);
brdirais 0:dcc35ef6effc 253 /* start motor 3 */
cerimis 9:b7fc55bf70b2 254 //motor->run(3, BDCMotor::FWD);
cerimis 9:b7fc55bf70b2 255 motor->run(0, BDCMotor::FWD);
brdirais 0:dcc35ef6effc 256 }
brdirais 0:dcc35ef6effc 257
cerimis 9:b7fc55bf70b2 258 if (gStep >= 0) {
brdirais 0:dcc35ef6effc 259 wait_ms(1000);
brdirais 0:dcc35ef6effc 260
cerimis 9:b7fc55bf70b2 261 //motor->hard_hiz(0);
cerimis 9:b7fc55bf70b2 262 //motor->hard_hiz(1);
cerimis 9:b7fc55bf70b2 263 //motor->hard_hiz(2);
cerimis 9:b7fc55bf70b2 264 //motor->hard_hiz(3);
brdirais 0:dcc35ef6effc 265
cerimis 9:b7fc55bf70b2 266 //wait_ms(1000);
brdirais 0:dcc35ef6effc 267 }
brdirais 0:dcc35ef6effc 268 }
brdirais 0:dcc35ef6effc 269 }
brdirais 0:dcc35ef6effc 270
brdirais 0:dcc35ef6effc 271 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
cerimis 9:b7fc55bf70b2 272