Clock out : oscillation... chameauïde...

Bonjour,
Voilà, j'ai modifié le CKOUT du bootloader pour avoir un clock out sur le pin 8 de l'arduino. Ca m'amène à 2 questions :

  • Sachant que le clock in est à 16mhz, peux t-on diviser la fréquence sur le clockout, pour avoir du 8, du 4 ou 2 mhz par exemple ?

  • A l'oscilloscope, j'ai une superbe sinusoïde sur le clock in. Si je le branche sur la sortie clockout, ma sinusoïde devient une "chameauïde", c'est a dire que j'ai un vilain signal avec 2 sous crêtes à chaque crête... J'avoue être inquiet à l'idée de fournir ce signal à d'autres composants. Comment améliorer ça ?

En vous remerciant.

Bonjour,

Quand tu dis que tu as modifié le CKOUT du bootloader je suppose que tu veux dire que tu mets à 0 le fuse CKOUT (ça n'a pas grand chose à voir avec le bootloader)

A ma connaissance ce qui sort sur PB0 c'est la divided system clock, c'est à dire la clock system divisée par 1 ou par 8 suivant le fuse CKDIV8 (horloge qui est aussi utilisée par le micro). Je ne pense pas qu'on puisse la diviser encore.

Je parlais bien des fuse. Désolé.

Divisé "par 1 ou par 8" donc sans les valeurs intermédiaires 2 et 4 ?

En fait, je souhaite piloter un composant qui réclame 8Mhz et seulement 8Mhz, tout en gardant les 16Mhz de l'arduino. Je suis contraint d'utiliser un deuxième quartz ?

Merci pour ta réponse

tu peux utiliser une bascule pour diviser par 2

Tu peux prendre le 16MHz et le diviser par 2 avec une bascule (D, JK) ce qui sera quand même mieux, d'un point de vue électromagnétiques, qu'utiliser un oscillateur supplémentaire.

Concernant les "chameauïde" elles peuvent être dues à:

  • une sonde d'oscilloscope mal calibrée(ou en position x1 au lieu de x10)
  • un oscilloscope pas très performant
  • une longueur de fil sur cette sortie qui dégrade le signal
  • une combinaison des trois

Bonjour,
pas besoin de composant externe !
tu utilises une sortie pwm en mode ctc, prédiviseur = 1

fdufnews:
Tu peux prendre le 16MHz et le diviser par 2 avec une bascule (D, JK) ce qui sera quand même mieux, d'un point de vue électromagnétiques, qu'utiliser un oscillateur supplémentaire.

Concernant les "chameauïde" elles peuvent être dues à:

  • une sonde d'oscilloscope mal calibrée(ou en position x1 au lieu de x10)
  • un oscilloscope pas très performant
  • une longueur de fil sur cette sortie qui dégrade le signal
  • une combinaison des trois

C'est exactement la même configuration qui mesure la belle sinusoïde et la chameauïde... je déplace juste la sonde d'une patte à l'autre pour faire ce constat !

Pour la solution à base de timer, c'est exclu, j'ai besoin de tous mes timers pour autre chose.

Concernant la bascule... un composant en particulier a suggérer ?

Merci a vous.

un CD4013


(extrait de ce site)

kamill:
un CD4013


(extrait de ce site)

Bonsoir Kamill
la techno des CD ne va pas tres haut en clock
typiquement c'est 5MHz pour Valim 5V
il faut taper dans du HC

C'est exactement la même configuration qui mesure la belle sinusoïde et la chameauïde... je déplace juste la sonde d'une patte à l'autre pour faire ce constat !

Il n'y a pas d'incohérence a ce que tu constate mais je suis désolé de te dire que la chameauïde existe parce que tu fait mal la mesure.

Une chose à savoir :
Mathématiquement un signal carré peut être décomposé en une somme infinie de sinusoîde --> voir "séries de Fourrier".
Nous on est pas dans les maths théoriques mais dans la physique réelle où l'infini n'existe pas et où les signaux possèdent un temps de montée et de descente qui n'est pas nul.
On considère que pour qu'un signal soit "carré" il faut transmettre au moins 7 à 10 la fréquence du "carré".

Exemple : pour visualiser à l'oscilloscope un signal carré de fréquence 1 MHz il faut que la chaîne de mesure ait une bande passante de 10 MHz.
Alors que pour mesurer la même fréquence sinusoïdale une bande passante de 1 MHz suffit.

C'est quoi la chaîne de mesure :
C'est l'oscilloscope bien sûr mais comme fdufnews te l'a dit c'est aussi le câble de la sonde, c'est aussi la tête de la sonde et plus délicat c'est aussi la façon dont tu prend la masse au niveau de la sonde.

Deux points :

  1. la tête de la sonde
    Une sonde présente un effet capacitif qui diminue la bande passante, pour réduire cet effet on place dans la sonde une résistance en série qui masque la capacité (et qui négativement fait pont diviseur mais on n'a rien sans rien). C'est pour cela qu'il faut éviter de l'utiliser en rapport1/1.
    D'autre part une sonde est un objet complexe et un réglage est très souvent prévu. L'oscillo délivre toujours un signal destiné à calibrer la sonde. Ce calibrage est à vérifier régulièrement.

  2. Le fil de prise de masse de la sonde.
    Là c'est l'art de maniper.
    Pour faire une bonne mesure il faut que le circuit imprimé soit prévu pour, c'est à dire qu'il existe une masse proche du signal à mesurer (d'accord avec la conception arduino on est très mal barré) et que le fil qui va de la sonde à la masse soit très court -> là on peut faire quelque chose.

Le mieux (il faut deux mains ou des fois les dents :smiley: ) c'est de retirer le clip terminal de la sonde et de connecter la masse avec une lame de tournevis qui touche la masse coté circuit imprimé et coté sonde la collerette qui entoure la pinuche centrale.
Sinon si le fil de masse de la sonde est trop long il faut le torsader sur lui même pour annuler la boucle qui donne de l'inductance qui limite la bande passante.

En résumer les deux écueils avec une sonde :
-La capacité de la sonde qui faut masquer et compenser par un réglage

  • L'inductance dans le fil de masse --> réduire le fil et la boucle

Créer un 8 MHz
C'est possible sans composant extérieur en utilisant un timer en mode CTC. Les pins qui peuvent le faire sont celles qui peuvent être contrôlées par un timer. Ce sont donc bien évidement les mêmes que celles qui font de la PWM mais ce n'est pas de la PWM c'est du mode CTC qui est différent, c'est peut-être pinailler de dire cela mais c'est pour éviter les confusions.

Néanmoins je suis convaincu que l'utilisation d'une bascule D (ok pour 74HCxxxx ) est préférable car elle constituera un tampon d'isolement qui protègera le micro-contrôleur d'éventuelles perturbations.

68tjs:
Néanmoins je suis convaincu que l'utilisation d'une bascule D (ok pour 74HCxxxx ) est préférable car elle constituera un tampon d'isolement qui protègera le micro-contrôleur d'éventuelles perturbations.

+1
mon commentaire precedent etait juste pour faire ressortir "une" limite des series CD basiques

comme personne ne tient compte de mon précédant post, je pense que tout le monde sait que comode n'a plus de sortie pwm de dispo ?

Artouste:
la techno des CD ne va pas tres haut en clock
typiquement c'est 5MHz pour Valim 5V
il faut taper dans du HC

Bonjour,

Effectivement j'ai répondu un peu vite, un 74HC74 est en effet plus adapté.

trimarco232:
comme personne ne tient compte de mon précédant post, je pense que tout le monde sait que comode n'a plus de sortie pwm de dispo ?

Oui , il veut simplement repiquer le pin10 de l'atmega328P

Par curiosité j'ai regardé le signal CLK0, sur ma carte uno c'est relativement propre (oscillo 60MHz)

kamill:
Par curiosité j'ai regardé le signal CLK0, sur ma carte uno c'est relativement propre (oscillo 60MHz)

ah bha voilà, c'est ce que j'ai ! Peut être avec des sous crêtes un peu plus profonde.

Par contre, sur une patte du quartz, c'est une sinusoïde parfaite. Donc... c'est acceptable pour fournir le clock à n'importe quel autre composant ? (par exemple un nRF2401 qui est un transceiver 2.4Ghz)

Pour le flip flop, il faudrait que ça me prenne moins de place sur la carte qu'un quartz pour que ça m'interesse. Bon, j'ai pas encore "étudié" le fonctionnement d'un diviseur de fréquence avec un flip flop, mais compte tenu des délais de la poste, je pensais commander d'abord et regarder comment ça marche le temps que ça arrive.

J'ai trouvé ce modèle NC7SZ374 qui est nettement moins encombrant et qui a l'air de tenir la fréquence. Ca sera équivalent ?

Enfin, tant que j'y suis, puisqu'on parle de CTC, j'avais programmé un échantillonneur audio pour arduino (à 8khz en 8 ou 10bits) il y a quelques temps. En parallèle, j'avais voulu sortir sur une patte un signal (CTC si je me souvient bien) dont le duty cycle dépendait de ce qui passait dans l'échantillonneur. Quand l'échantillonneur tournait (et qu'il mettait cher au contrôleur), le signal de sortie PWM ne ressemblait plus à rien! Bref, j'avais fini par conclure que les perfs du µC étaient insuffisantes pour les 2 fonctions.

Donc est-ce qu'un signal CTC, qui est généré à priori de façon "hardware" peut souffrir d'une surconsommation de ressources ? Si j'avais un calcul en interruption dont le temps de calcul était (ponctuellement) supérieur à la période entre 2 appels de l'interruption, ça peut avoir une incidence sur un PWM ou ça devrait juste faire péter la pile ? ou est-ce que le problème venait d'ailleurs ?

En imaginant que je libère un timer, je ne voudrais surtout pas que la fréquence puisse varier du fait d'une éventuelle sur-consommations ponctuelle de ressources.

Encore merci à vous

j'avais voulu sortir sur une patte un signal (CTC si je me souvient bien) dont le duty cycle dépendait de ce qui passait dans l'échantillonneur.

Pas possible.
Le mode CTC est fait pour avoir le rapport cyclique le plus proche possible de 50/50.

Les timers (et les signaux qu'ils génèrent) une fois lancés sont indépendants du programme : ils vivent leur vie indépendemment du programme.

Quand l'échantillonneur tournait (et qu'il mettait cher au contrôleur), le signal de sortie PWM ne ressemblait plus à rien

La PWM était générée à partir des fonctions Wiring/Arduino ou directement en manipulant les registres ?

Il y a quelques mois j'avais regardé "l'agilité" de la PWM dans les deux modes de commande.

Ce n'est pas la PWM qui est en cause mais la fonction wiring/arduino analogWrite.
En manipulant les registres la modification de rapport cyclique était instantanée et parfaite par contre avec la fonction analogWrite() effectivement c'était le bazar à chaque modification du rapport cyclique, il fallait plusieurs cycles avant que le signal se stabilise..

Chameauïde :

ah bha voilà, c'est ce que j'ai ! Peut être avec des sous crêtes un peu plus profonde.

C'est un excellant signal !
Si tu obtiens la même chose c'est que tu fais correctement la mesure, a te lire je m'attendais à largement pire.
Les signaux réellement carrés ne se voient que dans les livres.
Tous les circuits numériques possèdent de l'hystérésis en entrée afin de tolérer un niveau d'ondulation du signal.

68tjs:
Pas possible.
Le mode CTC est fait pour avoir le rapport cyclique le plus proche possible de 50/50.

ah... C'est pas ce que j'ai fait dans l'exemple ci-dessous (où le but était justement de jouer sur un rapport cyclique entre 0 et 100 en faisant varier la valeur à comparer) ?

Les timers (et les signaux qu'ils génèrent) une fois lancés sont indépendants du programme : ils vivent leur vie indépendemment du programme.La PWM était générée à partir des fonctions Wiring/Arduino ou directement en manipulant les registres ?

Il y a quelques mois j'avais regardé "l'agilité" de la PWM dans les deux modes de commande.

Ce n'est pas la PWM qui est en cause mais la fonction wiring/arduino analogWrite.
En manipulant les registres la modification de rapport cyclique était instantanée et parfaite par contre avec la fonction analogWrite() effectivement c'était le bazar à chaque modification du rapport cyclique, il fallait plusieurs cycles avant que le signal se stabilise..

J'essaye de retrouver ce que j'avais fait pour te dire exactement ce qu'il en est, mais je n'avais manifestement pas gardé de version intermédiaire avant que je ne réutilise ce que j'avais fait pour autre chose. Donc si j'essaye de reconstituer, ça devait être :

TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS20);
OCR2A = 255;

et ensuite, je devais gérer mon duty cycle en jouant sur la valeur de OCR2B dans l'ISR d'une autre interruption (à chaque fin de lecture ADC). J'ai vaguement souvenir que je modifiait aussi OCR2A...
Du reste, j'ai assez conscience de la lenteurs/lourdeur des fonctions arduino et je ne les utilise pas dès qu'il s'agit d'interruption. Après, je n'ai plus ce code, donc peut être y avait-il d'autre conneries... Dommage :confused:

Merci pour tes réponses.

PS : Je suis toujours preneur d'avis sur le NC7SZ374 pour générer mon 8Mhz !

NC7SZ374 à priori OK