Cours:TPS 2103 tp ampliAudio

De troyesGEII
Aller à : navigation, rechercher

Retour à la liste des Tps

Éléments de correction

Matériel

Nous utiliserons :

  • 1 carte arduino Leonardo (atmega32u4)
  • 1 plaque à essais
  • 1 résistance 39k
  • 3 condensateur
    • 1n
    • 10n
    • 100n
  • fils M-M
  • 1 oscilloscope
  • 1 sonde de tension
  • 1 ampli audio

PWM du TIMER4 d'un atmega32u4

Configuration de la PLL de l'atmega32u4

La gestion de l'horloge de l'atmega32u4 est plus complexe que les µcontroleurs que nous utilisons habituellement.

La fréquence d'horloge du CPU est ici de 16MHz.

Cependant, il existe dans le µcontrôleur différentes horloges dont les fréquences sont gérées par un module PLL.

Ceci est documenté dans les pages 27 à 42 de la datasheet officielle.

Nous ne nous intéresserons pas à cette partie, on utilisera juste le code suivant qui permettra d'avoir une fréquence de 64MHz pour l'horloge du Timer4.

PLLCSR |= (1<<PLLE)|(1<<PINDIV);
PLLFRQ =0;
PLLFRQ |= (1<<PDIV3)|(1<<PDIV1)|(1<<PLLTM1);

Mode PWM Timer4

On va utiliser la sortie OC4A sur la broche PC7. Cela correspond dans la numérotation arduino à la broche n°13 de la carte.

Il est à noter qu'une led est déjà connectée sur cette broche : c'est une led orange sérigraphiée L sur la carte arduino Leonardo.

PWM rapide sur broche OC4A

Todo.jpg Compléter votre programme en configurant le registre TCCR4A afin de :

  • activer le mode PWM sur la sortie OC4A
  • faire en sorte que la sortie soit à l'état 1 tant que la valeur du timer est inférieure à la valeur de comparaison

Prédiviseur

On souhaite avoir la fréquence de MLI la plus grand possible.

Todo.jpg Choisir le prédiviseur le plus adapté (p168) et modifier en conséquence votre programme

Fréquence de la MLI

La fréquence de la MLI dépend bien évidemment de la fréquence de l'horloge du Timer (64MHz ici) de la valeur du prédiviseur (définie précédemment) mais également de la valeur maximum que peut prendre le compteur du TIMER (cf p.153 Fast PWM mode)

Comme détaillé dans le tableau 15-18 p171, la valeur maximum du Timer (notée TOP) doit être définie dans le registre OCR4C.

Todo.jpg Calculer la valeur de OCR4C (rappel valeur maximum 255) pour obtenir une fréquence de MLI de 250kHz.

Todo.jpg Modifier le programme

Test

Question.jpg Vérifier le fonctionnement du mode PWM :

  • Il faudra utiliser un oscilloscope !
  • Incrémenter le rapport cyclique toutes les 500µs par exemple


Génération de signal et MLI

Filtrage

On souhaite mettre en place un filtre passe bas passif du 1er ordre dont la fréquence de coupure sera de l'ordre de 4kHz (beaucoup plus petite que la fréquence de la mli).

La résistance utilisée aura pour valeur 39k.

Question.jpg Choisir le condensateur adapté, câbler sur plaque à essais, et visualiser le signal après filtrage en conservant le programme précédent.

Sinusoïde

On souhaite désormais générer un signal sinusoïdal.

Il s'agit donc de faire varier le rapport cyclique régulièrement de sorte à ce que le signal filtré soit de forme sinusoïdal.

Todo.jpg On va utiliser un tableur pour calculer les valeurs successives du rapport cyclique (donc de OCR4A) :

  • Faire une colonne pour les valeur d'angle variant de 0° à 350° tous les 10°
  • Calculer les valeurs successives de OCR4A dans la colonne adjacente :
    • le rapport cyclique est choisi par la valeur de OCR4A
    • OCR4A peut varier entre 0 et 255
    • OCR4A est un entier
    • la sinusoïde tracée sur le tableur doit avoir une amplitude maximale


Question.jpg Modifier votre programme en :

  • déclarant un tableau contenant les valeurs précalculées dans le tableur
  • modifiant le rapport cyclique toutes les 500µs grâce au tableau

Todo.jpg Vérifier que vous obtenez bien une sinusoïde après filtrage

Suppression du "delay"

On souhaite utiliser un Timer pour modifier régulièrement la valeur du rapport cyclique. Le principe sera le suivant :

  • On utilise le Timer1 (16 bits)
  • On place le timer en mode CTC (datasheet p133)
  • On prendre la valeur 1 comme prédiviseur (datasheet p134)
  • Choisir la valeur de OCR1A pour avoir une sinusoïde à 440
  • On autorise l'interruption de comparaison OCIE1A (p137)
  • La routine d'interruption sera de la forme suivante :
ISR(TIMER1_COMPA_vect)
{
  // déclarer une variable static sur 8 bits qui sera la valeur d'angle (entre 0 et 35)
  ...
  // changer la valeur du rapport cyclique en utilisant le tableau
  OCR4A = ...;
  // incrémenter la valeur de l'angle, en ne dépassant pas 35 !
  ...
}

Question.jpg Faire les modifications et valider le fonctionnement

Jouons des notes

On va réaliser un modeste piano en utilisant 4 boutons.

Connectez ces 4 boutons à votre carte Leonardo, en utilisant 1 seul PORT :

Media:LeonardoPinout.pdf


Question.jpg Ecrire un programme qui change la fréquence de la sinusoïde (valeur de OCR1A) suivant le bouton appuyé.

Note Do Do# Ré# Mi Fa Fa# Sol Sol# La La# Si
Fréquence (Hz) 261,63 277,18 293,66 311,13 329,63 349,23 369,99 392 415,3 440 466,16 493,88
Période (µs) 3822 3608 3405 3214 3037 2863 2703 2551 2408 2273 2145 2025