Fréquencemètre pour récepteur ancien
Bonjour,
Comme je l'ai dit dans un précédent poste, je suis débutant.
Mon projet est le suivant: Remplacer des fréquencemètres( en logique cablée) 5 digits, 7 segments que j'ai intégré sur des récepteurs de radio
ancien, par une carte arduino nano pilotant ces mêmes afficheurs (multiplexage).
En effet ces fréquencemètres qui fonctionnent parfaitement prennent beaucoup de place, nbr de CI oblige sans parler du cablage vers les afficheurs.
Malheureusement, je fouille, je cherche, et je n' ai trouvé que des débuts de réponse sur les timers et le comptage de fronts montants,
mais rien pour compter ces impulsions pendant un temps bien précis , par exemple avec un autre timer générant une interruption.
Voici le projet: afficher sur un afficheur 5 digits, 7 segments, la fréquence écoutée.
Pour cela,
1° partie
Mise en mémoire des fronts montants comptés pendant 100ms
Ce que je sais faire :
1) Récupérer et mettre en forme la fréquence de l'oscillateur local
2) Diviser cette fréqence par 100
3) Utiliser le timer 1 pour compter les fronts montants et compter (j'ai récupéré ce programme sur un site de vulgarisation).
Ce que je ne sais pas faire:
3) compter cette fréquence pendant exactement 100ms
4) Soustraire la fréquence intermédiare (ici 464) mais elle est très souvent de 455khz
5) mettre le résultat en mémoire pour l'utiliser sur l'affichage multiplexé.
EX: Fréquence écoutée: 216 kh soit: 216000 hz/s (RMC Grandes Ondes)
la fréquence de l' oscillateur local est égal à la fréquence synthonisée + la fréquence intermédiaire
soit: 216000hz + 464000hz = 680000hz = 680 khz
On divise cette fréquence par 100 soit: 6800 hz/s
On compte pendant un dixième de seconde soit: 680hz
On soustrait 464 à cettre fréquence soit: 680 - 464 = 216 qui est la valeur à mettre en mémoire et à afficher en khz
2° partie
Pendant 100ms :affichage du résultat par multipexage
Le traitement du comptage + affichage dure au total dure 200ms
mais la 2° partie est pour plus tard...
Voici le code qui me permet de compter avec le timer1 sur 2 octets … ( j'ai testé et compris ce code, mais il n'est pas de moi).
Et ma première question qui en comporte plusieurs...
Comment compter les fronts montants pendant 100ms précisément puis retrancher 464 et mettre le résultat en mémoire
en attendant la nouvelle mesure ?
Pouvez vous me donner des pistes ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| /* Programme élémentaire de comptage sans prise en compte des débordements.
Dans cette version le compteur recycle sans fin de 65535 à zéro. */
#define Entree_Compteur 5 // Entrée D5 servira pour mesurer les fréquences.
// Variable du programme.
unsigned long COMPTEUR, Ancienne_Valeur;
void setup() {
Serial.begin(115200); pinMode(Entree_Compteur, INPUT);}
void loop() {Serial.println(); Serial.println("FONCTION COMPTEUR.");
RAZ_COMPT();
TCCR1A = 0; // Le Timer 1 est configuré en simple compteur.
// 111 pour Source externe sur D5 et comptage sur le front montant :
TCCR1B = (1<<CS12) | (1<<CS11) | (1<<CS10);
INFINI:
//========================= Traiter le COMPTEUR ===============================
// Ci-dessous une première lecture fait passer TCNT1H dans le TAMPON.
COMPTEUR = TCNT1L;
// Lecture des 16 bits dans la variable COMPTEUR.
COMPTEUR = TCNT1;
// ============================================================================
if(COMPTEUR != Ancienne_Valeur) {
Serial.print(" CMPT = "); Serial.println(COMPTEUR); Ancienne_Valeur = COMPTEUR;}
goto INFINI; }
void RAZ_COMPT() {
COMPTEUR = 0; Ancienne_Valeur = 1; // Pour forcer l'affichage;
// Replacer le compteur à zéro pour une nouvelle mesure.
// Attention en écriture il faut commencer par les poids forts pour charger le TAMPON.
TCNT1H = 0; TCNT1L = 0;} |
frequencemètre pour radio ancienne
Merci pour la réponse que je vais relire attentivement.
En réalité ce que je veux faire est très simple et basic, en logique cablée.
Mais avec l'arduino Aïe... dur pour moi
Pour simplifier...
Je me sers du timer1 (parcequ'il est autonome) pour compter les fronts montants sur la pin D5 et cela fonctionne apparemment très bien ( ce qui équivaut à compter les périodes) .
Il faudrait simplement compter ces fronts montants pendant un créneaux de 100ms.
Mettre la valeur comptée dans une variable (pour l'utiliser et l'afficher les 100ms suivantes) et remettre le timer1 à 0 si cela est possible.
L'idée effectivement serais de régler un autre timer et de compter les débordement pour avoir 100ms et là, déclencher une interruption... pour faire la suite du boulot: remettre le timer1 à 0, afficher le comptage...
Je vais creuser