motore cofano

Dependencies:   mbed X-NUCLEO-IHM05A1

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Exercise_IHM05A1.cpp Source File

Exercise_IHM05A1.cpp

00001 /**
00002  ******************************************************************************
00003  * @file    main.cpp
00004  * @author  IPC Rennes
00005  * @version V1.0.0
00006  * @date    April 13th, 2016
00007  * @brief   mbed simple application for the STMicroelectronics X-NUCLEO-IHM05A1
00008  *          Motor Control Expansion Board: control of 1 motor.
00009  ******************************************************************************
00010  * @attention
00011  *
00012  * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
00013  *
00014  * Redistribution and use in source and binary forms, with or without modification,
00015  * are permitted provided that the following conditions are met:
00016  *   1. Redistributions of source code must retain the above copyright notice,
00017  *      this list of conditions and the following disclaimer.
00018  *   2. Redistributions in binary form must reproduce the above copyright notice,
00019  *      this list of conditions and the following disclaimer in the documentation
00020  *      and/or other materials provided with the distribution.
00021  *   3. Neither the name of STMicroelectronics nor the names of its contributors
00022  *      may be used to endorse or promote products derived from this software
00023  *      without specific prior written permission.
00024  *
00025  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00026  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00028  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
00029  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00030  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
00031  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00032  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00033  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00034  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00035  *
00036  ******************************************************************************
00037  */
00038 
00039 /* Includes ------------------------------------------------------------------*/
00040 
00041 /* mbed specific header files. */
00042 #include "mbed.h"
00043 
00044 /* Component specific header files. */
00045 #include "L6208.h"
00046 #include "SampledSound.h"
00047 #include "Clacson.h"
00048  DigitalIn myButton(USER_BUTTON);
00049  DigitalIn Input (PC_0);
00050 AnalogIn InWave(PA_0);
00051 Serial pc(USBTX, USBRX);
00052 //DigitalOut myRele(PC_3);
00053 DigitalOut LedAD (PC_2) ;//bianche telecamere
00054 DigitalOut LedAS (PC_3) ;//bianche telecamere
00055 DigitalOut LedPD (PC_10) ;//rosse
00056 DigitalOut LedPS (PC_12) ;//rosse
00057 AnalogOut OutWave(PA_4); // pin di output per la forma d'onda analogica
00058 DigitalOut myD2(PA_10);//pin di output proveniente dal raspberry
00059 DigitalOut led2(LED2); // LED su scheda
00060 /* Definitions ---------------------------------------------------------------*/
00061 #ifdef TARGET_NUCLEO_F334R8
00062 #define VREFA_PWM_PIN D11
00063 #define VREFB_PWM_PIN D9
00064 #elif TARGET_NUCLEO_F302R8
00065 #define VREFA_PWM_PIN D11
00066 #define VREFB_PWM_PIN D15 /* HW mandatory patch: bridge manually D9 with D15 */
00067 #else
00068 #define VREFA_PWM_PIN D3
00069 #define VREFB_PWM_PIN D9
00070 #endif
00071 #define NUMSAMPLE 300
00072 // ticker per la generazione dell'onda con DAC
00073 Ticker SampleOutTicker;
00074 
00075 void my_error_handler(uint16_t error)
00076 {
00077   /* Printing to the console. */
00078   pc.printf("Error %d detected\r\n\n", error);
00079   
00080   /* Infinite loop */
00081   while (true) {
00082   }    
00083 }
00084 
00085 
00086 
00087 // ticker per l'acquisizione dell'onda con ADC
00088 Ticker SamplingTicker;
00089 
00090 // carattere in arrivo dal PC ed equivalente numerico
00091 volatile char cReadChar;
00092 volatile int nReadChar;
00093 
00094 // flag che diventa true quando si vuole fermare l'acquisizione
00095 volatile bool bStop;
00096 
00097 // valore letto dall'ADC e corrispondente in tensione
00098 volatile unsigned short usReadADCLux;
00099 volatile float fReadVoltage;
00100 
00101 // valore di temperatura letto dall'ADC
00102 volatile float fLux;                                                                                                                                                                                                       
00103 
00104 // prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
00105 void CalculateSinewave(void);
00106 // funzione di generazione suono della frequenza e ampiezza selezionate
00107 void SoundGenerate(double fFrequency);
00108                 
00109 // carattere in arrivo dal PC
00110 
00111 volatile char CReadMusic;                
00112 
00113 uint32_t nProva;
00114 
00115 // indice nell'array dei campioni da porre in output da DAC per Marimba
00116 volatile uint32_t nSampleSoundIndex;
00117 
00118 // Periodo di generazione campioni in output DeltaT = T/NumSample
00119 double fDeltaT;
00120 // amplificazione per il dato da spedire sull'ADC
00121 volatile double fAmp;
00122 //volatile double fAmpNew;
00123 // flag per bloccare la generazione del segnale
00124 volatile int bGenerate = false;
00125 
00126 // frequenza segnale da generare
00127 volatile double fFreq;
00128 //flag che diventa true se bisogna fermare la generazione di suoni
00129 
00130 // periodo della sinusoide da generare
00131 double fPeriod;
00132 // tipo di suono da generare: 0=Sine, 1= Square
00133 char cSoundWave;
00134 
00135 // nota corrispondente al tasto premuto
00136 volatile char cKeyToPlay= '\0';
00137 
00138 
00139 //**********************************************************************
00140 // generazione suoni con i sample da file di campioni in SoundSample.h 
00141 //**********************************************************************
00142 void SampleOut() 
00143 {
00144    
00145     // genera campioni fino al raggiungimento del numero di campioni nel file Sound.h
00146     if((nSampleSoundIndex < nSampleNum) && (bGenerate == true))
00147     {
00148         // mette in output un campione della forma d'onda moltiplicato per l'amplificazione fAmp
00149         OutWave.write_u16(naInputSoundWave[nSampleSoundIndex]*fAmp);
00150         // incrementa l'indice del campione in output, nSampleNum è il numero dei campioni nle file Sound.h
00151         nSampleSoundIndex++;
00152     }
00153     else
00154     {
00155         // se è stato generato il numero di campioni del file oppure bGenerate = false, ferma la generazione di suoni
00156         bGenerate = false;
00157     }    
00158 }
00159 
00160 // prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
00161 void CalculateSinewave(void);
00162 // funzione di generazione suono della frequenza e ampiezza selezionate
00163 void SoundGenerate(double fFrequency);
00164 
00165 /* Variables -----------------------------------------------------------------*/
00166 
00167 /* Initialization parameters of the motor connected to the expansion board. */
00168 l6208_init_t init =
00169 {
00170  
00171   1500,            //Acceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes
00172   20,              //Acceleration current torque in % (from 0 to 100)
00173   1500,            //Deceleration rate in step/s^2 or (1/16)th step/s^2 for microstep modes
00174   30,              //Deceleration current torque in % (from 0 to 100)
00175   1500,            //Running speed in step/s or (1/16)th step/s for microstep modes
00176   50,              //Running current torque in % (from 0 to 100)
00177   20,              //Holding current torque in % (from 0 to 100)
00178   STEP_MODE_1_16,  //Step mode via enum motorStepMode_t
00179   FAST_DECAY,      //Decay mode via enum motorDecayMode_t
00180   0,               //Dwelling time in ms
00181   FALSE,           //Automatic HIZ STOP
00182   100000           //VREFA and VREFB PWM frequency (Hz)
00183 };
00184 
00185 /* Motor Control Component. */
00186 L6208 *motor;
00187 
00188 /* Functions -----------------------------------------------------------------*/
00189 
00190 /**
00191  * @brief  This is an example of user handler for the flag interrupt.
00192  * @param  None
00193  * @retval None
00194  * @note   If needed, implement it, and then attach and enable it:
00195  *           + motor->attach_flag_irq(&my_flag_irq_handler);
00196  *           + motor->enable_flag_irq();
00197  *         To disable it:
00198  *           + motor->DisbleFlagIRQ();
00199  */
00200 void my_flag_irq_handler(void)
00201 {
00202   pc.printf("    WARNING: \"FLAG\" interrupt triggered:\r\n");
00203   motor->disable();
00204   pc.printf("    Motor disabled.\r\n\n");
00205 }
00206 
00207 /**
00208  * @brief  This is an example of error handler.
00209  * @param[in] error Number of the error
00210  * @retval None
00211  * @note   If needed, implement it, and then attach it:
00212  *           + motor->attach_error_handler(&my_error_handler);
00213  */
00214 
00215 /* Main ----------------------------------------------------------------------*/
00216 
00217 int main()
00218 {
00219        //inizializza variabili 
00220     bGenerate= false;
00221    bStop= true;
00222     cReadChar= 0;
00223     //nSampleOutIndex= 0;
00224     //nSampleOutCount= 0;
00225     nSampleSoundIndex= 0;
00226     
00227      //imposta il funzionamento del pulsante come "PullDown": Aperto = '0'. L'altra modalità di funzionamento è PullUp
00228     myButton.mode(PullUp);
00229     
00230     // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
00231     pc.baud(921600); //921600 bps
00232     
00233     // test dei LED
00234     led2=1; // Blu
00235     wait_ms(500);
00236     led2=0;
00237         
00238    pc.printf("\r\nHallo Amaldi Students - Exercise 12 \r\n");
00239     pc.printf("\n\r*** Sampled Sound Generator ***\n\r");
00240                 
00241     // fissa l'amplificazione da 0 a 1
00242     fAmp = 1.0;  
00243       
00244     // attende la pressione di tasti sulla marimba
00245     while(true)
00246     {   
00247         if(myButton == 0)
00248         {
00249             while(myButton != 1){}; // attendi che il tasto sia rilasciato
00250             fFreq=nSamplePerSec/nUnderSampleFactor;// campioni per secondo da generare = nSamplePerSec/nUnderSampleFactor
00251             pc.printf("--- Sound Generation ---\n\r");
00252             pc.printf("--- Clacson ---\n\r");
00253             if (myD2 == 1)
00254             {
00255              bGenerate = true; // flag true quando è attiva la generazione di suoni
00256              nSampleSoundIndex =0; //inizializza indice dell'array
00257              fDeltaT = (1.0/fFreq);  // fFreq dipende dal periodo di campionamento e dal fattore di sottocampionamento
00258              SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia generazione
00259             }
00260             else
00261             {
00262              bGenerate = false; // arresta la generazione di suoni
00263             }
00264         }
00265     } // while   
00266     // periodo di campionamento
00267     int nDeltaT;
00268     
00269         
00270     // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
00271     pc.baud(921600); //921600 bps
00272     // messaggio di benvenuto
00273     pc.printf("\r\nHey Bro! Say Goodbye to your Sister !\r\n");
00274     pc.printf("Enter Acquisition Time, DeltaT[sec]= [1 - 9]: \r\n");
00275    // pc.printf("\r\n*** Bluetooth Temp Acquisition ***\r\n");
00276     
00277     // inizializza variabili
00278     bStop=true;
00279     //myRele = 0x00; // spegni il relè
00280     
00281     
00282      
00283     LedAD =0x00 ;
00284     LedAS =0x00 ;
00285     LedPD =0x00 ;
00286     LedPS =0x00 ;
00287     wait(1);
00288     LedAD =0x01 ;
00289     LedAS =0x01 ;
00290     LedPD =0x01 ;
00291     LedPS =0x01 ;
00292     wait(1);
00293     LedAD =0x00 ;
00294     LedAS =0x00 ;
00295     LedPD =0x00 ;
00296     LedPS =0x00 ;
00297     wait(1);
00298     LedAD =0x01;
00299     wait_ms(500);
00300     LedAS =0x01 ;
00301     wait_ms(500);
00302     LedPD =0x01 ;
00303     wait_ms(500);
00304     LedPS =0x01 ;
00305     wait(1);   
00306   // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
00307   pc.baud(921600); //921600 bps
00308   //pc.baud(9600); //256000 bps
00309   pc.printf("*** Test Motor ***\n\r");
00310   
00311   /* Printing to the console. */
00312   pc.printf("STARTING MAIN PROGRAM\r\n");
00313   pc.printf("    Reminder:\r\n");
00314   pc.printf("    The position unit is in agreement to the step mode.\r\n");
00315   pc.printf("    The speed, acceleration or deceleration unit depend on the step mode:\r\n");
00316   pc.printf("    - For normal mode and half step mode, the unit is steps/s or /s^2.\r\n");
00317   pc.printf("    - For microstep modes, the unit is (1/16)steps/s or /s^2.\r\n");
00318     
00319 //----- Initialization 
00320   /* Initializing Motor Control Component. */
00321   motor = new L6208(D2, D8, D7, D4, D5, D6, VREFA_PWM_PIN, VREFB_PWM_PIN);
00322   if (motor->init(&init) != COMPONENT_OK) {
00323     exit(EXIT_FAILURE);
00324   }
00325 
00326   /* Attaching and enabling an interrupt handler. */
00327   motor->attach_flag_irq(&my_flag_irq_handler);
00328   motor->enable_flag_irq();
00329     
00330   /* Attaching an error handler */
00331   motor->attach_error_handler(&my_error_handler);
00332 
00333   /* Printing to the console. */
00334   pc.printf("Motor Control Application Example for 1 Motor\r\n");
00335 
00336 //----- run the motor BACKWARD
00337   pc.printf("--> Running the motor backward.\r\n");
00338   motor->run(StepperMotor::BWD);
00339   
00340   while (motor->get_status()!=STEADY) {
00341     /* Print reached speed to the console in step/s or microsteps/s */
00342     pc.printf("    Reached Speed: %d microstep/s.\r\n", motor->get_speed());
00343     wait_ms(50);    
00344   }
00345   pc.printf("    Reached Speed: %d microstep/s.\r\n", motor->get_speed());
00346      
00347   /* Wait for 1 second */  
00348   wait_ms(1000);
00349   
00350 
00351   
00352 //----- Soft stop required while running
00353   pc.printf("--> Soft stop requested.\r\n");
00354   motor->soft_stop(); 
00355   
00356   
00357 //----- Change step mode to full step mode
00358   motor->set_step_mode(StepperMotor::STEP_MODE_FULL);
00359   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());
00360   
00361   /* Get current position of device and print to the console */
00362   pc.printf("    Position: %d.\r\n", motor->get_position());
00363   
00364   /* Set speed, acceleration and deceleration to scale with normal mode */
00365   motor->set_max_speed(init.maxSpeedSps>>4);
00366   motor->set_acceleration(motor->get_acceleration()>>4);
00367   motor->set_deceleration(motor->get_deceleration()>>4);
00368   /* Print parameters to the console */  
00369   pc.printf("    Motor Max Speed: %d step/s.\r\n", motor->get_max_speed());
00370   pc.printf("    Motor Min Speed: %d step/s.\r\n", motor->get_min_speed());
00371   pc.printf("    Motor Acceleration: %d step/s.\r\n", motor->get_acceleration());
00372   pc.printf("    Motor Deceleration: %d step/s.\r\n", motor->get_deceleration());
00373   
00374 //----- move of 200 steps in the FW direction
00375   pc.printf("--> Moving forward 200 steps.\r\n");
00376   motor->move(StepperMotor::FWD, 200);
00377 int i,a=0;
00378   
00379   while (true) {
00380   
00381   if ( Input == 0 ) 
00382   {
00383      a=a+1;
00384    }
00385    if(a>1)
00386    {
00387     a=0;
00388      
00389    }
00390          
00391      if(a==0)
00392      {
00393         /* Request device to go position -3200 */
00394         motor->go_to(150);
00395         /* Waiting while the motor is active. */
00396        motor->wait_while_active();
00397     }
00398     else 
00399     {
00400         /* Request device to go position -3200 */
00401      motor->go_to(-150);
00402      /* Waiting while the motor is active. */
00403      motor->wait_while_active();
00404   
00405     }
00406     
00407 
00408 }
00409 }
00410 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/