ESP32 frequenzimetro prova con Task

Ciao,
sto tentando la misura di frequenza col sistema Task, anche se non ho studiato molto, volevo solo chiedere se il programma può andare o sbaglio qualcosa coi tempi, perchè ho il generatore di segnale che mi esce a 1300 KHz, ma in seriale leggo poco meno di 900 Khz.
Dovrei arrivare al max a 2 MHz

TaskHandle_t Task2;

#define freq_in   2             // pin ingresso segnale interrupt

volatile int imp = 0;           // per interrupt

uint32_t t_misura = 0;          // tempo lettura ingresso impulsi (micros)
uint32_t t_ser = 0;             // tempo scrittura in seriale (millis)

uint16_t freq = 0;              // freq letta in KHz (2 byte)

void setup()
{
  Serial.begin(9600);

  Serial.println();
  Serial.println("lettura frequenza");  // scrivo in seriale
  Serial.println();

  pinMode(freq_in, INPUT);

  delay (500);

  attachInterrupt(digitalPinToInterrupt (freq_in), isr_freq, FALLING);

  xTaskCreatePinnedToCore(
    Task2code,   // Task function.
    "Task2",     // name of task.
    10000,       // Stack size of task
    NULL,        // parameter of the task
    2,           // priority of the task
    &Task2,      // Task handle to keep track of created task
    1);          // pin task to core 1

  delay (500);
}

void Task2code( void * pvParameters )
{
  while (1)
  {
    if (micros() - t_misura >= 1000)      // ogni ms
    {
      vTaskDelay(1);
      freq = imp;                         // se valore 1000 = 1 MHz
      imp = 0;                            // azzero variabile
      t_misura = micros();                // azzero tempo di misura
    }
  }
}

void loop()
{
  if (millis() - t_ser >= 100)            // ogni ms
  {
    Serial.println(freq);                 // scrivo in seriale la frequenza in KHz
    t_ser = millis();
  }

} //OOOOOOOO FINE LOOP OOOOOOOO

//**************************************************************
void isr_freq()   // funz che viene chiamata dall'interrupt
{
  imp++;          // incrementa di 1
}
//**************************************************************

Grazie :slight_smile:

L'ESP32 deve fare altre cose per cui è necessario usarla? Altrimenti con una semplice Uno o Nano (montandoci un quarzo vero) arrivi a misurare 7,9MHz...

Ciao,
non deve fare particolari cose, solo inviare istruzioni a un modulo I2C, ma roba leggera, il motivo per cui volevo usare ESP era perchè tutto mi lavora a 3,3V e con arduino dovrei usare shift level etc

... basta scegliere la giusta scheda Arduino ... tutta la serie MKR lavora a 3.3V.

Guglielmo

Vero, domani guardo che shield ci sono, perché mi servirebbe qualcosa di piccolo... Altrimenti potrei usare anche atmega328 e farlo lavorare a 3.3 anche se max 8 MHz...
Preferivo una shield, il processore diventa difficile da saldare etc

Buongiorno,
ho visto la serie MKR ma per il mio utilizzo sono troppo grandi (intendo la shield), le uniche cose utilizzabili per me sono o il processore ATMEGA328 standar PDIP, oppure arduino nano mini, come questo
Datman, se dovessi alimentarli a 3.3 quindi max frequenza 8 MHz, andrebbe bene lo stesso per la lettura della frequenza? O è necessario clock a 16 MHz?
In tal caso devo per forza alimentare a 5V e usare shift level per tutti gli altri utilizzi

Grazie :slight_smile:

Con il clock a 8MHz leggerai fino a qualcosa meno di 4MHz. Comunque, se vuoi letture precise, deve avere un quarzo (vero!) esterno.

Io massimo massimo devo leggere 2 Mhz, quindi ci potrei stare...
Stavo guardando arduino nano mini, non riesco a capire se è un quarzo o un risuonatore ceramico, nel caso fosse un risuonatore potrebbe andare bene? Altrimenti sarà difficile per le dimensioni cambiare il quarzo alla shield... Mi rimane di usare ATMEGA328 PDIP montando un quarzo esterno.

