quello che devo fare e andare a generare un onda quadra, ad esempio uscente dal pin 5 con la funzione TONE, poi quest'onda andrà in altri dispositivi e poi rientrerà sempre nella stesso Arduino, ad esempio nel pin 5. Quello che devo fare è CONFRONTARE L'ONDA IN USCITA E QUELLA IN INGRESSO E VERIFICARE CHE "COINCIDANO".
Per simulare il tutto per ora invio dal pin 4 e ricevo direttamente sul 5 senza andare negli altri dispositivi, come detto sopra.
Il codice è quello che inserisco di seguito. L'ultima funzione abilitata da Check_Wave deve essere completata, ma per la domanda che devo porre non è importante.
Ho usato la funzione Tone per generare l'onda quadra e la PulseInLong per rilevare i fronti sia positivo che negativo.
Le freq che interessano a me sono F1=115200 Hz e F2 = 1 MHz.
Allora fino alla freq di 50 kHz riesco ad ottenere dei valori diciamo accettabili ma oltre i 70 kHz mi escono dei valori assolutamente sballati.
Capisco che all'aumentare della freq la PulseIn/PulseInLong sarà sempre più messa sotto stress dato il periodo sempre più piccolo in cui si dovrà abilitare e disabilitare.
Ma essendo che io devo fare la misura che vi ho detto sopra come potrei fare ?
Questi valori sballati che mi escono da circa quella freq in poi è corretto dire che è un limite dell'arduino ?
Grazie
- Codice: Seleziona tutto
float Periodo = 1;
unsigned long Periodo_Arrotondato;
unsigned long Mezzo_periodo_Pos;
unsigned long Mezzo_periodo_Neg;
unsigned long Periodo_Completo;
unsigned long Freq = 1000000;
bool Stamp = true;
bool Load_Array = true;
bool Check_Array_Min = false;
bool Check_Array_Max = false;
bool Check_Wave = false;
int Array_Dimension = 40;
int Valori[40]; // Parte da zero quindi sono 20 elementi
int i = 1;
int Estremo_Inferiore;
int Estremo_Superiore = NULL;
void setup() {
pinMode(5, INPUT);
pinMode(4, OUTPUT);
Serial.begin(9600);
Periodo = (Periodo/Freq) * 1000000;
Serial.println(Periodo,8);
/* Se faccio diventare il float 8.68 in int lui me lo approssima per difetto a 8. */
//Periodo_1 = Periodo;
//Serial.println(Periodo_1);
/* Allora uso la funzione ceil che me lo approssima al primo valore mafggiore dispoonibile quindi 9, in questo caso essendo che i valori di pulse che ricevo sono
* 8 e 10 verifico che il mio periodo sia all'interno di questo intervallo
*/
Periodo_Arrotondato = ceil(Periodo);
//Serial.println(Periodo_1);
}
void loop() {
if(Load_Array) {
tone(4, Freq);
delay(100);
Mezzo_periodo_Pos = pulseInLong(5, HIGH);
Mezzo_periodo_Neg = pulseInLong(5, LOW);
Periodo_Completo = Mezzo_periodo_Pos + Mezzo_periodo_Neg;
Serial.print("Periodo Completo = ");
Serial.println(Periodo_Completo);
// Serial.print("Mezzo Periodo Positivo = ");
// Serial.println(Mezzo_periodo_Pos);
//
// Serial.print("Mezzo Periodo Negativo = ");
// Serial.println(Mezzo_periodo_Neg);
if(i < (Array_Dimension + 1)) {
Valori[i] = Periodo_Completo;
delay(100);
Serial.print("Valare nell'array = ");
Serial.println(Valori[i]);
Serial.print("Valare di i = ");
Serial.println(i);
if(i == Array_Dimension & Stamp) {
Serial.println("Caricamento completato");
// Serial.println(Valori[5]);
// Serial.println(Valori[6]);
// Serial.println(Valori[12]);
// Serial.println(Valori[15]);
// Serial.println(Valori[19]);
Load_Array = false;
Check_Array_Min = true;
Check_Array_Max = false;
Check_Wave = false;
Stamp = false;
}
i ++ ;
}
}
if(Check_Array_Min) {
//noTone(4);
int j;
for(j = 1; j < Array_Dimension + 1; j++) {
if(Estremo_Inferiore > Valori[j]) {
Estremo_Inferiore = Valori[j];
}
else {
// Solamente per la prima volta
if(j == 1) {
Estremo_Inferiore = Valori[j];
}
}
Stamp = true;
}
if(j == (Array_Dimension + 1) & Stamp) {
Serial.print("Estremo inferiore = ");
Serial.println(Estremo_Inferiore);
Load_Array = false;
Check_Array_Min = false;
Check_Array_Max = true;
Check_Wave = false;
Stamp = false;
}
}
if(Check_Array_Max) {
int j;
for(j = 1; j < Array_Dimension + 1; j++) {
if(Estremo_Superiore < Valori[j]) {
Estremo_Superiore = Valori[j];
}
else { }
Stamp = true;
}
if(j == (Array_Dimension + 1) & Stamp) {
Serial.print("Estremo superiore = ");
Serial.println(Estremo_Superiore);
Load_Array = false;
Check_Array_Min = false;
Check_Array_Max = false;
Check_Wave = true;
Stamp = false;
}
}
if(Check_Wave) {
if(Estremo_Inferiore != Estremo_Superiore) {
if(Periodo_Arrotondato > Estremo_Inferiore && Periodo_Arrotondato < Estremo_Superiore) {
Stamp = true;
if(Stamp) {
Serial.println("ONDA QUADRA CORRETTA");
Load_Array = false;
Check_Array_Min = false;
Check_Array_Max = false;
Check_Wave = false;
Stamp = false;
}
}
else {
if(Stamp) {
//Serial.println("VERIFICARE L'ONDA QUADRA INVIATA");
Stamp = false;
}
}
}
else {
}
}
}

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



