motore cofano
Dependencies: mbed X-NUCLEO-IHM05A1
Diff: Exercise_IHM05A1.cpp
- Revision:
- 11:196c4677e0ca
- Parent:
- 10:2622d1ab5984
--- a/Exercise_IHM05A1.cpp Sat Nov 17 14:19:06 2018 +0000
+++ b/Exercise_IHM05A1.cpp Mon Nov 19 11:45:23 2018 +0000
@@ -43,10 +43,20 @@
/* Component specific header files. */
#include "L6208.h"
-
+#include "SampledSound.h"
+#include "Clacson.h"
DigitalIn myButton(USER_BUTTON);
DigitalIn Input (PC_0);
-
+AnalogIn InWave(PA_0);
+Serial pc(USBTX, USBRX);
+//DigitalOut myRele(PC_3);
+DigitalOut LedAD (PC_2) ;//bianche telecamere
+DigitalOut LedAS (PC_3) ;//bianche telecamere
+DigitalOut LedPD (PC_10) ;//rosse
+DigitalOut LedPS (PC_12) ;//rosse
+AnalogOut OutWave(PA_4); // pin di output per la forma d'onda analogica
+DigitalOut myD2(PA_10);//pin di output proveniente dal raspberry
+DigitalOut led2(LED2); // LED su scheda
/* Definitions ---------------------------------------------------------------*/
#ifdef TARGET_NUCLEO_F334R8
#define VREFA_PWM_PIN D11
@@ -58,8 +68,99 @@
#define VREFA_PWM_PIN D3
#define VREFB_PWM_PIN D9
#endif
+#define NUMSAMPLE 300
+// ticker per la generazione dell'onda con DAC
+Ticker SampleOutTicker;
-Serial pc(SERIAL_TX, SERIAL_RX);
+void my_error_handler(uint16_t error)
+{
+ /* Printing to the console. */
+ pc.printf("Error %d detected\r\n\n", error);
+
+ /* Infinite loop */
+ while (true) {
+ }
+}
+
+
+
+// ticker per l'acquisizione dell'onda con ADC
+Ticker SamplingTicker;
+
+// carattere in arrivo dal PC ed equivalente numerico
+volatile char cReadChar;
+volatile int nReadChar;
+
+// flag che diventa true quando si vuole fermare l'acquisizione
+volatile bool bStop;
+
+// valore letto dall'ADC e corrispondente in tensione
+volatile unsigned short usReadADCLux;
+volatile float fReadVoltage;
+
+// valore di temperatura letto dall'ADC
+volatile float fLux;
+
+// prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
+void CalculateSinewave(void);
+// funzione di generazione suono della frequenza e ampiezza selezionate
+void SoundGenerate(double fFrequency);
+
+// carattere in arrivo dal PC
+
+volatile char CReadMusic;
+
+uint32_t nProva;
+
+// indice nell'array dei campioni da porre in output da DAC per Marimba
+volatile uint32_t nSampleSoundIndex;
+
+// Periodo di generazione campioni in output DeltaT = T/NumSample
+double fDeltaT;
+// amplificazione per il dato da spedire sull'ADC
+volatile double fAmp;
+//volatile double fAmpNew;
+// flag per bloccare la generazione del segnale
+volatile int bGenerate = false;
+
+// frequenza segnale da generare
+volatile double fFreq;
+//flag che diventa true se bisogna fermare la generazione di suoni
+
+// periodo della sinusoide da generare
+double fPeriod;
+// tipo di suono da generare: 0=Sine, 1= Square
+char cSoundWave;
+
+// nota corrispondente al tasto premuto
+volatile char cKeyToPlay= '\0';
+
+
+//**********************************************************************
+// generazione suoni con i sample da file di campioni in SoundSample.h
+//**********************************************************************
+void SampleOut()
+{
+
+ // genera campioni fino al raggiungimento del numero di campioni nel file Sound.h
+ if((nSampleSoundIndex < nSampleNum) && (bGenerate == true))
+ {
+ // mette in output un campione della forma d'onda moltiplicato per l'amplificazione fAmp
+ OutWave.write_u16(naInputSoundWave[nSampleSoundIndex]*fAmp);
+ // incrementa l'indice del campione in output, nSampleNum è il numero dei campioni nle file Sound.h
+ nSampleSoundIndex++;
+ }
+ else
+ {
+ // se è stato generato il numero di campioni del file oppure bGenerate = false, ferma la generazione di suoni
+ bGenerate = false;
+ }
+}
+
+// prototipo di funzione che genera i campioni della sinusoide da utilizzare per la generazione tramite DAC
+void CalculateSinewave(void);
+// funzione di generazione suono della frequenza e ampiezza selezionate
+void SoundGenerate(double fFrequency);
/* Variables -----------------------------------------------------------------*/
@@ -110,20 +211,98 @@
* @note If needed, implement it, and then attach it:
* + motor->attach_error_handler(&my_error_handler);
*/
-void my_error_handler(uint16_t error)
-{
- /* Printing to the console. */
- pc.printf("Error %d detected\r\n\n", error);
-
- /* Infinite loop */
- while (true) {
- }
-}
/* Main ----------------------------------------------------------------------*/
int main()
{
+ //inizializza variabili
+ bGenerate= false;
+ bStop= true;
+ cReadChar= 0;
+ //nSampleOutIndex= 0;
+ //nSampleOutCount= 0;
+ nSampleSoundIndex= 0;
+
+ //imposta il funzionamento del pulsante come "PullDown": Aperto = '0'. L'altra modalità di funzionamento è PullUp
+ myButton.mode(PullUp);
+
+ // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
+ pc.baud(921600); //921600 bps
+
+ // test dei LED
+ led2=1; // Blu
+ wait_ms(500);
+ led2=0;
+
+ pc.printf("\r\nHallo Amaldi Students - Exercise 12 \r\n");
+ pc.printf("\n\r*** Sampled Sound Generator ***\n\r");
+
+ // fissa l'amplificazione da 0 a 1
+ fAmp = 1.0;
+
+ // attende la pressione di tasti sulla marimba
+ while(true)
+ {
+ if(myButton == 0)
+ {
+ while(myButton != 1){}; // attendi che il tasto sia rilasciato
+ fFreq=nSamplePerSec/nUnderSampleFactor;// campioni per secondo da generare = nSamplePerSec/nUnderSampleFactor
+ pc.printf("--- Sound Generation ---\n\r");
+ pc.printf("--- Clacson ---\n\r");
+ if (myD2 == 1)
+ {
+ bGenerate = true; // flag true quando è attiva la generazione di suoni
+ nSampleSoundIndex =0; //inizializza indice dell'array
+ fDeltaT = (1.0/fFreq); // fFreq dipende dal periodo di campionamento e dal fattore di sottocampionamento
+ SampleOutTicker.attach(&SampleOut,fDeltaT); // avvia generazione
+ }
+ else
+ {
+ bGenerate = false; // arresta la generazione di suoni
+ }
+ }
+ } // while
+ // periodo di campionamento
+ int nDeltaT;
+
+
+ // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
+ pc.baud(921600); //921600 bps
+ // messaggio di benvenuto
+ pc.printf("\r\nHey Bro! Say Goodbye to your Sister !\r\n");
+ pc.printf("Enter Acquisition Time, DeltaT[sec]= [1 - 9]: \r\n");
+ // pc.printf("\r\n*** Bluetooth Temp Acquisition ***\r\n");
+
+ // inizializza variabili
+ bStop=true;
+ //myRele = 0x00; // spegni il relè
+
+
+
+ LedAD =0x00 ;
+ LedAS =0x00 ;
+ LedPD =0x00 ;
+ LedPS =0x00 ;
+ wait(1);
+ LedAD =0x01 ;
+ LedAS =0x01 ;
+ LedPD =0x01 ;
+ LedPS =0x01 ;
+ wait(1);
+ LedAD =0x00 ;
+ LedAS =0x00 ;
+ LedPD =0x00 ;
+ LedPS =0x00 ;
+ wait(1);
+ LedAD =0x01;
+ wait_ms(500);
+ LedAS =0x01 ;
+ wait_ms(500);
+ LedPD =0x01 ;
+ wait_ms(500);
+ LedPS =0x01 ;
+ wait(1);
// configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
pc.baud(921600); //921600 bps
//pc.baud(9600); //256000 bps