Programma motore
Dependencies: mbed X-NUCLEO-IHM05A1
Exercise_IHM05A1.cpp@12:3b7216265c6a, 2018-11-21 (annotated)
- Committer:
- francesco01
- Date:
- Wed Nov 21 13:34:32 2018 +0000
- Revision:
- 12:3b7216265c6a
- Parent:
- 11:196c4677e0ca
robot finale;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pinofal | 9:900e18a2310b | 1 | /** |
pinofal | 9:900e18a2310b | 2 | ****************************************************************************** |
pinofal | 9:900e18a2310b | 3 | * @file main.cpp |
pinofal | 9:900e18a2310b | 4 | * @author IPC Rennes |
pinofal | 9:900e18a2310b | 5 | * @version V1.0.0 |
pinofal | 9:900e18a2310b | 6 | * @date April 13th, 2016 |
pinofal | 9:900e18a2310b | 7 | * @brief mbed simple application for the STMicroelectronics X-NUCLEO-IHM05A1 |
pinofal | 9:900e18a2310b | 8 | * Motor Control Expansion Board: control of 1 motor. |
pinofal | 9:900e18a2310b | 9 | ****************************************************************************** |
pinofal | 9:900e18a2310b | 10 | * @attention |
pinofal | 9:900e18a2310b | 11 | * |
pinofal | 9:900e18a2310b | 12 | * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> |
pinofal | 9:900e18a2310b | 13 | * |
pinofal | 9:900e18a2310b | 14 | * Redistribution and use in source and binary forms, with or without modification, |
pinofal | 9:900e18a2310b | 15 | * are permitted provided that the following conditions are met: |
pinofal | 9:900e18a2310b | 16 | * 1. Redistributions of source code must retain the above copyright notice, |
pinofal | 9:900e18a2310b | 17 | * this list of conditions and the following disclaimer. |
pinofal | 9:900e18a2310b | 18 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
pinofal | 9:900e18a2310b | 19 | * this list of conditions and the following disclaimer in the documentation |
pinofal | 9:900e18a2310b | 20 | * and/or other materials provided with the distribution. |
pinofal | 9:900e18a2310b | 21 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
pinofal | 9:900e18a2310b | 22 | * may be used to endorse or promote products derived from this software |
pinofal | 9:900e18a2310b | 23 | * without specific prior written permission. |
pinofal | 9:900e18a2310b | 24 | * |
pinofal | 9:900e18a2310b | 25 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
pinofal | 9:900e18a2310b | 26 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
pinofal | 9:900e18a2310b | 27 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
pinofal | 9:900e18a2310b | 28 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
pinofal | 9:900e18a2310b | 29 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
pinofal | 9:900e18a2310b | 30 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
pinofal | 9:900e18a2310b | 31 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
pinofal | 9:900e18a2310b | 32 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
pinofal | 9:900e18a2310b | 33 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
pinofal | 9:900e18a2310b | 34 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
pinofal | 9:900e18a2310b | 35 | * |
pinofal | 9:900e18a2310b | 36 | ****************************************************************************** |
pinofal | 9:900e18a2310b | 37 | */ |
pinofal | 9:900e18a2310b | 38 | |
pinofal | 9:900e18a2310b | 39 | /* Includes ------------------------------------------------------------------*/ |
pinofal | 9:900e18a2310b | 40 | |
pinofal | 9:900e18a2310b | 41 | /* mbed specific header files. */ |
pinofal | 9:900e18a2310b | 42 | #include "mbed.h" |
pinofal | 9:900e18a2310b | 43 | |
pinofal | 9:900e18a2310b | 44 | /* Component specific header files. */ |
pinofal | 9:900e18a2310b | 45 | #include "L6208.h" |
Vito1704 | 11:196c4677e0ca | 46 | #include "SampledSound.h" |
Vito1704 | 11:196c4677e0ca | 47 | #include "Clacson.h" |
francesco01 | 10:2622d1ab5984 | 48 | DigitalIn myButton(USER_BUTTON); |
francesco01 | 10:2622d1ab5984 | 49 | DigitalIn Input (PC_0); |
Vito1704 | 11:196c4677e0ca | 50 | AnalogIn InWave(PA_0); |
Vito1704 | 11:196c4677e0ca | 51 | Serial pc(USBTX, USBRX); |
Vito1704 | 11:196c4677e0ca | 52 | //DigitalOut myRele(PC_3); |
Vito1704 | 11:196c4677e0ca | 53 | DigitalOut LedAD (PC_2) ;//bianche telecamere |
Vito1704 | 11:196c4677e0ca | 54 | DigitalOut LedAS (PC_3) ;//bianche telecamere |
Vito1704 | 11:196c4677e0ca | 55 | DigitalOut LedPD (PC_10) ;//rosse |
Vito1704 | 11:196c4677e0ca | 56 | DigitalOut LedPS (PC_12) ;//rosse |
Vito1704 | 11:196c4677e0ca | 57 | AnalogOut OutWave(PA_4); // pin di output per la forma d'onda analogica |
Vito1704 | 11:196c4677e0ca | 58 | DigitalOut myD2(PA_10);//pin di output proveniente dal raspberry |
Vito1704 | 11:196c4677e0ca | 59 | DigitalOut led2(LED2); // LED su scheda |
pinofal | 9:900e18a2310b | 60 | /* Definitions ---------------------------------------------------------------*/ |
pinofal | 9:900e18a2310b | 61 | #ifdef TARGET_NUCLEO_F334R8 |
pinofal | 9:900e18a2310b | 62 | #define VREFA_PWM_PIN D11 |
pinofal | 9:900e18a2310b | 63 | #define VREFB_PWM_PIN D9 |
pinofal | 9:900e18a2310b | 64 | #elif TARGET_NUCLEO_F302R8 |
pinofal | 9:900e18a2310b | 65 | #define VREFA_PWM_PIN D11 |
pinofal | 9:900e18a2310b | 66 | #define VREFB_PWM_PIN D15 /* HW mandatory patch: bridge manually D9 with D15 */ |
pinofal | 9:900e18a2310b | 67 | #else |
pinofal | 9:900e18a2310b | 68 | #define VREFA_PWM_PIN D3 |
pinofal | 9:900e18a2310b | 69 | #define VREFB_PWM_PIN D9 |
pinofal | 9:900e18a2310b | 70 | #endif |
Vito1704 | 11:196c4677e0ca | 71 | #define NUMSAMPLE 300 |
Vito1704 | 11:196c4677e0ca | 72 | // ticker per la generazione dell'onda con DAC |
Vito1704 | 11:196c4677e0ca | 73 | Ticker SampleOutTicker; |
pinofal | 9:900e18a2310b | 74 | |
Vito1704 | 11:196c4677e0ca | 75 | void my_error_handler(uint16_t error) |
Vito1704 | 11:196c4677e0ca | 76 | { |
Vito1704 | 11:196c4677e0ca | 77 | /* Printing to the console. */ |
Vito1704 | 11:196c4677e0ca | 78 | pc.printf("Error %d detected\r\n\n", error); |
Vito1704 | 11:196c4677e0ca | 79 | |
Vito1704 | 11:196c4677e0ca | 80 | /* Infinite loop */ |
Vito1704 | 11:196c4677e0ca | 81 | while (true) { |
Vito1704 | 11:196c4677e0ca | 82 | } |
Vito1704 | 11:196c4677e0ca | 83 | } |
Vito1704 | 11:196c4677e0ca | 84 | |
Vito1704 | 11:196c4677e0ca | 85 | |
Vito1704 | 11:196c4677e0ca | 86 | |
Vito1704 | 11:196c4677e0ca | 87 | // ticker per l'acquisizione dell'onda con ADC |
Vito1704 | 11:196c4677e0ca | 88 | Ticker SamplingTicker; |
Vito1704 | 11:196c4677e0ca | 89 | |
Vito1704 | 11:196c4677e0ca | 90 | // carattere in arrivo dal PC ed equivalente numerico |
Vito1704 | 11:196c4677e0ca | 91 | volatile char cReadChar; |
Vito1704 | 11:196c4677e0ca | 92 | volatile int nReadChar; |
Vito1704 | 11:196c4677e0ca | 93 | |
Vito1704 | 11:196c4677e0ca | 94 | // flag che diventa true quando si vuole fermare l'acquisizione |
Vito1704 | 11:196c4677e0ca | 95 | volatile bool bStop; |
Vito1704 | 11:196c4677e0ca | 96 | |
Vito1704 | 11:196c4677e0ca | 97 | // valore letto dall'ADC e corrispondente in tensione |
Vito1704 | 11:196c4677e0ca | 98 | volatile unsigned short usReadADCLux; |
Vito1704 | 11:196c4677e0ca | 99 | volatile float fReadVoltage; |
Vito1704 | 11:196c4677e0ca | 100 | |
Vito1704 | 11:196c4677e0ca | 101 | // valore di temperatura letto dall'ADC |
Vito1704 | 11:196c4677e0ca | 102 | volatile float fLux; |
Vito1704 | 11:196c4677e0ca | 103 | |
Vito1704 | 11:196c4677e0ca | 104 | // prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC |
Vito1704 | 11:196c4677e0ca | 105 | void CalculateSinewave(void); |
Vito1704 | 11:196c4677e0ca | 106 | // funzione di generazione suono della frequenza e ampiezza selezionate |
Vito1704 | 11:196c4677e0ca | 107 | void SoundGenerate(double fFrequency); |
Vito1704 | 11:196c4677e0ca | 108 | |
Vito1704 | 11:196c4677e0ca | 109 | // carattere in arrivo dal PC |
Vito1704 | 11:196c4677e0ca | 110 | |
Vito1704 | 11:196c4677e0ca | 111 | volatile char CReadMusic; |
Vito1704 | 11:196c4677e0ca | 112 | |
Vito1704 | 11:196c4677e0ca | 113 | uint32_t nProva; |
Vito1704 | 11:196c4677e0ca | 114 | |
Vito1704 | 11:196c4677e0ca | 115 | // indice nell'array dei campioni da porre in output da DAC per Marimba |
Vito1704 | 11:196c4677e0ca | 116 | volatile uint32_t nSampleSoundIndex; |
Vito1704 | 11:196c4677e0ca | 117 | |
Vito1704 | 11:196c4677e0ca | 118 | // Periodo di generazione campioni in output DeltaT = T/NumSample |
Vito1704 | 11:196c4677e0ca | 119 | double fDeltaT; |
Vito1704 | 11:196c4677e0ca | 120 | // amplificazione per il dato da spedire sull'ADC |
Vito1704 | 11:196c4677e0ca | 121 | volatile double fAmp; |
Vito1704 | 11:196c4677e0ca | 122 | //volatile double fAmpNew; |
Vito1704 | 11:196c4677e0ca | 123 | // flag per bloccare la generazione del segnale |
Vito1704 | 11:196c4677e0ca | 124 | volatile int bGenerate = false; |
Vito1704 | 11:196c4677e0ca | 125 | |
Vito1704 | 11:196c4677e0ca | 126 | // frequenza segnale da generare |
Vito1704 | 11:196c4677e0ca | 127 | volatile double fFreq; |
Vito1704 | 11:196c4677e0ca | 128 | //flag che diventa true se bisogna fermare la generazione di suoni |
Vito1704 | 11:196c4677e0ca | 129 | |
Vito1704 | 11:196c4677e0ca | 130 | // periodo della sinusoide da generare |
Vito1704 | 11:196c4677e0ca | 131 | double fPeriod; |
Vito1704 | 11:196c4677e0ca | 132 | // tipo di suono da generare: 0=Sine, 1= Square |
Vito1704 | 11:196c4677e0ca | 133 | char cSoundWave; |
Vito1704 | 11:196c4677e0ca | 134 | |
Vito1704 | 11:196c4677e0ca | 135 | // nota corrispondente al tasto premuto |
Vito1704 | 11:196c4677e0ca | 136 | volatile char cKeyToPlay= '\0'; |
Vito1704 | 11:196c4677e0ca | 137 | |
Vito1704 | 11:196c4677e0ca | 138 | |
Vito1704 | 11:196c4677e0ca | 139 | //********************************************************************** |
Vito1704 | 11:196c4677e0ca | 140 | // generazione suoni con i sample da file di campioni in SoundSample.h |
Vito1704 | 11:196c4677e0ca | 141 | //********************************************************************** |
Vito1704 | 11:196c4677e0ca | 142 | void SampleOut() |
Vito1704 | 11:196c4677e0ca | 143 | { |
Vito1704 | 11:196c4677e0ca | 144 | |
Vito1704 | 11:196c4677e0ca | 145 | // genera campioni fino al raggiungimento del numero di campioni nel file Sound.h |
Vito1704 | 11:196c4677e0ca | 146 | if((nSampleSoundIndex < nSampleNum) && (bGenerate == true)) |
Vito1704 | 11:196c4677e0ca | 147 | { |
Vito1704 | 11:196c4677e0ca | 148 | // mette in output un campione della forma d'onda moltiplicato per l'amplificazione fAmp |
Vito1704 | 11:196c4677e0ca | 149 | OutWave.write_u16(naInputSoundWave[nSampleSoundIndex]*fAmp); |
Vito1704 | 11:196c4677e0ca | 150 | // incrementa l'indice del campione in output, nSampleNum è il numero dei campioni nle file Sound.h |
Vito1704 | 11:196c4677e0ca | 151 | nSampleSoundIndex++; |
Vito1704 | 11:196c4677e0ca | 152 | } |
Vito1704 | 11:196c4677e0ca | 153 | else |
Vito1704 | 11:196c4677e0ca | 154 | { |
Vito1704 | 11:196c4677e0ca | 155 | // se è stato generato il numero di campioni del file oppure bGenerate = false, ferma la generazione di suoni |
Vito1704 | 11:196c4677e0ca | 156 | bGenerate = false; |
Vito1704 | 11:196c4677e0ca | 157 | } |
Vito1704 | 11:196c4677e0ca | 158 | } |
Vito1704 | 11:196c4677e0ca | 159 | |
Vito1704 | 11:196c4677e0ca | 160 | // prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC |
Vito1704 | 11:196c4677e0ca | 161 | void CalculateSinewave(void); |
Vito1704 | 11:196c4677e0ca | 162 | // funzione di generazione suono della frequenza e ampiezza selezionate |
Vito1704 | 11:196c4677e0ca | 163 | void SoundGenerate(double fFrequency); |
pinofal | 9:900e18a2310b | 164 | |
pinofal | 9:900e18a2310b | 165 | /* Variables -----------------------------------------------------------------*/ |
pinofal | 9:900e18a2310b | 166 | |
pinofal | 9:900e18a2310b | 167 | /* Initialization parameters of the motor connected to the expansion board. */ |
pinofal | 9:900e18a2310b | 168 | l6208_init_t init = |
pinofal | 9:900e18a2310b | 169 | { |
francesco01 | 10:2622d1ab5984 | 170 | |
pinofal | 9:900e18a2310b | 171 | 1500, //Acceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes |
francesco01 | 10:2622d1ab5984 | 172 | 20, //Acceleration current torque in % (from 0 to 100) |
pinofal | 9:900e18a2310b | 173 | 1500, //Deceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes |
pinofal | 9:900e18a2310b | 174 | 30, //Deceleration current torque in % (from 0 to 100) |
pinofal | 9:900e18a2310b | 175 | 1500, //Running speed in step/s or (1/16)th step/s for microstep modes |
pinofal | 9:900e18a2310b | 176 | 50, //Running current torque in % (from 0 to 100) |
pinofal | 9:900e18a2310b | 177 | 20, //Holding current torque in % (from 0 to 100) |
pinofal | 9:900e18a2310b | 178 | STEP_MODE_1_16, //Step mode via enum motorStepMode_t |
pinofal | 9:900e18a2310b | 179 | FAST_DECAY, //Decay mode via enum motorDecayMode_t |
pinofal | 9:900e18a2310b | 180 | 0, //Dwelling time in ms |
pinofal | 9:900e18a2310b | 181 | FALSE, //Automatic HIZ STOP |
pinofal | 9:900e18a2310b | 182 | 100000 //VREFA and VREFB PWM frequency (Hz) |
pinofal | 9:900e18a2310b | 183 | }; |
pinofal | 9:900e18a2310b | 184 | |
pinofal | 9:900e18a2310b | 185 | /* Motor Control Component. */ |
pinofal | 9:900e18a2310b | 186 | L6208 *motor; |
pinofal | 9:900e18a2310b | 187 | |
pinofal | 9:900e18a2310b | 188 | /* Functions -----------------------------------------------------------------*/ |
pinofal | 9:900e18a2310b | 189 | |
pinofal | 9:900e18a2310b | 190 | /** |
pinofal | 9:900e18a2310b | 191 | * @brief This is an example of user handler for the flag interrupt. |
pinofal | 9:900e18a2310b | 192 | * @param None |
pinofal | 9:900e18a2310b | 193 | * @retval None |
pinofal | 9:900e18a2310b | 194 | * @note If needed, implement it, and then attach and enable it: |
pinofal | 9:900e18a2310b | 195 | * + motor->attach_flag_irq(&my_flag_irq_handler); |
pinofal | 9:900e18a2310b | 196 | * + motor->enable_flag_irq(); |
pinofal | 9:900e18a2310b | 197 | * To disable it: |
pinofal | 9:900e18a2310b | 198 | * + motor->DisbleFlagIRQ(); |
pinofal | 9:900e18a2310b | 199 | */ |
pinofal | 9:900e18a2310b | 200 | void my_flag_irq_handler(void) |
pinofal | 9:900e18a2310b | 201 | { |
pinofal | 9:900e18a2310b | 202 | pc.printf(" WARNING: \"FLAG\" interrupt triggered:\r\n"); |
pinofal | 9:900e18a2310b | 203 | motor->disable(); |
pinofal | 9:900e18a2310b | 204 | pc.printf(" Motor disabled.\r\n\n"); |
pinofal | 9:900e18a2310b | 205 | } |
pinofal | 9:900e18a2310b | 206 | |
pinofal | 9:900e18a2310b | 207 | /** |
pinofal | 9:900e18a2310b | 208 | * @brief This is an example of error handler. |
pinofal | 9:900e18a2310b | 209 | * @param[in] error Number of the error |
pinofal | 9:900e18a2310b | 210 | * @retval None |
pinofal | 9:900e18a2310b | 211 | * @note If needed, implement it, and then attach it: |
pinofal | 9:900e18a2310b | 212 | * + motor->attach_error_handler(&my_error_handler); |
pinofal | 9:900e18a2310b | 213 | */ |
pinofal | 9:900e18a2310b | 214 | |
pinofal | 9:900e18a2310b | 215 | /* Main ----------------------------------------------------------------------*/ |
pinofal | 9:900e18a2310b | 216 | |
pinofal | 9:900e18a2310b | 217 | int main() |
pinofal | 9:900e18a2310b | 218 | { |
Vito1704 | 11:196c4677e0ca | 219 | //inizializza variabili |
Vito1704 | 11:196c4677e0ca | 220 | bGenerate= false; |
Vito1704 | 11:196c4677e0ca | 221 | bStop= true; |
Vito1704 | 11:196c4677e0ca | 222 | cReadChar= 0; |
Vito1704 | 11:196c4677e0ca | 223 | //nSampleOutIndex= 0; |
Vito1704 | 11:196c4677e0ca | 224 | //nSampleOutCount= 0; |
Vito1704 | 11:196c4677e0ca | 225 | nSampleSoundIndex= 0; |
Vito1704 | 11:196c4677e0ca | 226 | |
Vito1704 | 11:196c4677e0ca | 227 | //imposta il funzionamento del pulsante come "PullDown": Aperto = '0'. L'altra modalità di funzionamento è PullUp |
Vito1704 | 11:196c4677e0ca | 228 | myButton.mode(PullUp); |
Vito1704 | 11:196c4677e0ca | 229 | |
Vito1704 | 11:196c4677e0ca | 230 | // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto |
Vito1704 | 11:196c4677e0ca | 231 | pc.baud(921600); //921600 bps |
Vito1704 | 11:196c4677e0ca | 232 | |
Vito1704 | 11:196c4677e0ca | 233 | // test dei LED |
Vito1704 | 11:196c4677e0ca | 234 | led2=1; // Blu |
Vito1704 | 11:196c4677e0ca | 235 | wait_ms(500); |
Vito1704 | 11:196c4677e0ca | 236 | led2=0; |
Vito1704 | 11:196c4677e0ca | 237 | |
Vito1704 | 11:196c4677e0ca | 238 | pc.printf("\r\nHallo Amaldi Students - Exercise 12 \r\n"); |
Vito1704 | 11:196c4677e0ca | 239 | pc.printf("\n\r*** Sampled Sound Generator ***\n\r"); |
Vito1704 | 11:196c4677e0ca | 240 | |
Vito1704 | 11:196c4677e0ca | 241 | // fissa l'amplificazione da 0 a 1 |
Vito1704 | 11:196c4677e0ca | 242 | fAmp = 1.0; |
Vito1704 | 11:196c4677e0ca | 243 | |
Vito1704 | 11:196c4677e0ca | 244 | // attende la pressione di tasti sulla marimba |
Vito1704 | 11:196c4677e0ca | 245 | while(true) |
Vito1704 | 11:196c4677e0ca | 246 | { |
Vito1704 | 11:196c4677e0ca | 247 | if(myButton == 0) |
Vito1704 | 11:196c4677e0ca | 248 | { |
Vito1704 | 11:196c4677e0ca | 249 | while(myButton != 1){}; // attendi che il tasto sia rilasciato |
Vito1704 | 11:196c4677e0ca | 250 | fFreq=nSamplePerSec/nUnderSampleFactor;// campioni per secondo da generare = nSamplePerSec/nUnderSampleFactor |
Vito1704 | 11:196c4677e0ca | 251 | pc.printf("--- Sound Generation ---\n\r"); |
Vito1704 | 11:196c4677e0ca | 252 | pc.printf("--- Clacson ---\n\r"); |
Vito1704 | 11:196c4677e0ca | 253 | if (myD2 == 1) |
Vito1704 | 11:196c4677e0ca | 254 | { |
Vito1704 | 11:196c4677e0ca | 255 | bGenerate = true; // flag true quando è attiva la generazione di suoni |
Vito1704 | 11:196c4677e0ca | 256 | nSampleSoundIndex =0; //inizializza indice dell'array |
Vito1704 | 11:196c4677e0ca | 257 | fDeltaT = (1.0/fFreq); // fFreq dipende dal periodo di campionamento e dal fattore di sottocampionamento |
Vito1704 | 11:196c4677e0ca | 258 | SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia generazione |
Vito1704 | 11:196c4677e0ca | 259 | } |
Vito1704 | 11:196c4677e0ca | 260 | else |
Vito1704 | 11:196c4677e0ca | 261 | { |
Vito1704 | 11:196c4677e0ca | 262 | bGenerate = false; // arresta la generazione di suoni |
Vito1704 | 11:196c4677e0ca | 263 | } |
Vito1704 | 11:196c4677e0ca | 264 | } |
Vito1704 | 11:196c4677e0ca | 265 | } // while |
Vito1704 | 11:196c4677e0ca | 266 | // periodo di campionamento |
Vito1704 | 11:196c4677e0ca | 267 | int nDeltaT; |
Vito1704 | 11:196c4677e0ca | 268 | |
Vito1704 | 11:196c4677e0ca | 269 | |
Vito1704 | 11:196c4677e0ca | 270 | // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto |
Vito1704 | 11:196c4677e0ca | 271 | pc.baud(921600); //921600 bps |
Vito1704 | 11:196c4677e0ca | 272 | // messaggio di benvenuto |
Vito1704 | 11:196c4677e0ca | 273 | pc.printf("\r\nHey Bro! Say Goodbye to your Sister !\r\n"); |
Vito1704 | 11:196c4677e0ca | 274 | pc.printf("Enter Acquisition Time, DeltaT[sec]= [1 - 9]: \r\n"); |
Vito1704 | 11:196c4677e0ca | 275 | // pc.printf("\r\n*** Bluetooth Temp Acquisition ***\r\n"); |
Vito1704 | 11:196c4677e0ca | 276 | |
Vito1704 | 11:196c4677e0ca | 277 | // inizializza variabili |
Vito1704 | 11:196c4677e0ca | 278 | bStop=true; |
Vito1704 | 11:196c4677e0ca | 279 | //myRele = 0x00; // spegni il relè |
Vito1704 | 11:196c4677e0ca | 280 | |
Vito1704 | 11:196c4677e0ca | 281 | |
francesco01 | 12:3b7216265c6a | 282 | while (true){ |
francesco01 | 12:3b7216265c6a | 283 | if (myButton == 1) { |
Vito1704 | 11:196c4677e0ca | 284 | LedAD =0x00 ; |
Vito1704 | 11:196c4677e0ca | 285 | LedAS =0x00 ; |
Vito1704 | 11:196c4677e0ca | 286 | LedPD =0x00 ; |
Vito1704 | 11:196c4677e0ca | 287 | LedPS =0x00 ; |
Vito1704 | 11:196c4677e0ca | 288 | wait(1); |
Vito1704 | 11:196c4677e0ca | 289 | LedAD =0x01 ; |
Vito1704 | 11:196c4677e0ca | 290 | LedAS =0x01 ; |
Vito1704 | 11:196c4677e0ca | 291 | LedPD =0x01 ; |
Vito1704 | 11:196c4677e0ca | 292 | LedPS =0x01 ; |
Vito1704 | 11:196c4677e0ca | 293 | wait(1); |
Vito1704 | 11:196c4677e0ca | 294 | LedAD =0x00 ; |
Vito1704 | 11:196c4677e0ca | 295 | LedAS =0x00 ; |
Vito1704 | 11:196c4677e0ca | 296 | LedPD =0x00 ; |
Vito1704 | 11:196c4677e0ca | 297 | LedPS =0x00 ; |
Vito1704 | 11:196c4677e0ca | 298 | wait(1); |
Vito1704 | 11:196c4677e0ca | 299 | LedAD =0x01; |
Vito1704 | 11:196c4677e0ca | 300 | wait_ms(500); |
Vito1704 | 11:196c4677e0ca | 301 | LedAS =0x01 ; |
Vito1704 | 11:196c4677e0ca | 302 | wait_ms(500); |
Vito1704 | 11:196c4677e0ca | 303 | LedPD =0x01 ; |
Vito1704 | 11:196c4677e0ca | 304 | wait_ms(500); |
Vito1704 | 11:196c4677e0ca | 305 | LedPS =0x01 ; |
francesco01 | 12:3b7216265c6a | 306 | wait(1);}}; |
pinofal | 9:900e18a2310b | 307 | // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto |
pinofal | 9:900e18a2310b | 308 | pc.baud(921600); //921600 bps |
pinofal | 9:900e18a2310b | 309 | //pc.baud(9600); //256000 bps |
pinofal | 9:900e18a2310b | 310 | pc.printf("*** Test Motor ***\n\r"); |
pinofal | 9:900e18a2310b | 311 | |
pinofal | 9:900e18a2310b | 312 | /* Printing to the console. */ |
pinofal | 9:900e18a2310b | 313 | pc.printf("STARTING MAIN PROGRAM\r\n"); |
pinofal | 9:900e18a2310b | 314 | pc.printf(" Reminder:\r\n"); |
pinofal | 9:900e18a2310b | 315 | pc.printf(" The position unit is in agreement to the step mode.\r\n"); |
pinofal | 9:900e18a2310b | 316 | pc.printf(" The speed, acceleration or deceleration unit depend on the step mode:\r\n"); |
pinofal | 9:900e18a2310b | 317 | pc.printf(" - For normal mode and half step mode, the unit is steps/s or /s^2.\r\n"); |
pinofal | 9:900e18a2310b | 318 | pc.printf(" - For microstep modes, the unit is (1/16)steps/s or /s^2.\r\n"); |
pinofal | 9:900e18a2310b | 319 | |
pinofal | 9:900e18a2310b | 320 | //----- Initialization |
pinofal | 9:900e18a2310b | 321 | /* Initializing Motor Control Component. */ |
pinofal | 9:900e18a2310b | 322 | motor = new L6208(D2, D8, D7, D4, D5, D6, VREFA_PWM_PIN, VREFB_PWM_PIN); |
pinofal | 9:900e18a2310b | 323 | if (motor->init(&init) != COMPONENT_OK) { |
pinofal | 9:900e18a2310b | 324 | exit(EXIT_FAILURE); |
pinofal | 9:900e18a2310b | 325 | } |
pinofal | 9:900e18a2310b | 326 | |
pinofal | 9:900e18a2310b | 327 | /* Attaching and enabling an interrupt handler. */ |
pinofal | 9:900e18a2310b | 328 | motor->attach_flag_irq(&my_flag_irq_handler); |
pinofal | 9:900e18a2310b | 329 | motor->enable_flag_irq(); |
pinofal | 9:900e18a2310b | 330 | |
pinofal | 9:900e18a2310b | 331 | /* Attaching an error handler */ |
pinofal | 9:900e18a2310b | 332 | motor->attach_error_handler(&my_error_handler); |
pinofal | 9:900e18a2310b | 333 | |
pinofal | 9:900e18a2310b | 334 | /* Printing to the console. */ |
pinofal | 9:900e18a2310b | 335 | pc.printf("Motor Control Application Example for 1 Motor\r\n"); |
pinofal | 9:900e18a2310b | 336 | |
pinofal | 9:900e18a2310b | 337 | //----- run the motor BACKWARD |
pinofal | 9:900e18a2310b | 338 | pc.printf("--> Running the motor backward.\r\n"); |
pinofal | 9:900e18a2310b | 339 | motor->run(StepperMotor::BWD); |
pinofal | 9:900e18a2310b | 340 | |
pinofal | 9:900e18a2310b | 341 | while (motor->get_status()!=STEADY) { |
pinofal | 9:900e18a2310b | 342 | /* Print reached speed to the console in step/s or microsteps/s */ |
pinofal | 9:900e18a2310b | 343 | pc.printf(" Reached Speed: %d microstep/s.\r\n", motor->get_speed()); |
pinofal | 9:900e18a2310b | 344 | wait_ms(50); |
pinofal | 9:900e18a2310b | 345 | } |
pinofal | 9:900e18a2310b | 346 | pc.printf(" Reached Speed: %d microstep/s.\r\n", motor->get_speed()); |
pinofal | 9:900e18a2310b | 347 | |
pinofal | 9:900e18a2310b | 348 | /* Wait for 1 second */ |
pinofal | 9:900e18a2310b | 349 | wait_ms(1000); |
pinofal | 9:900e18a2310b | 350 | |
pinofal | 9:900e18a2310b | 351 | |
pinofal | 9:900e18a2310b | 352 | |
pinofal | 9:900e18a2310b | 353 | //----- Soft stop required while running |
pinofal | 9:900e18a2310b | 354 | pc.printf("--> Soft stop requested.\r\n"); |
francesco01 | 10:2622d1ab5984 | 355 | motor->soft_stop(); |
pinofal | 9:900e18a2310b | 356 | |
francesco01 | 10:2622d1ab5984 | 357 | |
pinofal | 9:900e18a2310b | 358 | //----- Change step mode to full step mode |
pinofal | 9:900e18a2310b | 359 | motor->set_step_mode(StepperMotor::STEP_MODE_FULL); |
pinofal | 9:900e18a2310b | 360 | pc.printf(" Motor step mode: %d (0:FS, 1:1/2, 2:1/4, 3:1/8, 4:1/16).\r\n", motor->get_step_mode()); |
pinofal | 9:900e18a2310b | 361 | |
pinofal | 9:900e18a2310b | 362 | /* Get current position of device and print to the console */ |
pinofal | 9:900e18a2310b | 363 | pc.printf(" Position: %d.\r\n", motor->get_position()); |
pinofal | 9:900e18a2310b | 364 | |
pinofal | 9:900e18a2310b | 365 | /* Set speed, acceleration and deceleration to scale with normal mode */ |
pinofal | 9:900e18a2310b | 366 | motor->set_max_speed(init.maxSpeedSps>>4); |
pinofal | 9:900e18a2310b | 367 | motor->set_acceleration(motor->get_acceleration()>>4); |
pinofal | 9:900e18a2310b | 368 | motor->set_deceleration(motor->get_deceleration()>>4); |
pinofal | 9:900e18a2310b | 369 | /* Print parameters to the console */ |
pinofal | 9:900e18a2310b | 370 | pc.printf(" Motor Max Speed: %d step/s.\r\n", motor->get_max_speed()); |
pinofal | 9:900e18a2310b | 371 | pc.printf(" Motor Min Speed: %d step/s.\r\n", motor->get_min_speed()); |
pinofal | 9:900e18a2310b | 372 | pc.printf(" Motor Acceleration: %d step/s.\r\n", motor->get_acceleration()); |
pinofal | 9:900e18a2310b | 373 | pc.printf(" Motor Deceleration: %d step/s.\r\n", motor->get_deceleration()); |
pinofal | 9:900e18a2310b | 374 | |
pinofal | 9:900e18a2310b | 375 | //----- move of 200 steps in the FW direction |
pinofal | 9:900e18a2310b | 376 | pc.printf("--> Moving forward 200 steps.\r\n"); |
pinofal | 9:900e18a2310b | 377 | motor->move(StepperMotor::FWD, 200); |
francesco01 | 10:2622d1ab5984 | 378 | int i,a=0; |
pinofal | 9:900e18a2310b | 379 | |
francesco01 | 10:2622d1ab5984 | 380 | while (true) { |
pinofal | 9:900e18a2310b | 381 | |
francesco01 | 10:2622d1ab5984 | 382 | if ( Input == 0 ) |
francesco01 | 10:2622d1ab5984 | 383 | { |
francesco01 | 10:2622d1ab5984 | 384 | a=a+1; |
francesco01 | 10:2622d1ab5984 | 385 | } |
francesco01 | 10:2622d1ab5984 | 386 | if(a>1) |
francesco01 | 10:2622d1ab5984 | 387 | { |
francesco01 | 10:2622d1ab5984 | 388 | a=0; |
francesco01 | 10:2622d1ab5984 | 389 | |
francesco01 | 10:2622d1ab5984 | 390 | } |
francesco01 | 10:2622d1ab5984 | 391 | |
francesco01 | 10:2622d1ab5984 | 392 | if(a==0) |
francesco01 | 10:2622d1ab5984 | 393 | { |
francesco01 | 10:2622d1ab5984 | 394 | /* Request device to go position -3200 */ |
francesco01 | 10:2622d1ab5984 | 395 | motor->go_to(150); |
francesco01 | 10:2622d1ab5984 | 396 | /* Waiting while the motor is active. */ |
francesco01 | 10:2622d1ab5984 | 397 | motor->wait_while_active(); |
francesco01 | 10:2622d1ab5984 | 398 | } |
francesco01 | 10:2622d1ab5984 | 399 | else |
francesco01 | 10:2622d1ab5984 | 400 | { |
francesco01 | 10:2622d1ab5984 | 401 | /* Request device to go position -3200 */ |
francesco01 | 10:2622d1ab5984 | 402 | motor->go_to(-150); |
francesco01 | 10:2622d1ab5984 | 403 | /* Waiting while the motor is active. */ |
francesco01 | 10:2622d1ab5984 | 404 | motor->wait_while_active(); |
pinofal | 9:900e18a2310b | 405 | |
francesco01 | 10:2622d1ab5984 | 406 | } |
francesco01 | 10:2622d1ab5984 | 407 | |
pinofal | 9:900e18a2310b | 408 | |
francesco01 | 10:2622d1ab5984 | 409 | } |
pinofal | 9:900e18a2310b | 410 | } |
pinofal | 9:900e18a2310b | 411 | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |