Bonjour a tous,
Il y a quelques mois de cela , vous m'avez aidé à mettre au point un fréquencemètre avec la soustraction des FI et autres
petites choses qui vont bien, pour lire précisément les fréquences en AM et en FM sur certains de mes récepteurs radios
dont je fais la collection et je m'en suis bien sortie (compréhension des timers 1 et 2).
Il ya peu de temps je me suis fabriqué un récepteur sur 162 khz (FRANCE INTER: heure étalon) pour étalonner
mes deux fréquencemètres,et ils en avaient besoin...
Puis il m'est venu l'idée de récupérer la modulation de phases (photo jointe), pour le fun et mettre au point ma petite horloge a moi...
Mais malheureusement! les quelques connaissances que j'ai acquéri ne me suffisent pas pour résoudre le premier pb sur lequel je bute.
Aprés avoir passé des heures devant mon écran
à tester milli(); delay, les interruptions...et avoir parcouru le net, je demande de l'aide!
Je vous explique;
Pendant la 59 em secondes du code horaire (voir photo), il ya un silence synchro qui dure plus de 1 seconde et le premier front montant
qui suit ce silence est le top du début de la première seconde.
Je n'arrive pas à écrire un petit bout de code qui me permettrait en fait pour débuter mon programme:
1) de détecter un niveau bas égal à environ 800ms ( à partir des fronts montants, pris en charge par l' interrupt sur la pin2. Cela n'arrive
qu'une fois dans la minute).
2) puis quand on a compté 800ms, on active une tempo de 520 ms qui sera suivi d'un niveau haut sur la pin 13 de 50ms. Dans l'idéal, il y aura le top de la 1° seconde encadré par un niveau haut de 50ms, ce qui me permettra avec un ET logique d'éliminer les parasites éventuels.
3) si les tops sont plus rapprochés que 800ms, la pin 13 reste à 0
C'est juste le début , mais j'ai vraiment du mal...j'ai fait pas mal d'essais mais aucun ne fonctionnait correctement...
je vous ai mis un de mes essais...
1) l'interruption reinitialise "tempoDepart"
2) je saute dans un sous programme "programme()" qui attend un niveau bas de plus de 800ms, et met à 1 la pin 13 puis va dans loop.
Il qui passe dans "else" si le temps entre deux interrupts fait moims que 800ms et met
la pin 13 à 0 et va dans loop.
Le pgr que je vous montre fonctionne sur trois pattes. Il continue à tourner même sans interruption, d'ou des niveaux hauts régulièrement .
j' ai testé le programme dans une routine appelée par l' interruption, mais apparemment millis() ne fonctionne pas dans ce genre de routine.
La photo montre les modulation de phase et la logique associée.
Merci de me donner un coup de main.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 int led = 13; unsigned long tempoDepart = 0; int interval=800; void setup() { pinMode(led, OUTPUT); digitalWrite(led,LOW); attachInterrupt(0, mafonction, RISING); tempoDepart = millis(); Serial.begin(115200); } void loop (){programme();} void mafonction() {tempoDepart= millis();} void programme(){ if ( ( millis()- tempoDepart ) >= interval ) { //si plus de 800 ms sans interrupt, led allumée 50 ms digitalWrite(led,HIGH); delay(50); // calibrage niveau haut digitalWrite (led,LOW); tempoDepart=millis();} else { digitalWrite(led,LOW); }}
Partager