- Qu'est-ce qu'un signal PWM?
- PWM utilisant PIC16F877A:
- Programmation PIC pour générer des signaux PWM:
- Schémas et tests:
- Travailler sur le matériel:
Ceci est notre 10ème tutoriel d' apprentissage des microcontrôleurs PIC utilisant MPLAB et XC8. Jusqu'à présent, nous avons couvert de nombreux tutoriels de base tels que le clignotement des LED avec PIC, les minuteries en PIC, l'interfaçage LCD, l'interfaçage à 7 segments, l'ADC utilisant PIC etc. Si vous êtes un débutant absolu, veuillez visiter la liste complète des tutoriels PIC ici et Commencer à apprendre.
Dans ce tutoriel, nous allons apprendre à générer des signaux PWM à l'aide de PIC PIC16F877A. Notre PIC MCU dispose d'un module spécial appelé module de comparaison de capture (CCP) qui peut être utilisé pour générer des signaux PWM. Ici, nous allons générer un PWM de 5 kHz avec un rapport cyclique variable de 0% à 100%. Pour faire varier le cycle de service, nous utilisons un potentiomètre, il est donc recommandé d'apprendre le didacticiel ADC avant de commencer avec PWM. Le module PWM utilise également des minuteries pour définir sa fréquence, apprenez donc à utiliser les minuteries au préalable ici. De plus, dans ce didacticiel, nous utiliserons un circuit RC et une LED pour convertir les valeurs PWM en tension analogique et l'utiliser pour atténuer la lumière LED.
Qu'est-ce qu'un signal PWM?
La modulation de largeur d'impulsion (PWM) est un signal numérique le plus couramment utilisé dans les circuits de commande. Ce signal est réglé haut (5v) et bas (0v) dans un temps et une vitesse prédéfinis. Le temps pendant lequel le signal reste haut est appelé «temps de marche» et le temps pendant lequel le signal reste bas est appelé «temps d'arrêt». Il existe deux paramètres importants pour un PWM, comme indiqué ci-dessous:
Cycle de service du PWM:
Le pourcentage de temps pendant lequel le signal PWM reste HAUT (temps d'activation) est appelé comme facteur de marche. Si le signal est toujours activé, il est en cycle de service de 100% et s'il est toujours désactivé, il est en cycle de service de 0%.
Cycle de service = temps d'activation / (temps d'activation + temps d'arrêt)
Fréquence d'un PWM:
La fréquence d'un signal PWM détermine à quelle vitesse un PWM complète une période. Une période est complète ON et OFF d'un signal PWM comme indiqué dans la figure ci-dessus. Dans notre tutoriel, nous définirons une fréquence de 5 KHz.
PWM utilisant PIC16F877A:
Les signaux PWM peuvent être générés dans notre microcontrôleur PIC en utilisant le module CCP (Compare Capture PWM). La résolution de notre signal PWM est de 10 bits, c'est-à-dire que pour une valeur de 0 il y aura un rapport cyclique de 0% et pour une valeur de 1024 (2 ^ 10) il y aura un rapport cyclique de 100%. Il y a deux modules CCP dans notre PIC MCU (CCP1 et CCP2), cela signifie que nous pouvons générer deux signaux PWM sur deux broches différentes (broches 17 et 16) simultanément, dans notre tutoriel, nous utilisons CCP1 pour générer des signaux PWM sur la broche 17.
Les registres suivants sont utilisés pour générer des signaux PWM à l'aide de notre MCU PIC:
- CCP1CON (registre de contrôle CCP1)
- T2CON (registre de contrôle de la minuterie 2)
- PR2 (registre de période des modules de la minuterie 2)
- CCPR1L (registre CCP 1 bas)
Programmation PIC pour générer des signaux PWM:
Dans notre programme, nous allons lire une tension analogique de 0-5v à partir d'un potentiomètre et la mapper à 0-1024 à l'aide de notre module ADC. Ensuite, nous générons un signal PWM avec une fréquence de 5000 Hz et faisons varier son cycle de service en fonction de la tension analogique d'entrée. C'est-à-dire que 0-1024 sera converti en cycle de service de 0% à 100%. Ce didacticiel suppose que vous avez déjà appris à utiliser ADC dans PIC sinon, lisez-le à partir d'ici, car nous passerons les détails à ce sujet dans ce didacticiel.
Ainsi, une fois que les bits de configuration sont définis et que le programme est écrit pour lire une valeur analogique, nous pouvons continuer avec PWM.
Les étapes suivantes doivent être suivies lors de la configuration du module CCP pour le fonctionnement PWM:
- Réglez la période PWM en écrivant dans le registre PR2.
- Définissez le cycle de service PWM en écrivant dans le registre CCPR1L et les bits CCP1CON <5: 4>.
- Faites de la broche CCP1 une sortie en effaçant le bit TRISC <2>.
- Définissez la valeur de pré-échelle TMR2 et activez Timer2 en écrivant dans T2CON.
- Configurez le module CCP1 pour le fonctionnement PWM.
Il existe deux fonctions importantes dans ce programme pour générer des signaux PWM. L'une est la fonction PWM_Initialize () qui initialisera les registres requis pour configurer le module PWM, puis définira la fréquence à laquelle le PWM doit fonctionner, l'autre fonction est la fonction PWM_Duty () qui définira le cycle de service du signal PWM dans les registres requis.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Définition des formules PR2 à l'aide de la feuille de données // Fait fonctionner le PWM dans 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Configurer le module CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Configurer le module Timer TRISC2 = 0; // créer la broche du port sur C comme sortie}
La fonction ci-dessus est la fonction d'initialisation PWM, dans cette fonction Le module CCP1 est configuré pour utiliser PWM en mettant les bits CCP1M3 et CCP1M2 à l'état haut.
Le prescaler du module de minuterie est établi en mettant le bit T2CKPS0 à l'état haut et T2CKPS1 à l'état bas, le bit TMR2ON est réglé pour démarrer le minuteur.
Maintenant, nous devons régler la fréquence du signal PWM. La valeur de la fréquence doit être écrite dans le registre PR2. La fréquence souhaitée peut être définie en utilisant les formules ci-dessous
Période PWM = * 4 * TOSC * (valeur de pré-échelle TMR2)
Réorganiser ces formules pour obtenir PR2 donnera
PR2 = (Période / (4 * Tosc * TMR2 Prescale)) - 1
On sait que Period = (1 / PWM_freq) et Tosc = (1 / _XTAL_FREQ). Par conséquent…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Une fois la fréquence définie, cette fonction n'a plus besoin d'être appelée à moins et jusqu'à ce que nous ayons à modifier à nouveau la fréquence. Dans notre tutoriel, j'ai assigné PWM_freq = 5000; afin que nous puissions obtenir une fréquence de fonctionnement de 5 KHz pour notre signal PWM.
Maintenant, définissons le cycle de service du PWM en utilisant la fonction ci-dessous
PWM_Duty (service int non signé) {if (devoir <1023) {devoir = ((float) devoir / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Lors de la réduction // du devoir = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = devoir & 1; // Stocke le 1er bit CCP1Y = duty & 2; // Stocke le 0ème bit CCPR1L = duty >> 2; // Stocke le 8 bits restant}}
Notre signal PWM a une résolution de 10 bits, par conséquent cette valeur ne peut pas être stockée dans un seul registre car notre PIC n'a que des lignes de données de 8 bits. Nous avons donc utilisé deux autres bits de CCP1CON <5: 4> (CCP1X et CCP1Y) pour stocker les deux derniers LSB, puis stocker les 8 bits restants dans le registre CCPR1L.
Le temps de cycle de service PWM peut être calculé en utilisant les formules ci-dessous:
Cycle de service PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (valeur de pré-échelle TMR2)
Réorganiser ces formules pour obtenir la valeur de CCPR1L et CCP1CON donnera:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
La valeur de notre ADC sera de 0 à 1024, nous avons besoin qu'elle soit comprise entre 0% et 100%, par conséquent, PWM Duty Cycle = duty / 1023. De plus, pour convertir ce cycle de service en une période de temps, nous devons le multiplier par la période (1 / PWM_freq)
On sait aussi que Tosc = (1 / PWM_freq), donc..
Duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
La résolution de l'équation ci-dessus nous donnera:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Vous pouvez consulter le programme complet dans la section Code ci-dessous avec la vidéo détaillée.
Schémas et tests:
Comme d'habitude, vérifions la sortie en utilisant la simulation Proteus. Le schéma de circuit est illustré ci-dessous.
Connectez un potentiomètre à la 7 e broche pour alimenter une tension de 0 à 5. Le module CCP1 est avec la broche 17 (RC2), ici le PWM sera généré qui peut être vérifié à l'aide de l'oscilloscope numérique. De plus, pour convertir cela en une tension variable, nous avons utilisé un filtre RC et une LED pour vérifier la sortie sans oscilloscope.
Qu'est-ce qu'un filtre RC?
Un filtre RC ou un filtre passe-bas est un circuit simple avec deux éléments passifs à savoir la résistance et le condensateur. Ces deux composants sont utilisés pour filtrer la fréquence de notre signal PWM et en faire une tension continue variable.
Si nous examinons le circuit, lorsqu'une tension variable est appliquée à l'entrée de R, le condensateur C commencera à se charger. Maintenant, en fonction de la valeur du condensateur, le condensateur prendra un certain temps pour se charger complètement, une fois chargé, il bloquera le courant continu (rappelez-vous que les condensateurs bloquent le courant continu mais autorise le courant alternatif), par conséquent, la tension continue d'entrée apparaîtra à travers la sortie. Le PWM haute fréquence (signal CA) sera mis à la terre via le condensateur. Ainsi, un courant continu pur est obtenu aux bornes du condensateur. Une valeur de 1000 Ohm et 1 uf s'est avérée appropriée pour ce projet. Le calcul des valeurs de R et C implique une analyse de circuit à l'aide de la fonction de transfert, ce qui est hors de portée de ce didacticiel.
La sortie du programme peut être vérifiée à l'aide de l'oscilloscope numérique comme indiqué ci-dessous, faites varier le potentiomètre et le cycle de service du PWM devrait changer. Nous pouvons également remarquer la tension de sortie du circuit RC à l'aide du voltmètre. Si tout fonctionne comme prévu, nous pouvons continuer avec notre matériel. Vérifiez davantage la vidéo à la fin pour le processus complet.
Travailler sur le matériel:
La configuration matérielle du projet est très simple, nous allons simplement réutiliser notre carte PIC Perf ci-dessous.
Nous aurons également besoin d'un potentiomètre pour alimenter la tension analogique, j'ai attaché des fils d'extrémité femelles à mon pot (illustré ci-dessous) afin que nous puissions les connecter directement à la carte PIC Perf.
Enfin, pour vérifier la sortie, nous avons besoin d'un circuit RC et d'une LED pour voir comment le signal PWM fonctionne, j'ai simplement utilisé une petite carte de perf et soudé le circuit RC et la LED (pour contrôler la luminosité) comme indiqué ci-dessous
Nous pouvons utiliser de simples fils de connexion femelle à femelle et les connecter selon les schémas ci-dessus. Une fois la connexion effectuée, téléchargez le programme sur le PIC à l'aide de notre pickit3 et vous devriez pouvoir obtenir une tension variable en fonction de l'entrée de votre potentiomètre. La sortie variable est utilisée pour contrôler la luminosité de la LED ici.
J'ai utilisé mon multimètre pour mesurer les sorties variables, nous pouvons également remarquer que la luminosité de la LED change pour différents niveaux de tension.
Voilà, nous avons programmé pour lire la tension analogique du POT et la convertir en signaux PWM qui à leur tour ont été convertis en tension variable à l'aide d'un filtre RC et le résultat est vérifié à l'aide de notre matériel. Si vous avez un doute ou si vous êtes coincé quelque part, veuillez utiliser la section commentaires ci-dessous, nous serons heureux de vous aider. Le travail complet fonctionne dans la vidéo.
Consultez également nos autres tutoriels PWM sur d'autres microcontrôleurs:
- Tutoriel PWM Raspberry Pi
- PWM avec Arduino Due
- Gradateur LED basé sur Arduino utilisant PWM
- Variateur de puissance LED utilisant le microcontrôleur ATmega32