[Résolue] Génération d'un signal carré par une arduino méga

Bonjour tous le monde,

Je crée ce poste car depuis un moment avec "trimarco232" nous restons bloqué sur la génération d'un signal carré avec une méga2560 pour se synchroniser avec un ECU (lier au sujet 'PCM Control Unit' ).

J'ai besoin de crée un signal de 153.6khz alors que j'ai trouvé que la méga était limité à 65khz, vrai ou pas? y'a t'il des solutions ?

Voici le setup déjà utilisé sans aucun résultat :

void setup() {
  pinMode (10, HIGH); // sur un mega OC2A est sur la pin 10
  TCCR2A = 0x23 ;
  TCCR2B = 0x09 ; // mode 7, clock prescale by 1
  OCR2A = 104-1 ;  // 16000khz / 104 = 153.8khz
  Serial.begin(9600);
  Serial2.begin(9600);
}

--------------------------------------

void setup() {
  digitalWrite (10, HIGH); // sur un mega OC2A est sur la pin 10
  TCCR2A = 0x23 ;
  TCCR2B = 0x09 ; // mode 7, clock prescale by 1
  OCR2A = 104-1 ;  // 16000khz / 104 = 153.8khz
  Serial.begin(9600);
  Serial2.begin(9600);
}
--------------------------------------

void setup() {
  pinMode (10, OUTPUT); // sur un mega OC2A est sur la pin 10
  TCCR2A = 0x23 ;
  TCCR2B = 0x09 ; // mode 7, clock prescale by 1
  OCR2A = 104-1 ;  // 16000khz / 104 = 153.8khz
  Serial.begin(9600);
  Serial2.begin(9600);
}

--------------------------------------

void setup() {
  digitalWrite (10, OUTPUT); // sur un mega OC2A est sur la pin 10
  TCCR2A = 0x23 ;
  TCCR2B = 0x09 ; // mode 7, clock prescale by 1
  OCR2A = 104-1 ;  // 16000khz / 104 = 153.8khz
  Serial.begin(9600);
  Serial2.begin(9600);
}

--------------------------------------

Merci d'avance pour votre aide.

Tu as l'air d'utiliser les timers. Avec un timer en mode CTC les micro avr peuvent générer des signaux jusqu'à la moitié de la fréquence horloge soit 8MHz.

Un site qui complète bien la datasheet du micro et qui pourrait t'intéresser : celui de Mike Gamon.

Merci pour ton retour, je débute et ne connais pas les Timers, ce code ne vient pas de moi mais de "trimarco232" qui m'aide beaucoup sur mon projet principal.

Je n'aurais pas trouvé seul ce code ou du moins pas de suite, Je reste donc sur cette méthode ?

Vous avez essayé avec la arduino-pwm-frequency-library?

EDIT - soucis potentiel sur MEGA... je regarde

Non du tout, je vais regarder ce qu'il en ai, merci.

Bonjour,

Je parle de synchronisation, mais n'auras pas besoin de changer, c'est pour communiquer avec un ECU dont le protocole ce trouve ICI.

Extrait:

Communications baud rate is 9600 baud (default). Clock speed for this baud rate
is 153.6 Khz, plus or minus 5 khz (as tested by PL& MS). Other baud rates and
matched clocks may be possible as well. Clock GENERATED by the Host
terminal (Consult or PC Interface). Synchronizing the clock to the data lines is
NOT necessary. E.g. the clock free runs at the required speed. (16x the data rate).

http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-dds-sinewave-generator/

tien voila quelque chose qui pourras t'aider

par la suite, il faut un ampli pour le tranformer en carré

Avec un timer contrôlé par des registres 8 bits et un diviseur d'horloge pour le timer N= 1
on obtient
OCRXA = 50 F = 156,863 kHz
OCRXA = 51 F = 153,846 kHz
OCRXA = 52 F = 150,943 kHz

Merci pour vos réponse. Je vais lire ces pages.

68tjs:
Avec un timer contrôlé par des registres 8 bits et un diviseur d'horloge pour le timer N= 1
on obtient
OCRXA = 50 F = 156,863 kHz
OCRXA = 51 F = 153,846 kHz
OCRXA = 52 F = 150,943 kHz

