pouvez-vous m'aider a trouver l'erreur sur mon programme

je viens d’avoir un projet basé sur la carte arduino qui est le suivant :
si je reçois une tension entre 0.3 v et 4 v je dois générer 2 signaux carré d’amplitude 5v ,de fréquence 500 khz et il sont déphasé de 45° voila le programme que j’ai fait mais je n’obtient pas la fréquence voulu .

const int potar = 0; // le potentiomètre, branché sur la broche analogique 0
const int sigA=13 ; // signal encodeur A
const int sigB=12 ; // signal encodeur B
float tension ;
int valeurLue; //variable pour stocker la valeur lue après conversion
void setup()
{
pinMode(sigA,OUTPUT); // signal encodeur A
pinMode(sigB,OUTPUT); // signal encodeur B
}
void loop()
{
//on convertit en nombre binaire la tension lue en sortie du potentiomètre
valeurLue = analogRead(potar);
//on traduit la valeur brute en tension
tension = valeurLue * 5.0 / 1024;
if(tension <= 4 && tension >= 0.3 )
{
digitalWrite(sigA, HIGH); // on génere 2 signaux carré dephasé de 45° de période 2 micro-seconde
delay(0.0005) ; ;// 0.5 micro-seconde
digitalWrite(sigB, HIGH);
delay(0.0005) ;
digitalWrite(sigA, LOW);
delay(0.0005);
digitalWrite(sigB, LOW);
delay(0.0005);
}
}

Nombre de posts depuis inscription : 3

3 fois la même question.

http://forum.arduino.cc/index.php?topic=309086.msg2144621#msg2144621

http://forum.arduino.cc/index.php?topic=309087.msg2144623#msg2144623

Demande à un modo de regrouper tout ça.

delay(0.0005) ;          ;// 0.5 micro-seconde

La fonction delay() requiert un paramètre unsigned long

Ce qu’il y a ici devrait t’interesser : http://forum.arduino.cc/index.php?topic=103614.0

Et comme dit pour quelqu’un d’autre qui en avait besoin, si tu dois aller vite, il faut utiliser la lib digitalWriteFast

Je viens de retrouver un ancien post où je reportais des tests de vitesse d'écriture. http://forum.arduino.cc/index.php?topic=77060.msg582084#msg582084

Tu y verra qu'un cycle "écriture 1 suivi d' écriture 0" prend au mieux 10µs avec les fonctions arduino digitalWrite() ce qui limite la fréquence maximale à 100 kHz !

En faisant l'effort d'apprendre à utiliser les registres du micro une écriture ne prend que 1 µs. Ce qui donne du 1 Mhz max mais le signal est crapouilleux le rapport cyclique est plutôt du 20/80.

Une écriture utilisant la librairie digitalWrite Fast sera entre les deux --> où ? on n'en sait rien.

Je reviens à mon premier message générer du 500 kHz avec un micro-contrôleur 8 bits tournant à 16 MHz n'est pas possible par programmation sauf à faire des bricolages avec _NOP() où pour avoir un RC de 50/50 la fréquence max ne dépassait plus les 700 kHz.

Il faut passer par une génération matérielle (Hardware) c'est à dire passer par les timers. Pour utiliser les timers il faut lire la datasheet et personne ne le fera à ta place.

Indices : Indices 1 : utiliser le mode CTC qui permet d'obtenir un signal carré de rapport cyclique 50/50 de quelques hertz jusqu'à la moîtié de la fréquence du quartz c'est à dire 8 MHz.

Indices 2 : Dans un atmega328p il y a 3 timers dont 2 utilisent le même préscaler donc ils sont facilement synchrones. Pour décaler l'un par rapport à l'autre il suffit de jouer sur la valeur du compteur (TCNTx) au moment du lancement. Exemple (Attention les nombres sont complètement bidons) tu utilises les timers T0 et T1. Tu as calculé que pour avoir une fréquence de 543 kHz il faut que OCR0A et OCR1A soient égaux à 244. Pour faire un décallage d'un 1/4 de période il suffit de prépositionner les registres de comptage à la bonne valeur. TCNT0 = 0; TCNT1 = valeur à calculer à partir des indications de la datasheet, ce n'est pas moi qui passe le bac .