PIC 18F258 et 50Hz (like PWM) en version MikroC 6.40

usage d'un PIC18F258 avec Q=20Mhz
ce PIC a une taille memoire RAM et EEPROM plus que confortable.
Le but est de generer du 50Hz avec un rapport cyclique variable de 2% à 98% avec une autre sortie complementaire

Pour cela, j'utilise 2 timers en mode interruption, car le MCU est censé pouvoir faire autre chose que de sortir le signal 50Hz
Le 1er timer , Timer1 16bits fixe la periode du signal à 20mS
Pour le pas de reglage du Duty Ratio, je l'ai fixé à 40µS de sorte à avoir un reglage sur 500 pas
500x40=20 000 µS => 20mS
L'organe de reglage est un potentiometre lineaire de 4,7K, curseue sur entree Ananlogique RA0 , reference 0V à +5V
on obtient don 0 à 1023 points, divisé par 2 via un decalage à droite 1024>>1 => 512
on limitera la reponse resultant du potentiometre à 10....490 , cette valeur correspondra à un nombre d'interruption de Timer0
Le timer1 calé sur 20mS, arme le front montant de la sortie 1 ( et l'inverse sur la sortie 2) et arme le timer 0
Le timer0 calé sur 40µS , apres N interruption ,( Le N provient de la lecture du Potar !) mettra la sortie au niveau bas et stopera toute nouvelle IT Timer0
jusqu'à la prochaine Interrupt Timer1 qui redeclanchera un autre cycle complet
Dans le main du programme, on dispose donc d'un certain temps pour faire autre chose
ex: afficher la valeur du N , issu du potentiometre , ou le transformer en % de 0 à 100% et un delay de 1 seconde!

Tests avec Pickit2 Logic Analyser

images/Duty_50Hz_Tests.jpg

Les tests motrent que je ne peux pas atteindre 490, pourtant bien inferieur à 500
Des la valeur >400 il y a un Overload et le signal est anormal
Ce qui signifierait que la tempo 40µS est bien superieure à 40µS !

En regardant le code Interrupt Timer0 de plus pres , je m'apercois que j'ai reinitialisé le compteur
à sa valeur de depart APRES tout le traitement interne à l'Interrupt
De ce fait je rajoute la duree de ce traitement , ce qui mene à 7,20µS AVANT d'initialiser à le compteur Tmr0
pour un nouveau cycle de .. 47.2µ Sec !

Modif:
mis la reinit compteur Timer0, toute de suite au debut de traitement de l'IT
Cette fois, c'est OK.. reglage possible jusqu'à 490
Il faudrait paufiner en ajustant finement le delai de 40µS ( - quelques cycles MCU)..pour etre parfait.

Amelioration:
L'Utilsation du Debugger MikroC et de l'outil Watch Clock pour mesurer les temps ecoules
L'appel de l'interrupt et test des 2 flags prend 2,8µs + le rechargement de Tmr0 soit 0.8µS => total= 3,6µS avant de recompter..
=> modif de l'init chargement Timer0
was 40µS soit 0xFF9C pour 65436 x 2 (prescaler) * 0,2µS (20Mhz)
is now 40.0 - 3.6 = 36.4 µS soit 0xFFA6 pour 65446







Results:
Duty=10 => 480µS ON au lieu de 400µS
Duty=490 =>20.000- 90 = 19.910 µS ON au lieu de 19.560
à la precision pret de l'outil Analyser Pickit2 !
Il faudrait AUSSI faire une analyse profonde du coté IT Timer1, qui risque de raboter ou allonger le Nb d'interrupt Timer0
Manipuler les µSeconde n'est pas si evident ...surtout en langage C

Le programme :
Source MikroC : 18F258_test_50HZ_duty_potar_140801.c
Chargeur : 18F258_50Hz_Duty.hex
Config : 18F258_20Mhz.cfgsch


paulfjujo@free.fr


Retour à l'index general