Perdonatemi, mi sono incartato,
è proprio il risuonatore a non essere preciso, quindi mi sono già risposto da solo :slight_smile:

Dipende dalla accuratezza e dalla stabilità che cerchi. Puoi fare una taratura software per leggere il valore corretto, ma devi verificare che la stabilità al variare della temperatura sia sufficiente. Altrimenti devi fare un po' di acrobazie con un saldatore a punta finissima e montarci un quarzo e due condensatori ceramici.

Eh sì, concordo, ma le dimensioni sono simili, e lavoro meglio col PDIP, prenderò quelli e faccio qualche prova...
Vedo cosa accade col programma che hai fatto tu :slightly_smiling_face:
Grazie

@thedrifter: ... se hai problemi di spazio, hai preso in considerazione la serie XIAO (che lavora a 3.3v) e che esiste in moltissime versioni diverse?

Sono dei gran belli oggettini ...

Guglielmo

Concordo, le ho provate un po' tutte (SAMD41, nRF52840, ESP32C3 e ESP32S3).
Però se non ricordo male @thedrifter sta usando un ESP32-C3 Super mini che ha più o meno lo stesso fattore di forma (infatti non capisco perché voglia provare altre MCU).

Mai usata la serie XIAO, posso provare anche per altri utilizzi, grazie Guglielmo :slight_smile:
Cotestatnt stavo utilizzando ESP32 per il discorso 3.3 ma ho problemi di lettura della frequenza (c'è già un'altro post mio in merito)
Quindi Datman mi aveva consigliato di usare arduino perchè aveva già fatto un frequenzimetro che legge fino a circa 7 MHz... Se riesco a far funzionare esp32 posso tranquillamente restare su di lei, questo post era nato per capire se avevo fatto giusto il programma in Task, ma ho problemi di lettura, mi fermo a circa 900 KHz...

... considera che tra gli XIAO hai varie MCU, inclusi i SAMD21 ... tutto a 3.3V ... :wink:

Guglielmo

Nel mio programma la frequenza diretta è f_freq. Togli tutto ciò che riguarda i display e il calcolo per il prescaler (64), la frequenza intermedia (10695) e la visualizzazione a passi di 5kHz.

Se posso provare qualche soluzione con ESP, accetto consigli, altrimenti ordino gli ATMEGA328 PDIP e provo con quelli :slight_smile:

Rieccomi dopo qualche prova :slight_smile:
In attesa del 328 PDIP, ho provato comunque con arduino nano mini (foto qualche post precedente) a fare la lettura di frequenza (di serie è montato un risuonatore), direi che tutto funziona, volevo chiedere a @Datman per quanto riguarda il pin ingresso frequenza, perchè non pensando all'ingresso PD5 mi sono collegato al pin D2, la frequenza veniva letta correttamente, successivamente ho impostato il pin D5 (che corrisponde alla porta PD5) e continuo a leggere la frequenza correttamente... Come mai ciò?
Preciso che sto utilizzando arduino nano mini, non ho trovato schemi specifici in merito, ho seguito lo schema dell'arduino nano (in effetti il processore è sempre ATMEGA328).

Altra domanda, la lettura della frequenza è precisa, tranne qualche picco sporadico con 1% di errore; è il risuonatore che causa questa imprecisione? Attendo il 328 PDIP per fare la stessa prova con quarzo esterno :slight_smile:

Grazie

Ma dove lo hai preso? Non lo trovo in giro ...

Guglielmo

Lo vidi su aliexpress, mi attirò per le dimensioni, questo il link.
Oltre i soliti led di alimentazione, tx, rx e uno che non so ancora dov'è collegato, ha 3 led RGB indirizzati collegati a D2; ma non ho trovato documentazione...