Lorenzo Ruscitti Inserito: 24 aprile 2020 Segnala Inserito: 24 aprile 2020 Ciao a tutti 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 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 { } } }
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora