Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

PWM 16F877 -16F887
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » lun. 5 oct. 2020 19:56

Bonsoir à tous,


au vu de cette remarque sybilline concernant le postscaler TMR2

Timer2_behavior_16F877_16887.jpg


Que veut donc dire cette phrase ?
Le postscaler pourrait etre utilisé pour avoir une frequence de rafraichissement servo,
differente de celle de la sortie PWM


je me disais que ce serai pas mal de pouvoir utiliser le postcaler TMR2
pour avoir un grande dynamique de reglage PWM
surtout vers le Bas , pour un Servomoteur par exemple
quand on garde un FOSC élevé (ie 20Mhz) pour le reste de l'application

Hors celui ci n'est pas utilié en PWM !

J'ai verifié par des tests avec un 16F877 et un 16F887 monté
sur une carte Microchip IRDA Board Demo1
avec 20Mhz (16F877) et Fosc interne 8MHz pour le 16F887

Aucune interaction avec POSTSCALER ..



Programme de test dispo ICI,
avec Terminal pour choix de Prescaler 1/1,1/4,1/16 (commandes predefinies HI,ME,LO)
et valeur de Duty cycle 1 à 254 via clavier (ANA OFF)ou via Potar sur EA0 (ANA ON)

Gamme de PWM de 490Hz à 200KHz (avec perte de resolution)
voir 1MHz sur 2 bits avec FOSC=20Mhz
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

PWM 16F877 -16F887
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » mar. 6 oct. 2020 02:42

Bonsoir,

paulfjujo a écrit :Source du message Le postscaler pourrait être utilisé pour avoir une fréquence de rafraichissement servo

C'est un diviseur supplémentaire pour Timer2, ça te permets d'avoir plus de réglage, car le timer2 ne compte pas aussi haut que le timer1

Et... ils ont raison dans ce qu'ils disent, parce qu'il y a deux diviseurs que tu peux régler indépendamment.


==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

PWM 16F877 -16F887
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » mar. 6 oct. 2020 13:42

Bojour TempsX et à tous

Temps-x a écrit :Et... ils ont raison dans ce qu'ils disent, parce qu'il y a deux diviseurs que tu peux régler indépendamment.



oui, j'ai bien compris qu'il y avait le prescaler et le postscaler sur ce timer2
permettant donc une division maxi de 16x16=256 ... de FOSC/4
mais le postscaler n'est reservé qu'à la fonction comptage ou timer .. pas au PWM
d'apres mes tests et annotations sur la datasheet le precisant..

Mon questionnement repose sur l'autre explication disant qu'il pourrait être utilisé pour un servo ?

dans ce cas de figure , je pense qu'on ne serait pas en PWM ,
mais uniquement en "Timer" et gestion des interruptions
pour gérer ce fameux "servo"

je l'utilise (le timer2) par ailleur dans un programme 18F26K22
pour gérer 2 servo
Le Timer 2 faisant la base de temps 20mS
//Prescaler 1:16; Postscaler 1:10; TMR2 Preload = 250;
// Actual Interrupt Time : 20.005 ms at 8MHz


mais on perd tout l'avantage du PWM Hardware ... qui sort son signal SANS bouffer des cycles MCU .
Aide toi, le ciel ou FantasPic t'aidera

PWM 16F877 -16F887
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#4 Message par Temps-x » mer. 7 oct. 2020 02:24

Bonsoir paulfjujo, et tout le forum,

Il est vrai que je n'ai jamais fait l'essai avec le Postscaler

Dans l'exemple ci-dessous avec Pic18F26K22 j'avais utilisé le Prescaler avec une division de 16, et le Postscaler été à zéro pour PWM

Code : Tout sélectionner


      movlw    D
'99'                      ; réglage du "débordement" de TMR2 
      movwf    PR2                        
; PR2 D'99' donc fréquence à 1250 Hz avec prédiviseur à 16
                                  
      movlw B
'00000110'                   ; diviseur (prescaler par 16) pour réduire ou augmenter pwm
      movwf T2CON                         
; 
                                         
      movlw B
'00001100'                   ; "1100" 4 bits mode pwm, "00" 2 bits pour variation du rapport cyclique
      movwf CCP1CON                       
; pwm sur RC2
      movwf CCP2CON                       
; pwm sur RC1    



Je vais faire un essai cette semaine avec Pic18F26K22, en mettant le Postscaler avec une division de 16, et Prescaler à zéro avec PWM

Normalement avec quartz de 4 Mhz et 2 timer, on doit pouvoir gérer 8 servos, sans aucun problème, on pourrait même aller jusqu’à 10, mais bon faut laisser de la marge.

paulfjujo a écrit :Source du message Mon questionnement repose sur l'autre explication disant qu'il pourrait être utilisé pour un servo ?

:roll: Oui.... mais il précise pas dans quelle condition, et là... est tout le problème..

paulfjujo a écrit :Source du message Que veut donc dire cette phrase ?

Ah l'anglais...... :furieux:

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

PWM 16F877 -16F887
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#5 Message par satinas » mer. 7 oct. 2020 09:47

Bonjour à tous
je pense que cela veut juste dire que l'on peut mettre à jour la position des servos à une fréquence fixe, sous-multiple de celle des signaux PWM, pour moins solliciter la cpu.
Les signaux PWM ont une période de 20ms. En utilisant le postscaler on déclenche l'interruption timer au choix toutes les 20, 40, ..., 320ms. C'est à ce moment qu'on met à jour les rapports cycliques des signaux PWM.
Comme le PWM a une résolution de 10 bits, il vaut mieux utiliser un double buffer, pour éviter des problèmes si l'interruption se produit pendant que le programme stocke les nouvelles positions servo.

PWM 16F877 -16F887
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » mer. 7 oct. 2020 11:40

bonjour à tous,

satinas a écrit :Bonjour à tous
je pense que cela veut juste dire que l'on peut mettre à jour la position des servos à une fréquence fixe, sous-multiple de celle des signaux PWM, pour moins solliciter la cpu.
Les signaux PWM ont une période de 20ms. En utilisant le postscaler on déclenche l'interruption timer au choix toutes les 20, 40, ..., 320ms. C'est à ce moment qu'on met à jour les rapports cycliques des signaux PWM.
Comme le PWM a une résolution de 10 bits, il vaut mieux utiliser un double buffer, pour éviter des problèmes si l'interruption se produit pendant que le programme stocke les nouvelles positions servo.


OK , sur ce point de vue, surtout avec plusieurs Servos, avec le bit TMR2IF sortant du Postscaler pour lancer l'interrupt ...
Merci ! :+1: C'est une explication qui tient la route .
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 37 invités