IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

PWM : Pulse Width Modulation


Sujet :

Raspberry Pi

  1. #21
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Citation Envoyé par f-leb
    Certes, y'a qu'à...
    Ma recommendation était juste pour ce test, et non dans une généralisation.

    Citation Envoyé par f-leb
    Je pense qu'on en sait maintenant beaucoup sur l'utilisation du pwm grâce à cette discussion
    Peut-être pour vous deux, mais pas pour moi.
    Pour des exercices comme les leds ou un servomoteurs, je veux bien.

    Mais la raspberry n'est pas faite pour contrôler plusieurs périphériques.
    Je découvre que je ne peux pas faire clignoter deux leds avec un paramétrage différents.
    Genre l'une qui clignote à 50% toutes les 1/2 secondes et l'autre à 25% toutes les secondes.
    Il y a bien deux canaux différents (PWM0 & PWM1) mais le paramétrage (pwmclock & pwmrange) est commun aux deux.

    Pour ce qui est de la compréhension, oui, je suis d'accord. Encore merci pour tes analyses qui m'ont bien aidé.

    Je me demande si au lieu d'utiliser le PWM de la Raspberry Pi, cela ne serait pas mieux de passer par une carte dédié à cela.
    Il n'y aura pas de "jitter" (variations du signal dû au fait que la raspberry ne soit pas en temps réel) et on aura un signal propre.
    Je ne serai pas limité par le nombre de sorties (pwm0 & pwm1 sur la raspberry).
    J'aurai 16 sorties. Sont-elles indépendantes ?
    Je ne serai pas obligé de passer par une prise spéciale pour y connecter des servomoteurs.
    Autrement dit, je ne risque pas d'abîmer les GPIO de la Raspberry.

    Et j'aurai surtout un datasheet complet sur ce produit :
    --> https://www.adafruit.com/product/815

    Je reviens sur nos quatre paramètres, à savoir :
    --> la fréquence de l'horloge (je parle du 19.2MHz).
    --> de l'horloge (pwmclock)
    --> de la plage (pwmrange)
    --> et de la consigne.

    1) d'après la documentation, je lis :
    Both modes clocked by clk_pwm which is nominally 100MHz, but can be varied by the clock manager.
    La valeur nominale de l'horloge est de 100MHz. D'où vient ce 19.2MHZ ?

    2) il semble que le "pwmrange" correspond aux registres RNG1 & RNG2 (selon le canal). La taille est de 32 bits.

    3) si je comprends bien le fonctionnement du PWM de la raspberry, je ne peux pas faire clignoter une led sur le premier canal à une certaine fréquence et une autre led sur le second canal à une autre fréquence.
    Ca limite le choix de ce que l'on peut faire !


    4) là où j'ai encore des difficultés est de comprendre comment l'analyseur interprète les résultats.
    4-a) comment modifier la fréquence de 19.2MHZ ? Dans la plupart des cas, ce n'est pas nécessaire.
    4-b) Le PWM modifie la fréquence en 50Hz. Voir le poste #2.
    Je prends comme exemple un rapport de 50%, histoire de simplifier le raisonnement.
    On peut obtenir 50Hz de plusieurs façons en faisant varier pwmclock et pwmrange.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +-------+-------+
    | clock | Range |
    +-------+-------+
    |   192 |  2000 |
    |   384 |  1000 |
    |   768 |   500 |
    |   960 |   400 |
    |  1536 |   250 |
    |  1920 |   200 |
    |   ... |   ... |
    +-------+-------+
    Qu'est-ce qui est le plus optimal ? Ou si tu préfères, un paramétrage stable.
    4-c) le pwmclock va de 2 jusqu'à 4095. Voir le poste #6, deuxième analyse.
    4-d) le pwmrange va de 2 jusqu'à 232- 1. C'est bien plus que ton 1 milliard.
    4-e) il y a le mark & space et le balanced.
    4-f) je ne vois que ces quatre paramètres (la fréquence 19.2MHz, pwmclock, pwmrange, la consigne) pour agir sur le PWM.

    5) il me reste à me procurer un oscilloscope pas cher.

    6) et pour terminer, trouver comment gérer le PWM avec libgpio (l'autre sujet).
    As-tu testé, enfin si cela t'intéresse, mon autre sujet sur les GPIO ?

    Je m'arrête là, car je vais tourner en rond avec mes questions.

    Merci à tous les deux pour vos explications.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  2. #22
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 619
    Points : 56 854
    Points
    56 854
    Billets dans le blog
    40
    Par défaut
    Salut,

    Réponse partielle, mais je risque de revenir...

    Citation Envoyé par Artemus24 Voir le message
    Mais la raspberry n'est pas faite pour contrôler plusieurs périphériques.
    Je découvre que je ne peux pas faire clignoter deux leds avec un paramétrage différents...
    Ici, c'est wiringPi qui est en cause.

    Avec la bibliothèque bcm2835, les deux canaux sont indépendants (seule l'horloge+diviseur est commune) :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    #include <stdlib.h>
    #include <bcm2835.h>
     
    #define PWM_CHANNEL0		0
    #define PWM_CHANNEL1		1
    #define PWM_MARKSPACE_MODE	1
    #define PWM_BALANCE_MODE	0
    #define PWM_ENABLED		1
     
    int main(){
    	if (!bcm2835_init())
    		return 1;
     
    	bcm2835_gpio_fsel(18, BCM2835_GPIO_FSEL_ALT5);
    	bcm2835_gpio_fsel(13, BCM2835_GPIO_FSEL_ALT0);
     
    	bcm2835_pwm_set_clock(BCM2835_PWM_CLOCK_DIVIDER_256); // diviseur 256 => 75 kHz
     
    	/* Channel 0 configuration */
    	bcm2835_pwm_set_mode(	PWM_CHANNEL0,
    							PWM_MARKSPACE_MODE,
    							PWM_ENABLED );
    	bcm2835_pwm_set_range(	PWM_CHANNEL0,
    							12);
    	bcm2835_pwm_set_data(	PWM_CHANNEL0,
    							6 ); // rapport cyclique = 50%, ms mode
     
    	/* Channel 1 configuration */ 
    	bcm2835_pwm_set_mode(	PWM_CHANNEL1,
    							PWM_BALANCE_MODE,
    							PWM_ENABLED );
    	bcm2835_pwm_set_range(	PWM_CHANNEL1,
    							12 );
    	bcm2835_pwm_set_data(	PWM_CHANNEL1,
    							3 ); // rapport cyclique = 25%, balance mode
     
    	return (EXIT_SUCCESS);		
    	}

    Nom : pwm2channels.png
Affichages : 201
Taille : 28,3 Ko

  3. #23
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 619
    Points : 56 854
    Points
    56 854
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    On peut obtenir 50Hz de plusieurs façons en faisant varier pwmclock et pwmrange.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +-------+-------+
    | clock | Range |
    +-------+-------+
    |   192 |  2000 |
    |   384 |  1000 |
    |   768 |   500 |
    |   960 |   400 |
    |  1536 |   250 |
    |  1920 |   200 |
    |   ... |   ... |
    +-------+-------+
    Je prends un cas plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +-------+-------+
    | clock | Range |
    +-------+-------+
    |    4  |    2  |
    |    2  |    4  |
    +-------+-------+
    Dans le 1er cas, le seul rapport cyclique possible est 50 % (si on excepte 0% et 100%)
    Dans le 2e cas, les rapports cycliques possibles sont 25%, 50% et 75%, tu as une meilleure résolution.

    Citation Envoyé par Artemus24 Voir le message
    D'où vient ce 19.2MHZ ?
    Il vient de là


    Ce quartz à 19,2 MHz (fréquence fixe) est l'horloge principale reliée au bcm2837. Il y a tout un routage vers des multiplicateurs/diviseurs de fréquence en interne pour dériver d'autres horloges (et là c'est configurable)

  4. #24
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Citation Envoyé par f-leb
    Ici, c'est wiringPi qui est en cause.
    Je ne pensais pas à WiringPi en particulier, mais bien d'ordre général.

    Citation Envoyé par f-leb
    Avec la bibliothèque bcm2835, les deux canaux sont indépendants (seule l'horloge+diviseur est commune) :
    Et pourtant, tu affirmes la même chose que moi : "(seule l'horloge+diviseur est commune)".

    Ce qui voudrait dire que la bibliothèque bcm2835 utilise une astuce pour attribuer à chaque canal son propre paramétrage.

    Citation Envoyé par f-leb
    Dans le 1er cas, le seul rapport cyclique possible est 50 % (si on excepte 0% et 100%)
    Dans le 2e cas, les rapports cycliques possibles sont 25%, 50% et 75%, tu as une meilleure résolution.
    La meilleure résolution serait celle qui a le pwmrange le plus grand.

    Sauf que je ne parlais pas de résolution, mais de stabilité.
    A moins que la stabilité est due au fait que la raspberry ne soit pas en temps réel.

    Citation Envoyé par f-leb
    Ce quartz à 19,2 MHz (fréquence fixe) est l'horloge principale reliée au bcm2837.
    C'était plutôt en rapport avec la documentation et les soi-disant 100MHz.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Module FTP.pm ?
    Par MSP dans le forum Modules
    Réponses: 4
    Dernier message: 04/08/2003, 15h49
  2. module Find
    Par martijan dans le forum Modules
    Réponses: 8
    Dernier message: 09/07/2003, 11h07
  3. cherche module ou langage pour récupérer des données audio..
    Par Ry_Yo dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 12/05/2003, 17h44
  4. PerlDoc sur une fonction d'un module
    Par lesouriciergris dans le forum Modules
    Réponses: 2
    Dernier message: 13/03/2003, 20h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo