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 !