Fréquencemètre

Bonjour à toutes et à tous,
Je bloque ...

Je suis sur un projet d'un fréquencemètre.
Comprenant le code, je bloque sur la structuration de celui ci. Ci joint le code qui à la base ne vient de moi mais d'un radio amateur pour ses besoins perso.

/*
//////////////// Fréquencemètre///////////////////

  • Utilise le prédiviseur MB506 FUJITSU
  • Les limites de la fréquence d'entrée Arduino et le division par 64
  • autorisent un comptage jusqu'à environ 600 Mhz pour cette version.
  • Pour mesurer une fréquence supérieure, le facteur de division sera
  • de 128 ou 256 (Cf Datasheet).
  • la ligne " unsigned long count = FreqCount.read() * 0.64001422;"
  • sera modifiée en conséquence: 1.28 ou 2.56
  • La valeur 001422 ci-dessus est une valeur d'ajustement.
  • Mon site : http://f5mna.free.fr
  • Entrée comptage PIN 5 dig.
    */
    // comentarii in romaneste de Nicu FLORICA aka niq_ro

#include <FreqCount.h> // foloseste libraria dedicata pentru a masura frecventa
#include <LiquidCrystal.h> // foloseste libraria dedicata pentru afisaj LCD gen 1602

LiquidCrystal lcd(7, 6, 4, 3, 2, 1); // indica modul de conectare al pinior afisajului la placa Arduino
// LiquidCrystal lcd(RS, E, D4, D5, D6, D7); //se definesc pinii utilizati la afisajul LCD
unsigned long count0, count1, count2, count3, count4, count5; // se definesc variabile de lungime mare de la 0 la 4.294.967.295 (2^32-1)

void setup() {
lcd.begin(16, 2); // definire LCD ca 16x2
lcd.setCursor(0, 0); // pozitionare cursor in colt stanga sus
lcd.print (" FREQUENCEMETRE "); // scrie textul
lcd.setCursor(0, 1); // muta cursorul in colj stanga jos
lcd.print ("VOODOO V 1"); // scrie alt text
delay(2000); // asteapta 2 secunde (2000ms)
lcd.clear (); // sterge ecranul
lcd.setCursor(3, 0); // muta cursorul pe colaone 3 de pe randul 0 (randul de sus)
lcd.print("Frequence"); // scrie frecventa
FreqCount.begin(1000); // citeste frecventa timp de 1 secunda (1000ms)

}