J'ai une tolérance de 5khz donc 153.8 est très bien.

En le remplaçant à la place de "OCR2A = 104-1 ;"
J'obtient l'erreur Arduino : 'OCRXA' was not declared in this scope.

Ah d'accord au t'en pour moi, merci.

Il existe un moment de vérifier le bon fonctionnement sur la Pin ?

D'accord merci pour ces explications, je n'aurais rien avec un voltmètre ?

Pour la mesure des signaux il existe un outil assez universel pour environ 7€ : analyseur logique clone de Saleae.
Soyons d'accord la précision ne sera pas celle d'un fréquencemètre mais c'est suffisant.

J'obtient l'erreur Arduino : 'OCRXA' was not declared in this scope.

NB : il me semble avoir écrit :

Un site qui complète bien la datasheet du micro et qui pourrait t'intéresser : celui de Mike Gamon.
Gammon Forum : Electronics : Microprocessors

Que tu ne saches pas que cela se trouve dans la datasheet je le conçois aisément.
Mais qu'une fois que le renseignement t'a été donné je pense que tu te dois de lire la partie timer de la datasheet d'autant que le renseignement que je t'ai donné est pour un micro Atmega328p (UNO), pour un atmega2560 (Mega) une vérification s'impose.

Grosso modo tu as des registres pour :

  • fixer la valeur du pré-scaler d'horloge : c'est le fait de fixer une valeur différente de 0 qui lance le timer.
  • autoriser le timer à prendre le contrôle d'une des deux sorties qui lui sont affectées.
  • fixer le mode de génération de signaux (pour un signal de type horloge il faut le mode CTC)
  • fixer la fréquence

Evite de te servir du timer 0 qui est utilisé par les fonctions de temps arduino.
Et bien évidement le timer utilisé ne sera plus en configuration "arduino" mais en configuration 200sx200.

Oui et je t'en remercie mais je n'ai que survolé pour le moment, n'étant pas très doué en anglais je ne suis pas aller au fond des chose, mais je vais le faire.

Je vais étudier tous les messages et site posté jusqu'au bon fonctionnement :wink:

Je te mets en pj une "œuvre inachevée"

Ce sont mes notes mises au propre quand je me suis intéressé aux timers il y a 2 ans.
J'avais prévu d'aller plus loin mais le courage m'a vite manqué.

Si cela peut t'être utile pour débuter la lecture de la datasheet --> moi c'était celle du 328p, pour toi ce sera celle du 2560.

Comme d'habitude tout n'est pas à prendre pour argent comptant, j'ai pu faire des erreurs je ne suis pas infaillible.

timers_compteurs.zip (310 KB)

Bonjour,
merci pour vos implications
le souci que j'avais, c'est que je ne suis pas parvenu à obtenir les 2.5v qui correspondent à un signal carré sur la broche 10
ne disposant pas d'arduino mega, je n'ai pas (pu) voulu pousser plus loin les investigations

trimarco232:
Bonjour,
merci pour vos implications
le souci que j'avais, c'est que je ne suis pas parvenu à obtenir les 2.5v qui correspondent à un signal carré sur la broche 10
ne disposant pas d'arduino mega, je n'ai pas (pu) voulu pousser plus loin les investigations

Bonsoir trimarco232
Je ne comprend pas ta réponse

Merci beaucoup, effectivement c'est bien fonctionnel et je mesure 2.46volt en sortie de pin donc j'ai bien quelque chose :slight_smile:

Je vais donc essayer de me connecter à l'ECU avec ce signal.

Je peux le mettre le fichier .h en "#include <Signal.h>" ?

Bonjour,

pour ce qui me concerne :

  • 1 erreur dans TCCR2A (activation de la voie B au lieu de la voie A) -> repompé sans vérifier ...
  • 1 bévue dans le calcul de la période : OCR2A = 104-1 au lieu de OCR2A = 104/2 -1 -> oublié que la période d'un signal carré, c'est 2 fois la durée de l'impulsion ...

merci à pepe d'avoir débrouillé tout ceci !