J'essaie d'utiliser Timer1 du microcontrôleur Atmel AVR, soit AtMega328 tel qu'utilisé dans l'Arduino, ou ATTiny85, pour émettre deux signaux d'horloge qui sont des images miroir l'un de l'autre. La fréquence que j'essaie de générer est une variable de 1 MHz à 2 MHz ou plus qui est trop élevée pour le faire en utilisant du code pour basculer les broches de sortie, sauf si je ne veux presque rien faire d'autre dans le contrôleur. Je veux donc utiliser la sortie du minuteur directement sur les broches associées. J'utilise la chaîne d'outils GCC donc pas limitée par les bibliothèques ou le langage Arduino.
Timer1 dans l'Atmega328 a deux broches associées et je peux en obtenir deux signaux identiques de 1 MHz à 2 MHz. Bien que la fiche technique semble dire que je peux obtenir une forme d'onde inversée, cela me porte à confusion. Je peux également obtenir deux signaux qui sont des cycles d'utilisation différents à 1 MHz, en utilisant les paramètres PWM avec Timer1, mais les deux signaux montent en même temps, le plus court devient bas plus tôt. Cela ne sert pas mon projet. Je n'ai même pas besoin de la variation de largeur d'impulsion PWM, j'ai juste besoin de deux signaux identiques de type "horloge" de phase opposée, c'est tout.
Je ne demande à personne d'écrire du code pour que je le fasse, j'ai juste besoin que quelqu'un me dise quel mode / drapeaux de la minuterie devrait me donner une forme d'onde inversée simple sur l'une des deux broches associées à la minuterie. Si possible, je veux éviter d'utiliser un circuit inverseur externe pour l'une des sorties, sauf si c'est la seule option.
Si cela est possible dans ATTiny, ce sera encore mieux. L'ATTiny a également 2 broches associées à une minuterie, mais je ne suis pas sûr qu'il ait les mêmes options que l'ATMega.
J'ai déjà un cristal de 20 MHz et des condensateurs connectés sur le PCB et une horloge de 20 MHz fonctionne de manière fiable sur l'ATMega328. Sur ATTiny85 PCB, j'ai un cristal de 8 MHz et cela fonctionne également de manière fiable.
Veuillez aider. Je vous remercie.
MISE À JOUR : Il y a des hypothèses non valides dans les réponses et commentaires jusqu'à présent, alors je devrais peut-être clarifier: Notez que dans mon message d'origine, j'ai déclaré que j'utilise une horloge de 20 MHz, pas de 8 MHz , et que je n'ai pas besoin de PWM .
Le seul mode qui donne une fréquence de sortie suffisamment élevée semble être le mode CTC car les modes PWM ne fonctionnent pas pour une sortie à 2 MHz. Existe-t-il un moyen d'inverser la sortie A du temporisateur 1 ou la sortie B en mode CTC?
Je suis maintenant passé à un Arduino Uno standard (ATMega328, 16 MHz) au lieu de ma propre carte de 20 MHz pour vérifier mon code, et c'est mon code pour une belle horloge constante de 2 MHz en mode CTC à partir des broches 9 et 10, le minuteur 1 broches de sortie:
#define tick 9
#define tock 10
void setup() {
pinMode(tick, OUTPUT);
pinMode(tock, OUTPUT);
TCCR1A = _BV(COM1A0) | _BV(COM1B0) ; // activate both output pins
TCCR1B = _BV(WGM12)| 1; // set CTC mode, prescaler mode 1
// various frustrating attempts to invert OC1B failed. What do I put here?
OCR1A = 3; // set the counter max for 2 MHz
}
void loop() {
}
Les traces de l'oscilloscope pour les deux broches sont identiques et synchronisées, comment puis-je inverser l'un des deux signaux? Le mode inverser dans la feuille de données semble ne rien faire en mode CTC. Suis-je en train de lire la fiche technique de manière incorrecte, ou serai-je obligé d'utiliser une fréquence inférieure et un mode PWM après tout?
Pour ajouter une question "prime" spécifique à ma requête d'origine:
quels changements dois-je apporter à mon code ci-dessus, pour qu'il donne des signaux parfaitement inversés aux broches 9 et 11 à la fréquence la plus élevée possible pour une horloge de 16 MHz , que ce soit c'est 2 MHz ou pas?
Je vais m'en tenir à un Arduino Uno standard pour l'instant, afin qu'il n'y ait pas de mode d'erreur introduit par ma carte homespun, et pour que toute personne ayant un arduino puisse essayer mon code ci-dessus et confirmer qu'il fonctionne comme je l'ai mentionné et non comme je l'ai dit. avoir besoin!