void loop() { // aici incepe progrsmul care ruleaza in blucla infinita
if (FreqCount.available()) // daca la intrare este semnal
{
unsigned long count = FreqCount.read() * 0.01; // valoare citita la pinul 5 este inmultita cu 0,64. deoarece a fost divizata anterior cu 64

// ATENTIE: face asta deoarece nu-i ajung numarul de cifre.. deci "count" e valoarea frecventei impartita la 100

//unsigned long count = FreqCount.read() * 1.28; // GHz // daca divizarea ar fi cu 128
// era asa: if (count < 10000) { (count = 0);} // signaux parasites ! / daca valaorea citita e mai mica de 10000x100=1MHz, insemna ca e zgomot si considera frecventa zero
// eu zic, deoare nu ar masura sub 1MHz
if (count < 1) { (count = 0);} // signaux parasites ! / daca valaorea citita e mai mica de 100x100=10000Hz=10kHz, insemna ca e zgomot si considera frecventa zero

/* Calcul du facteur de division.(1.0000222 ci-dessus)
Le quartz de 16 Mhz pilotant Arduino n'est pas précis ni identique pour toutes les platines.
Une correction peut être nécessaire au niveau logiciel. Pour ce faire,
mesurer la fréquence avec un fréquencemetre étalonné.
Puis faire le rapport entre féquence étalon mesurée et fréquence mesurée avec
ce fréquencemetre. Exemple 145000200/145000000 = 1.0000014
Multiplier le facteur de division (exemple 64) par cette valeur
vous obtenez 64.000088. Le facteur de correction devient 0.64000088
donc (count = count * 0.64000088)
*/

/*
// Affichage GHz si nécessaire
/////////////////////////////

// e asa ca nu e bine gandit..

if (count > 999999999) {
count1= (count/100000);
count2 = (count - (count1100000));
count3 = (count2/10);
count4 = ((count2) - count3
10 );
}
*/

// Mhz
///////////////////
// original: if ((count > 999999) and (count < 1000000000)) (count1 = (count /10000));
// eu zic ca:
if ((count > 9999) and (count < 10000000)) (count1 = (count /10000));
{
count1 = (count /10000); // afla partea intreaga a milioanelor, care reprezinta si numarul milioanelor din numar
count2 = (count - (count110000)); // afla valoarea numarului de la mii in jos
count3 = (count2/10); // afla cifrele de mii
count4 = ((count2) - count3
10 ); // afla valoarea ultimei cifre din variabila "count", care reprezinta cifra sutelor din frecventa masurata
}

// < 1 MHz
////////////////////
// nu prea trebuie asta ca e acelasi lucru ca mai sus... deoarece count1=0
// original: if (count < 1000000)
// eu zic asa:
if (count < 10000) // faca frecventa citita e mai mica decat 1MHz (deci valoarea lui "count" < 10000
{
count2 = (count - (count11000)); // valoarea numarului de la mii in jos
count3 = (count2/10); // afla cifrele de la mii
count4 = ((count2) - count3
10 ); // afla valoarea ultimei cifre din variabila "count"
}
lcd.setCursor(1, 1); // pune cursorul pe randul 1, de jos, si a 3-a coloana
lcd.print (count1); // afiseaza cifrele din milioane
lcd.print ("."); // pune punct
if ((count3 < 100)and (count3 > 9)) (lcd.print ("0")); // daca cifrele din mii sunt de 2 cifre scrie un zero
if (count3 < 10) (lcd.print ("00")); // daca e doar o cifra la mii pune 2 de zero
lcd.print (count3); // afiseaza cifrele din mii
lcd.print ("."); // pune un punct
lcd.print (count4); // afiseaza cifra sutelor din frecventa
lcd.print ("00"); // rotunjeste cu 2 zerouri
lcd.print (" - Hz ");
delay (100); // asteapta 0,1secunde si incepe iar masurarea si calculele

}
}

L'objectif est de modifier la gamme de fréquence comme par exemple, jusqu'à 999 Hz , lcd.print (" - Hz"); de 1000 à 1999 Hz
lcd.print(" -KHz");, etc.

De même, est il possible de changer de gamme avec des boutons qui dans le cas ou il y a un dépassement de fréquence sur la gamme choisi avec l'affichage de dépassement " OVER LOAD ", ça c'est pour le fun !!!

Merci de votre aide

Romuald

Bonjour,
Après quelques jours d'absences, je constate qu'il n'y a pas eu de réponses 8)

Si quelqu'un pouvais m'aider.

merci

Bonjour pepe,
Merci de répondre :slight_smile:
En fait, en présentant le code dans mon premier poste j'aimerai juste faire varier la gamme de fréquence en fonction du signal mesuré, choix genre Hz, Khz, Mhz et Ghz avec affichage du dépassement de la gamme,.

Bon j'avoue je débute, je comprends le code, en assimile le sens, mais là .... je suis largué :roll_eyes:

Tout est dans le contenu de ce que l'on demande.
Tu nous présentes un code qui tient sur 4 pages écran et tu nous demande de le modifier.
Ce n'est pas tout à fait comme cela que le forum fonctionne. Le forum est constitué de bénévoles qui ne feront pas le travail à ta place mais t'aideront a le faire.

Je pense que si tu montres un travail personnel en rapportant les messages d'erreurs ou en précisant bien la nature des non-fonctionnements il y aura plus de volontaires pour te répondre.

Un conseil : ne cherches pas à tout réaliser d'un coup mais procèdes par étape, sépares bien ce qui relève de la fonction fréquencemètre de ce qui relève de l'affichage sinon la mise au point sera plus difficile.

