Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of amplificatore_bomboni_rev1 by
Diff: main.cpp
- Revision:
- 0:3106d3fc6696
- Child:
- 1:ffc7a5d0f629
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Jan 23 10:19:50 2018 +0000
@@ -0,0 +1,379 @@
+#include "mbed.h"
+
+AnalogIn in(A0);
+Serial pc(SERIAL_TX, SERIAL_RX);
+
+#if !DEVICE_ANALOGOUT
+#error You cannot use this example as the AnalogOut is not supported on this device.
+#else
+
+AnalogOut OutLocale(PA_4);
+AnalogOut OutCampagna(PA_5);
+#endif
+// numero di campioni che compongono un periodo della sinusoide
+#define SAMPLENUM 360 // consigliabile avere multipli di 180
+// periodo in millisecondi della 83.3 Hz
+#define T833 (1/83.3)
+// periodo in millisecondi della 50 Hz
+#define T50 (1/50.0)
+// periodo in millisecondi del Bridge tra le diverse fasi = 9,6 ms
+#define T96 (0.0096)
+// numero di campioni in 1/4 di periodo
+#define QUARTERSAMPLENUM SAMPLENUM/4
+
+// parametri dell'onda coseno da generare
+#define PI (3.141592653589793238462)
+#define AMPLITUDE 32767 //(1.0) // x * 3.3V
+#define PHASE (PI/2) // 2*pi is one period
+//#define RANGE (1.0) //(0x7FFF)
+#define OFFSET 32767 //(0x7FFF)
+
+// Buffer contenente la sinusoide da porre in output.
+unsigned short usaSine[SAMPLENUM];
+
+//uint16_t usaBuffer[SAMPLENUM];
+
+void CalculateSinewave(void);
+
+
+// Output LED di diagnostica
+DigitalOut led(LED1);
+
+// ticker per la generazione dell'onda
+Ticker SampleTicker;
+
+
+// indice per i cicli
+int nIndex;
+// carattere in arrivo dal PC
+volatile char cReadChar;
+// valore letto dall'ADC
+volatile unsigned short usReadADC;
+
+// Tipo di PSK da generare
+volatile int nPSK;
+// indice, nell'array, del campione da porre in output
+int nSampleIndex;
+// contatore dei campioni inviati
+int nSampleCount;
+// 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;
+// Step attuale e nuovo Step nella generazione di una PSK
+int nStep;
+int nNewStep;
+
+// ritardo tra un campione e l'altro della generazione ADC
+//volatile int nDelay;
+//variabile ausiliaria
+volatile unsigned short usAux;
+// variabili in cui memorizzare i prossimi valori da implementare
+//volatile int nDelayNew;
+// flag per bloccare la generazione del segnale
+volatile bool bStop;
+// frequenza segnale da generare
+volatile double fFreq;
+
+//****************************
+// Create the sinewave buffer
+//****************************
+void CalculateSinewave(int nOffset, int nAmplitude, double fPhase)
+{
+ // variabile contenente l'angolo in radianti
+ double fRads;
+ // indici per i cicli
+ int nIndex;
+ // passo in frequenza fissato dal numero di campioni in cui voglio dividere un periodo di sinusoide: DeltaF = 360°/NUMSAMPLE
+ double fDeltaF;
+ // angolo per il quale bisogna calcolare il valore di sinusoide: fAngle = nIndex*DeltaF
+ double fAngle;
+
+ fDeltaF = 360.0/SAMPLENUM;
+ for (nIndex = 0; nIndex < SAMPLENUM; nIndex++)
+ {
+ fAngle = nIndex*fDeltaF; // angolo per il quale bisogna calcolare il campione di sinusoide
+ fRads = (PI * fAngle)/180.0; // Convert degree in radian
+ //usaSine[nIndex] = AMPLITUDE * cos(fRads + PHASE) + OFFSET;
+ usaSine[nIndex] = nAmplitude * cos(fRads + fPhase) + nOffset;
+ }
+}
+
+
+//***************************
+// generazione sample da DAC
+//***************************
+void SampleOut()
+{
+
+ // se è stato inviato il comando Stop, non fare niente fino a nuovo comando
+ if(bStop)
+ {
+ }
+ else // se non è stato inviato il comando di bStop continua
+ {
+ // output del campione della forma d'onda
+ //usAux=(usaSine[nSampleIndex])/fAmp;
+ //usAux=usaSine[nSampleIndex];
+ OutLocale.write_u16(usaSine[nSampleIndex]);
+ OutCampagna.write_u16(usaSine[nSampleIndex]);
+
+ // incrementa l'indice del campione in output, modulo NUMSAMPLE: se NUMSAMPLE è 360, nSAmpleIndex va da 0 a 359
+ nSampleIndex++;
+ if(nSampleIndex >= SAMPLENUM)
+ {
+ nSampleIndex=0;
+ }
+ // incrementa il numero di campioni inviati, e individua la fase in cui ci si trova, relativamente alla modulazione PSK selezionata
+ nSampleCount++;
+ //pc.printf(" nSampleIndex= %3d ; nSampleCount= %5d ; nPSK = % 1d ; nNewStep = %1d \n\r",nSampleIndex, nSampleCount, nPSK, nNewStep);
+
+ switch(nPSK)
+ {
+ case 1:
+ {
+ switch(nSampleCount)
+ {
+ case 0: //if(nSampleCount == 0) // dopo il ciclo completo, si ritorna allo step 1
+ {
+ nNewStep = 1; // genera 23 periodi di sinusoide
+ //pc.printf(" nStep = %1d \n\r",nNewStep);
+ } break;
+ case (23*SAMPLENUM): //if(nSampleCount == (23*SAMPLENUM)) // dopo 23 periodi a 83.3 Hz, passa allo step 2 in cui genera il primo Bridge
+ {
+ nNewStep = 2; // genera Bridge
+ //pc.printf(" nStep = %1d \n\r",nNewStep);
+ } break;
+ case (24.25*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, e un Bridge genera 15 sinusoidi a 83.3 Hz
+ {
+ nNewStep = 3; // genera 15 periodi di sinusoide
+ //pc.printf(" nStep = %1d \n\r",nNewStep);
+ }
+ case (39.25*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge e 15 periodi a 83.3 Hz, genera un bridge
+ {
+ nNewStep = 4; // Genera Bridge
+ //pc.printf(" nStep = %1d \n\r",nNewStep);
+ } break;
+ case (40.5*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge, genera 7 periodi a 83.3Hz
+ {
+ nNewStep = 5; // genera 7 periodi di sinusoide
+ //pc.printf(" nStep = %1d \n\r",nNewStep);
+ } break;
+ case (47.5*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, genera bridge
+ {
+ nNewStep = 6; // Genera Bridge
+ //pc.printf(" nStep = %1d \n\r",nNewStep);
+ } break;
+ case (48.75*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, genera 7 periodi a 83.3Hz
+ {
+ nNewStep = 7; // genera 7 periodi di sinusoide
+ //pc.printf(" nStep = %1d \n\r",nNewStep);
+ } break;
+ case (55.75*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, 7 periodi a 83.3Hz, genera bridge
+ {
+ nNewStep =8; // genera bridge
+ //pc.printf(" nStep = %1d \n\r",nNewStep);
+ } break;
+ case (57*SAMPLENUM): //if(nSampleCount == ((23*SAMPLENUM)+(1.25*SAMPLENUM)+(15*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM)+(7*SAMPLENUM)+(1.25*SAMPLENUM))) // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, 7 periodi a 83.3Hz, bridge, ritorna a generare 23 periodi a 83.3Hz
+ {
+ nNewStep =1;
+ nSampleCount =0;
+ //pc.printf(" nStep = %1d \n\r",nNewStep);
+ } break;
+ default: {} break;
+ }
+ } break;
+ default: break;
+ }
+
+ //led = !led;
+ }
+}
+
+
+
+
+ //*******************
+ // Loop Principale
+ //*******************
+int main()
+{
+ // configura velocità della comunicazione seriale su USB-VirtualCom e invia messaggio di benvenuto
+ pc.baud(921600); //921600 bps
+ pc.printf("*** SineWave Generation ***\n\r");
+
+ //inizializza variabili
+ fAmp = 1.0;
+ cReadChar = 0;
+ nSampleIndex=0;
+ nSampleCount=0;
+ nPSK =0;
+ bStop= false;
+ fFreq = 83.3;
+
+ // genera sinusoide
+ CalculateSinewave(32767, 32767, (PI/2.0));
+
+ // avvia il ciclo di generazione sinusoide
+ while(true)
+ {
+
+ // verifica se è arrivato un carattere dalla seriale del PC
+ if(pc.readable())
+ {
+ cReadChar = pc.getc(); // Read hyperterminal
+ bStop = false; // è stato inviato un comando, quindi resetta il flag di Stop: bStop = False
+
+ if(cReadChar == '1') // genera sinusoide a 83.3Hz con ampiezza ridotta a metà della nominale
+ {
+ pc.printf("--- Selezionato PSK-I ---\n\r");
+ bStop = false; // è stato inviato un comando, quindi bStop = False
+ nPSK = 1;
+ fAmp = 1.0;
+ nSampleIndex=0;
+ nSampleCount=0;
+ nStep = 0; // inizializza lo step che sarà aggiornato nella routine di generazione campione
+ //fAmpNew = 1.0;
+ //fDeltaT= T833/SAMPLENUM; // frequenza di generazione iniziale
+ }
+ if (cReadChar == 'a') // genera sinusoide a 83.3Hz con ampiezza nominale
+ {
+ fFreq = 83.3;
+ pc.printf("--- Generazione %.1f Hz ampiezza nominale ---\n\r", fFreq);
+ bStop = false; // è stato inviato un comando, quindi bStop = False
+ nPSK = 0; // nessuna PSK da generare
+ fAmp = 1.0;
+ fDeltaT = 1.0/(fFreq*SAMPLENUM);
+ SampleTicker.attach(&SampleOut,fDeltaT);
+ }
+ if (cReadChar == 'b') // genera sinusoide a 50 Hz con ampiezza ridotta a metà della nominale
+ {
+ fFreq = 50.0;
+ pc.printf("--- Generazione %.1f Hz ampiezza 1/2 della nominale ---\n\r", fFreq);
+ nPSK = 0; // nessuna PSK da generare
+ fAmp = 1.0;
+ // genera sinusoide
+ CalculateSinewave(32767, (32767/2), (PI/2.0));
+ // attach ticker
+ fDeltaT = 1.0/(fFreq*SAMPLENUM);
+ SampleTicker.attach(&SampleOut,fDeltaT);
+ }
+ if (cReadChar == 'c') // genera sinusoide a 45 Hz con ampiezza ridotta a 1/4 del valore nominale
+ {
+ fFreq = 45.0;
+ pc.printf("--- Generazione %.1f Hz ampiezza 1/4 della nominale ---\n\r", fFreq);
+ nPSK = 0; // nessuna PSK da generare
+ fAmp = 1.0;
+ // genera sinusoide
+ CalculateSinewave(32767, (32767/4), (PI/2.0));
+ // attach ticker
+ fDeltaT = 1.0/(fFreq*SAMPLENUM);
+ SampleTicker.attach(&SampleOut,fDeltaT);
+ }
+
+ if (cReadChar == 'z') // Stop
+ {
+ pc.printf("--- Stop Generazione ---\n\r");
+ bStop=true;
+ }
+ led.write(1);
+ } // if (pc.readable())
+
+
+ // In base alla PSK selezionata, ci saranno diversi step da seguire
+ switch (nPSK)
+ {
+ case 1: // PSK-I
+ {
+ // Avvia il primo step della PSK selezionata. Nello Step 0 non si ritornerà più
+ if(nStep == 0)
+ {
+ pc.printf("*** Avvio generazione ***\n\r");
+ nNewStep = 1;
+ }
+ // se è stato raggiunto il numero di campioni per la variazione di Step, aggiorna il numero di Step e modifica i parametri di generazione
+ if(nStep != nNewStep)
+ {
+ // aggiorna il numero di Step e modifica i parametri di generazione
+ nStep = nNewStep;
+ switch (nStep)
+ {
+ case 1:
+ {
+ // genera 23 periodi a 83.3 Hz
+ //+++pc.printf("+++ 23 sinusoidi a 83,3Hz +++\n\r");
+ fDeltaT = double((double)T833/(double)SAMPLENUM);
+ SampleTicker.attach(&SampleOut,fDeltaT);
+ } break;
+ case 2:
+ {
+ // dopo 23 periodi a 83.3 Hz, genera il primo Bridge
+ //+++pc.printf("+++ Primo Bridge +++\n\r");
+ fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
+ SampleTicker.attach(&SampleOut,fDeltaT);
+ } break;
+ case 3:
+ {
+ // dopo 23 periodi a 83.3 Hz, e un Bridge genera 15 sinusoidi a 83.3 Hz
+ //+++pc.printf("+++ 15 sinusoidi a 83,3Hz +++\n\r");
+ fDeltaT = double((double)T833/(double)SAMPLENUM);
+ SampleTicker.attach(&SampleOut, fDeltaT);
+ } break;
+ case 4:
+ {
+ // dopo 23 periodi a 83.3 Hz, Bridge e 15 periodi a 83.3 Hz, genera un bridge
+ //+++pc.printf("+++ Secondo Bridge +++\n\r");
+ fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
+ SampleTicker.attach(&SampleOut, fDeltaT);
+ } break;
+ case 5:
+ {
+ // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge, genera 7 periodi a 83.3Hz
+ //+++pc.printf("+++ 7 Sinusoidi a 83.3Hz +++\n\r");
+ fDeltaT = double((double)T833/(double)SAMPLENUM);
+ SampleTicker.attach(&SampleOut, fDeltaT);
+ } break;
+ case 6:
+ {
+ // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, genera bridge
+ //+++pc.printf("+++ Terzo Bridge +++\n\r");
+ fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
+ SampleTicker.attach(&SampleOut, fDeltaT);
+ } break;
+ case 7:
+ {
+ // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, genera 7 periodi a 83.3Hz
+ //+++pc.printf("+++ 7 sinusoidi a 83.3Hz +++\n\r");
+ fDeltaT = double((double)T833/(double)SAMPLENUM);
+ SampleTicker.attach(&SampleOut, fDeltaT);
+ } break;
+ case 8:
+ {
+ // dopo 23 periodi a 83.3 Hz, Bridge, 15 periodi a 83.3 Hz, bridge,7 periodi a 83.3Hz, bridge, 7 periodi a 83.3Hz, genera bridge
+ //+++pc.printf("+++ Quarto Bridge +++\n\r");
+ fDeltaT = (double)((double)T96/(double)(SAMPLENUM));
+ SampleTicker.attach(&SampleOut, fDeltaT);
+ } break;
+ default: break;
+ } //switch (nStep)
+ } // if(nStep != nNewStep)
+ } break; //case 1:
+ default: {} break;
+ } //switch (nPSK)
+ } // while(true)
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
