
| Vous êtes : (racine du site)
(Electronique)
> (Electronique en lycée)
|
|
GBF à PIC 16F876 ou PIC18F2520 (DDS or NCO with PIC 16F/18F) - Nombre de visite(s) : 7672 Date de mise à jour : dimanche 9 novembre 2008, par Dartois Olivier
Le prétexte de cette réalisationCette année nous avons choisi de faire comme deuxième projet pour les terminales un GBF à PIC. En fait il s’agit de faire de la synthèse directe de signal (DDS : Direct Digital synthesis en anglais) à partir du PIC par opposition aux oscillateurs "classiques" analogiques. Le cahier des charges est le suivant :
Il s’agit de faire découvrir à travers ce projet différentes fonctions de l’électronique :
J’ai donc réalisé un prototype qui se présente de la manière suivante (schéma structurel : isis 7.4 et routage :ares 7.4 disponible en fin d’article) :
Le GBF du thème est légèrement différent (2 boutons au lieu de 4, réglage plus précis de la tension d’offset, etc...). Le document de présentation de ce projet est disponible au format PDF à la fin de cet article. Mes notes de cours manuscrites ont été scannées et rassemblées dans un document PDF. Ces notes n’ont pas la prétention d’être parfaites, il faut les utiliser comme une aide à la construction du cours associé. La feuille de calcul OpenOffice Calc pour le filtre passe-bas ainsi que la simulation du convertisseur de tension sont aussi donnés. Enfin les sources C et les fichiers Hex compilés sont disponibles. Comme vous le verrez, la génération d’une fréquence avec la méthode utilisée dans les programmes est très imprécise (utilisation des fonctions delay_us et delay_ms), de plus on ne peut pas produire des fréquences supérieures au KHz avec 256 points. Le début d’un véritable générateur DDSJ’avais trouvé sur Internet différents projets de générateur DDS qui utilise un accumulateur de phase et des tables de forme d’ondes pour générer n’importe quel signal jusqu’à des fréquences de 65KHz.
Voici donc les deux liens qui m’ont inspiré pour la réalisation d’un véritable générateur DDS :
La théorie est présenté (en anglais) dans ces pages : Site du Dr Papay Zsolt Le premier essai est donc réalisé avec cette boucle en assembleur sur un PIC 16F876A et un quartz de 20MHz avec la carte précédente (boucle tirée du site de Richard J. Prinz à l’origine pour PIC16F84 puis adapté par mes soins sur PIC16F876, source assembleur complet et fichier HEX en fin d’article) : La boucle fait donc entre 21 et 25 cycles machines pour sortir un échantillon du signal, ce qui correspond en moyenne (si on prend 23 cycles) à ((1/20M)*4)*23= 4.6us avec un quartz à 20MHz. On obtient donc en sortie des signaux qui auront la précision en fréquence du quartz utilisé. Par exemple on obtient le signal sinusoidal suivant à 20KHz (trace 1) à la sortie du CNA R-2R :
La durée mesurée pour sortir un échantillon est bien conforme à celle attendue (en théorie aux alentours de 4.6us, ici 4.4us). Le problème est que l’on est déjà à la limite de fonctionnement du PIC16F876 à moins d’utiliser un quartz ou un oscillateur à une fréquence plus élevé mais dans ce cas on sort des spécifications de Microchip. Cependant cela fonctionne jusqu’à une certaine limite (voir le site de Paul FREYER). Passage à la vitesse supérieure : PIC18F2520De plus j’étais relativement déçu car on est encore très loin des performances obtenues avec un Atmel ATMega à 16MHz. Je décide donc de passer au PIC18, plus exactement au PIC18F2520 et d’optimiser la boucle assembleur avec les nouvelles instructions disponibles sur cette série. J’obtient finalement la boucle suivante (source asm et fichier HEX en fin d’article) : Soit exactement 14 cycles ce qui correspond à ((1/20M)*4)*14= 2.8 us avec le quartz à 20MHz. Le signal obtenu est visualisé sur la trace A ci-dessous. Comme vous pouvez le remarquer, le signal de sortie est plus propre (et toujours sans filtre de sortie). La durée pour sortir un échantillon est en théorie de 2.8us, en pratique cela semble correspondre :
Pourquoi s’arrêter en si bon chemin. J’avais à ma disposition un quartz 12MHz. Je remplace donc le quartz 20MHz par celui-ci et active la PLL interne du PIC18F (PLL x4). On obtient donc une fréquence interne de 48MHz. Je suis en dehors des spécifications de Microchip (normalement un quartz de 10MHz maximum si la PLL est activée). Mais cela fonctionne plutôt bien et est stable dans le temps (test pendant 24H mais pas au delà). On obtient alors le signal suivant :
La trace A correspond au signal sinus à 20KHz avec PIC18F2520 et quartz à 20MHz. La trace 1 correspond au signal sinus à 20KHz avec PIC18F2520 et quartz à 12MHz PLL activée soit 48MHz. La encore vous pouvez noter une nette amélioration du signal de sortie (et toujours sans filtrage). La durée pour sortir un échantillon vaut alors ((1/48M)*4)*14= 1.16us. Cependant l’alimentation du PIC est très bruité et je pense que l’on doit pouvoir faire mieux avec un réseau R-2R intégré, un plan de masse, une meilleure disposition des circuits, etc... Me voici donc parti pour réaliser un second prototype. GBF à PIC18F2520 Version 2 : Une nouvelle avancée... pas si sûr !!Au passage j’améliore l’interface Homme Machine avec l’utilisation d’un encodeur rotatif avec bouton et un écran LCD graphique de type Nokia 3310 et voila ce que ca donne :
Par contre je supprime le quartz externe au profit de l’oscillateur interne (donc au maximum j’aurais 8MHz par 4, soit 32MHz de fréquence d’horloge). Je récupère donc le port A dans son ensemble (les lignes OSC1 et OSC2 deviennent des lignes d’entrées/sorties) que je connecte au convertisseur numérique analogique, ici un DAC0800. Le port B est dédié à l’encodeur, au BP de l’encodeur et à la programmation (l’encodeur et le BP sont gérés sous interruptions INT_EXT1 et INT_RB pour ne pas perdre de temps dans la boucle du NCO). Le port C pilote l’afficheur LCD Nokia par le SPI hardware et une liaison série est possible vers un PC avec les lignes TX et RX disponibles sur ce port. J’en profite pour rajouter un plan de masse. Le schéma Isis et l’implantation Ares sont disponibles en fin d’article ainsi qu’un fichier PDF qui regroupe le schéma structurel, le typon et la liste des composants. Comme j’ai des routines toutes prêtes pour gérer l’afficheur LCD et que le compilateur C de CCS fourni de quoi gérer la voie série, je décide de passer à la programmation en C avec les parties critiques en assembleur. Une vidéo pas forcément très belle ni très parlante mais j’espère qu’elle sera exciter votre curiosité :
|
Dans la même rubrique :
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Visiter le site de l'académie de Limoges | Plan du site | Accueil | |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||