Un schéma synoptique de la partie électronique sera aussi une aide utile.
Ne pas oublier les liens vers les datasheets des composants: tu ne veux quand même pas que les aidants soient obligés de les rechercher eux-même pour pouvoir te répondre.

Merci pour ta réponse 68tjs,

J'ai eu un peu de mal à intégrer le code, petite erreur de ma part...

Le montage en lui même a été réalisé avec succès, il fonctionne très bien dans l'ensemble, juste à l'améliorer afin
de répondre à mon cahier des charges.

Voici un des lien pour avoir une petite idée :

Maintenant, l'aide que je demande, est comme une recette de cuisine, les ingrédients, et non le code final, quoi que :smiley:

joeblack64:
Maintenant, l'aide que je demande, est comme une recette de cuisine, les ingrédients, et non le code final, quoi que :smiley:

Sans boule de cristal on ne peut pas savoir ce qu'il te manque ni où tu bloques donc proposes du code et le forum avisera.

Si tu es bloqué de chez bloqué commences par apprivoiser les exemples fournis avec l'IDE avant d(attaqué plus gros.

Plaisanterie à part...

Déclarer des boutons en début du code, je l'ai très bien compris.

Tester et modifier les exemples fournis, pas de soucis et comprendre le code, aussi.

En ce qui me concerne, les essais que j'ai effectué, je ne les ai pas sauvegardé, dommage....

Ce qui me pose problème, c'est ou et comment placer les conditions, j'ai du mal avec ça, quelques exemples me suffiraient.

le basic et le VB, sont un peu loin...

joeblack64:
Plaisanterie à part...

Sur le coup on est sérieux.

joeblack64:
Ce qui me pose problème, c'est ou et comment placer les conditions, j'ai du mal avec ça, quelques exemples me suffiraient. le basic et le VB, sont un peu loin...

Prends le temps d'écrire tes conditions en français sur une feuille de papier avant d'écrire la moindre ligne de code et tu verras que les conditions se placerons d'elle même.
Je ne suis pas un programmeur mais j'ai eu l'occasion de partager quelques mois un bureau avec un chef de groupe de programmeurs : avant de coder ils écrivaient des recueils de plus de 100 pages, donc remplir une petite feuille de papier ne devrait pas être insurmontable.

j'en prends note....

Faire un grafcet en autre.

Maintenant as tu une idée pour une revu dédier à me conseiller.

Pas de marteau pilon pour enfoncer un clou:

-si le bouton est enfoncé il faut :
mettre la variable à xxxxx
attendre que le bidule machin soit stabilisé -> faire une boucle while tant la sortie du composant alpha n'est égale à 0L
puis changer x,y,z
etc, etc

Cela suffit pour mettre de l'ordre dans tes idées.

Merci

Ce que je recherche avant tout, c'est ce que tu viens de faire, ou du moins écrire, ça m'a éclairé ma lanterne :smiley:

Je préfère 100 fois que l'on me guide de cette façon que d'avoir une réponse toute faite....

J'ai bien relu ton poste et en cherchant un peu je suis tombé sur ce petit site fort bien foutu

http://fr.flossmanuals.net/arduino/ch013_programmer-arduino

Hi everyone,

I have an idea about this sketch,
how about to make a menu for manual corrections for prescaler value?

begin from this code line:

unsigned long count = FreqCount.read() * 0.64000088

in reality to get correct reading on 145.000.000 Hz compared with my standard frequency source, i need to change the value if the prescaler 0.64000088 to 0.64007234.

If anyone can help:, how to make a changeable values between 0.64000000 to 0.64010000,

that mean 0.00000001 to 0.00009999 as a value setting that accessible from set menu using a rotary encoder?

Simple words,
There is a one button to access prescaler:
SET Prescaler code : 0.6400000000, 1.28, and 2.56

SET correction 0.00000001 to 0.00009999 (save it in EEPROM after exit this set menu)

a apreciate to anyone who understand my idea and help me to resolve this.