Problème de lecture d'un signal 4 kHz avec un RPi 3
Posté : jeu. 30 mars 2017 09:43
Bonjour à tous !
C'est encore moi avec un souci de plus !
Pour poser le contexte : je travaille toujours sur un projet lié aux radars. Celui sur lequel je dois travailler émet deux signaux : l'un carré symétrique de fréquence 4 kHz/de période 250 µs ; l'autre est juste un front haut de durée 125 µs tous les 16 384 fronts hauts du premier signal, il est en front bas le reste du temps. Le premier signal représente l'émission de "signaux radars", le deuxième représente l'impulsion de référence. Donc à chaque début de tour, on a une impulsion du deuxième signal pour indiquer un nouveau tour, pendant que le premier signal émet en continu.
Mon objectif est de lire ces signaux avec mon RPi 3. Pour simuler les signaux, j'utilise une Arduino Uno dont voici le code :
Je doute que le code soit optimisé, l'utilisation de threads ou équivalents pourrait sûrement améliorer les choses. Si tout se passe bien, j'ai mon premier signal qui émet en continu à 4 kHz comme prévu, tandis que j'ai une impulsion de 125 µs du deuxième signal toutes les 4,096 secondes.
Côté RPi, j'utilise le code suivant pour lire les signaux, abaissés du 5 V vers 3,3 V grâce à deux ponts diviseurs de tensions (un par signal) :
Le code est simple, merci WiringPi. Mais mes soucis commencent ici : si j'ai bien des 0 et des 1 irréguliers côté signal A, je n'ai rien du tout côté signal B. Je sais qu'afficher des données dans la console prend du temps à l'échelle d'un programme, mais j'imagine que je devrais au moins avoir un 1 du signal B de temps en temps, par pure chance. De plus, en affichant les signaux A et B émis par l'Arduino sur un oscilloscope, je retrouve bien mon A carré symétrique, mais de période 285 µs au lieu de 250, et le signal B n'affiche qu'une droite à 0 V, avec de minuscules pics réguliers, positifs quand le signal A monte, négatifs quand il redescend.
Du coup mes questions :
En pièce-jointe : l'allure des deux signaux sur l'oscilloscope. Petit aparté : j'ai également un souci de calcul du nord magnétique sur un autre sujet, à votre bon cœur !
C'est encore moi avec un souci de plus !

Pour poser le contexte : je travaille toujours sur un projet lié aux radars. Celui sur lequel je dois travailler émet deux signaux : l'un carré symétrique de fréquence 4 kHz/de période 250 µs ; l'autre est juste un front haut de durée 125 µs tous les 16 384 fronts hauts du premier signal, il est en front bas le reste du temps. Le premier signal représente l'émission de "signaux radars", le deuxième représente l'impulsion de référence. Donc à chaque début de tour, on a une impulsion du deuxième signal pour indiquer un nouveau tour, pendant que le premier signal émet en continu.
Mon objectif est de lire ces signaux avec mon RPi 3. Pour simuler les signaux, j'utilise une Arduino Uno dont voici le code :
Code : Tout sélectionner
#define pinA 5 // Arduino pin emitting A signal.
#define pinB 6 // Arduino pin emitting B signal.
#define period 250 // Period in microseconds.
#define aPerLap 16384 // Number of pulse per lap.
long currentA = 0;
void setup()
{
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
}
void loop()
{
if (currentA == aPerLap * 2 || currentA == 0)
{
digitalWrite(pinB, HIGH);
currentA = 0;
}
digitalWrite(pinA, !digitalRead(pinA));
delayMicroseconds(period / 2);
digitalWrite(pinB, LOW);
currentA++;
if (currentA == 16384)
{
currentA = 0;
}
}
Côté RPi, j'utilise le code suivant pour lire les signaux, abaissés du 5 V vers 3,3 V grâce à deux ponts diviseurs de tensions (un par signal) :
Code : Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#define pinA 0 // WiringPi 0 = BCM GPIO 17 = Pin# 11
#define pinB 2 // WiringPi 2 = BCM GPIO 27 = Pin# 13
int main()
{
wiringPiSetup();
pinMode(pinA, INPUT);
pinMode(pinB, INPUT);
while (1)
{
printf("Signal A : %d | Signal B : %d\n", digitalRead(pinA), digitalRead(pinB));
}
return 0;
}
Du coup mes questions :
- Comment afficher avec précision les vraies valeurs des signaux sur le RPi ? Avec une lecture en direct (affichage console ?) ou en différé (enregistrement dans un fichier puis exploitation du fichier), peu importe. Même si Rasbian n'est pas un RTOS, j'aimerais m'approcher au plus près des valeurs réelles.
- A quoi peut être dû l'écart entre mon signal émis (250 µs de période) et le signal lu par l'oscilloscope (285 µs de période) ? Y a-t-il moyen de réduire cet écart ?
- Pourquoi ces petits pics mis en évidence par l'oscilloscope sur le signal B ?
En pièce-jointe : l'allure des deux signaux sur l'oscilloscope. Petit aparté : j'ai également un souci de calcul du nord magnétique sur un autre sujet, à votre bon cœur !