Je veux créer un simple oscillateur à onde carrée similaire à ce que l'on ferait avec un 555, mais je veux utiliser le support PWM basé sur les interruptions pour contrôler la largeur et la fréquence des impulsions.
J'ai étudié la fiche technique, les API AVR et tous les exemples PWM que je peux trouver, mais je n'ai pas tout à fait pu tout rassembler.
Est-il possible de créer un tel oscillateur avec la fonctionnalité AVR PWM intégrée et, si oui, comment? Mon ami a fait quelque chose de similaire avec un PIC à 8 broches.
Mon raisonnement est que j'obtiendrai des sons intéressants en changeant la largeur d'impulsion et donc la forme d'onde à une fréquence donnée. Semblable à la façon dont la console Atari Punk fonctionne mais, espérons-le, de manière plus stable, c'est-à-dire en modifiant la largeur d'impulsion, mais en laissant la fréquence constante ou vice versa.
Réponses:
Ceux-ci devraient vous mener assez loin et le reste que vous pouvez faire avec la fiche technique. Commencez à construire morceau par morceau, de clignotant à forme d'onde en forme d'onde qui change au fil du temps en tons. Certaines sources peuvent aider à filtrer et à piloter les sorties audio (le LPF actif peut parfaitement faire les deux).
Je suggère de revenir avec des questions plus spécifiques.
la source
La période du PWM est déterminée par le taux de débordement de votre minuterie. Il y a beaucoup de paramètres dans la section Modes de fonctionnement auxquels penser. Si tout ce que vous voulez faire est de générer une onde carrée à période constante, avec un rapport cyclique variable, je pense que vous allez vouloir utiliser le mode CTC (Clear Timer on Compare Match). L'idée de base est de définir OCR0A sur le nombre de tics de minuterie jusqu'à ce que vous souhaitiez que la broche bascule ensuite, et utilisez l'interruption Compare Match pour modifier cette valeur pour la prochaine fois. Donc, en avr-gcc, cela ressemblerait à quelque chose comme:
Attention, c'est du code non testé mais je pense que l'idée est juste. Ce n'est en aucun cas la seule façon de le faire.
Soit dit en passant, il y a une chose que vous devez savoir sur l'ATTiny13. L'oscillateur RC interne n'est garanti que pour être précis à 10% près du sol de l'usine. Il existe un processus de calibrage utilisateur que vous pouvez suivre (décrit par une note atmel ) qui vous permettra d'obtenir une précision de 2% pour l'ATTiny13. Si vous voulez faire mieux, vous devrez probablement utiliser une puce qui accueille un cristal externe ...
la source
Pas une réponse directe à votre question, mais cela peut être à propos et fournir quelques conseils -
Je viens de créer un oscillateur à commande numérique (NCO) utilisant un ATmega uC et un DAC. Un tableau d'entiers est utilisé pour stocker un cycle d'une forme d'onde (table d'onde). Un accumulateur de phase (long int) est utilisé pour déterminer l'adresse des données de sortie dans la table d'ondes. Chaque interruption de temporisation incrémente l'accumulateur de phase d'une valeur fixe. L'incrément de phase détermine la fréquence.
Dans mon application, j'ai utilisé une table d'onde de 64 octets qui contenait un cycle d'une onde sinusoïdale. Il est facile d'étendre la table d'ondes et d'ajouter plus de résolution aux échantillons. Ma note d'application est à http://wiblocks.com/docs/app-notes/nb1a-nco.html
la source
Fondamentalement, un PWM ne change pas la fréquence. Les PWM sont principalement utilisés pour contrôler l '"intensité" d'un signal.
Pour générer une interruption pour différentes fréquences, je vous suggère d'utiliser la minuterie en mode CTC.
Il fonctionnera à votre valeur de comparaison, basculera une interruption, effacera et redémarrera lui-même - jusqu'à ce qu'il s'exécute à nouveau à votre valeur de comparaison ...
À chaque interruption, vous pouvez commuter un ou plusieurs ports et le reste du temps (la minuterie fonctionne toujours automatiquement), vous pouvez regarder vos entrées de toute sorte ...
Vous pouvez toujours "moduler" votre onde carrée avec un PWM pour contrôler le "gain". Mais l'un d'eux doit être fait "à la main" car l'ATtiny13 ne dispose que d'un seul timer matériel ...
la source