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. #1
    Expert éminent sénior
    PWM : Pulse Width Modulation !
    Salut à tous.

    Je chercher à me renseigner sur le PWM (Pulse Width Modulation) de la raspberry Pi, en particulier sur la RPi 3B+.
    Pourquoi la RPi 3B+ ?
    Parce que je vais entreprendre dans un premier temps des manipulation à partir de la commande "GPIO" de Gordon (celui de WiringPi) en BASH.
    Il se trouve que cette commande n'est plus maintenue par son auteur mais fonctionne encore parfaitement avec la RPi 3B+ (mais pas avec la RPi 4B).

    En lisant ce que j'ai trouvé sur le net, les explications ne sont pas très claires.

    1) D'après ce que j'ai compris, il y a deux canaux, qui sont :
    --> PWM0 : broche 12 (GPIO18) et broche 32 (GPIO12).
    --> PWM1 : broche 33 (GPIO13) et broche 35 (GPIO19).

    2) on ne peut pas faire varier pour un même canal (par exemple PWM0) le GPIO12 dans un sens et le GPIO18 dans l'autre sens.
    Soit on utilise l'un des GPIO mais pas l'autre. Soit les deux GPIO fonctionnent de concert (j ne vois pas trop l'intérêt).

    3) L'horloge PWM de la Raspberry Pi a une fréquence de base de 19,2 MHz. Ce qui se traduit par 19.200.000 Hz.

    4) la fréquence que l'on cherche à obtenir est fonction de deux paramètres : pwmclock & pwmrange.
    Sauf que je n'ai rien trouvé de probant sur leur minimum et leur maximum.
    Quels sont leur minimum et maximum ?

    Il semble, pour pwmrange, que le minimum soit 2 et le maximum 1024.
    D'autre sujet donne comme maximum plutôt 4096, mais sans aucune certitude.

    5) la relation est donnée par la formule : "pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange".

    6) l'exemple type que l'on retrouve un peu partout est :
    --> pwmFrequency : 50Hz
    avec soit :
    --> pwmClock ....: 192
    --> pwmRange ....: 2000
    ou encore :
    --> pwmClock ....: 1920
    --> pwmRange ....: 200

    Ce qui donne 1/50 = 0.020 secondes, c'est-à-dire une période de 20 millisecondes.

    7) le PWM est relié à l'audio de la raspberry. Avec un casque branché sur la prise jack, on entend la fréquence.

    8) l'usage de ce PWM est soit :
    --> manipuler un servomoteur.
    --> contrôler un ventilateur.
    --> l'intensité lumineuse d'une led.
    --> je ne suis pas certain que l'on puisse faire de la musique, peut-être juste quelques sons.

    9) sur une breadborad, j'ai mis deux leds avec pour chacune une résistance de 300 ohms.
    La première sur le GPIO12 (broche 32) et la seconde sur la GPIO18 (broche 12).

    Voici le script bash pour le premier test :
    Code bash :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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #!/bin/bash
     
    # ======================== #
    # Broche 12 : GPIO18 (PWM) #
    # Broche 32 : GPIO12 (PWM) #
    # ======================== #
     
    PIN1=12         # Broche 32
    PIN2=18         # Broche 12
     
    # ======================== #
    #                          #
    # ======================== #
     
    function pause()
    {
            read -s -n 1 -p "."
    }
     
    function quit()
    {
            gpio -g pwm  $PIN1 0
            gpio -g mode $PIN1 IN
     
            gpio -g pwm  $PIN2 0
            gpio -g mode $PIN2 IN
     
            echo -e "\nThat's all folks!"
     
            exit 0
    }
     
    trap quit INT TERM QUIT
     
    # ======================== #
    #                          #
    # ======================== #
     
    gpio -g mode $PIN1 PWM
    gpio -g mode $PIN2 PWM
    gpio pwm-ms
     
    gpio pwmc  384
    gpio pwmr 1000
     
    clear
     
    for i in {0..1000..50}
    do
            gpio -g pwm $PIN1 $i
            pause
    done
     
    quit

    Je ne fais que varier la led N°1. Or les deux leds fonctionnent de concert.

    10) je n'ai pas trouvé grand chose d'intéressant sur le PWM :
    --> https://raspberrypi.stackexchange.co...tput-frequency

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

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

    Bonsoir,

    Avec une variante simplifiée :
    Code bash :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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #!/bin/bash
     
    # ======================== #
    # Broche 12 : GPIO18 (PWM) #
    # Broche 32 : GPIO12 (PWM) #
    # ======================== #
     
    PIN1=12         # Broche 32
    PIN2=18         # Broche 12
     
    # ======================== #
    #                          #
    # ======================== #
     
    function pause()
    {
            read -s -n 1 -p "."
    }
     
    function quit()
    {
            gpio -g pwm  $PIN1 0
            gpio -g mode $PIN1 IN
     
            gpio -g pwm  $PIN2 0
            gpio -g mode $PIN2 IN
     
            echo -e "\nThat's all folks!"
     
            exit 0
    }
     
    trap quit INT TERM QUIT
     
    # ======================== #
    #                          #
    # ======================== #
     
    gpio -g mode $PIN1 PWM
    gpio -g mode $PIN2 PWM
    gpio pwm-ms
     
    gpio pwmc  384
    gpio pwmr 1000
     
    clear
     
    i=250
    gpio -g pwm $PIN1 $i
    pause
     
    quit


    J'obtiens le résultat suivant à l'analyseur logique :


    fréquence du signal = 19,2x106/(384 x 1000) = 50 HZ (T = 1/50 = 0,02 s = 20 ms)

    rapport cyclique = 250 / 1000 = 25%, soit la largeur d'impulsion (durée à l'état haut sur 1 période) = 0.25 x 0,02 = 5 ms.

    Conforme à la demande Un analyseur logique 24MHz-8 channels à 10 balles (à défaut d'un oscillo), ça aide à comprendre

  3. #3
    Expert éminent sénior
    Salut f-leb.

    Merci pour les explications mais avec la formule du paragraphe 5) j'avais compris comme faire les calculs.
    J'avais aussi compris que le signal était carré, avec en premier, une phase ascendante puis ensuite une phase descendante.
    La largeur en temps de ces deux phases corrspond à l'inverse de cette fréquence, soit dans l'exemple 1/50 = 20ms.
    Et le rapport cyclique correspond à la phase ascendante.

    Ce que je ne connais pas, ce sont le minimum et le maximum de ces deux paramètres (pwmclock et pwmrang).

    Par contre, ce qui est intéressant, c'est "Un analyseur logique 24MHz-8 channels à 10 balles (à défaut d'un oscillo), ça aide à comprendre".
    Voici ce que j'ai trouvé chrz Gotronic, mais cela vaut dans les 44,90 € TTC.
    --> https://www.gotronic.fr/art-shield-o...m205-25672.htm

    Si tu as des documents expliquant le fonctionnement de ce pwm, je suis preneur.

    Je reviendrais plus tard sur ce sujet que j'ai ouvert, quand j'aurai compris comment l'utiliser avec libgpiod.

    Il n'y a pas grand monde dans le forum consacré aux systèmes embarqués.

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

  4. #4
    Responsable Modération

    Bonjour à tous

    Le PWM c'est un compteur qui s'incrémente, puis la valeur de sortie est déterminée par comparaison entre le compteur et la consigne (la variable i de l'exemple). Lorsque la consigne est supérieure au compteur la sortie vaut 1, lorsque la consigne est inférieure au compteur la sortie vaut 0.

    De mon interprétation pwmClock c'est le diviseur d'horloge qui détermine la fréquence d'incrémentation du compteur et pwmRange est la valeur maximale que le compteur va atteindre avant de repartir à 0. Pour être exact le compteur devrait couvrir la plage [0, pwmRange[. Dans l'exemple de FLeb, les 19.2MHz sont divisés par 384, la fréquence du compteur est de 50kHz et la donc la précision du PWM sera de 20µs. (si j'augmente de 1 la consigne du PWM -> j'augmente de 20µs la durée du pulse). Puis le compteur a comme limite 1000 et donc la fréquence u PWM est de 50kHz / 1000 = 50Hz, ou autrement dit il faut 1000 pas du compteur pour faire une période -> 1000 x 20µs = 20ms. Pour faire de la musique, il ne faut pas avoir la fréquence de base du PWM à la fréquence audible, mais en sur-fréquence puis jouer la fréquence de base avec la consigne. En audio classique le PWM est à 48, 96 ou 192 kHz et suivit d'un filtre passe bas au moins de 2ème ordre (LC) pour éviter d'envoyer le carré du PWM dans les haut-parleurs. Pour faire pareil en code, il faut récupérer l’interruption de reset du compteur qui permet de mettre à jour la consigne pour la période suivante. Si on veut jouer un signal Sinus à 48Hz avec un PWM à 48kHz (pour simplifier le calcul) il faut décomposer la sinusoide en 1000 points et les appliquer comme consignes. La première consigne c'est sin(2 Pi x 0/1000) -> = 0, la deuxième consigne c'est sin (2 Pi x 1/1000), la troisième consigne sin (2 Pi x 2/1000), etc. En générant du PWM de faible fréquence audible (de 20Hz à 20kHz pour les enfants) on génère plus ou moins un bruit de buzzer. Et il faut alors mettre la consigne PWM à 50%. Bonne suite Delias

  5. #5
    Responsable Arduino et Systèmes Embarqués

    Salut tous,

    J'avais ce schéma qui résume la situation avant la réponse de Delias (configuration left aligned):


    Un compteur qui évolue entre 0 et max=1000 à la fréquence 50 kHz et une valeur compare=250 par exemple.

    Pour l'analyseur logique https://www.amazon.fr/s?k=usb+logic+...f=nb_sb_noss_1

    Pour les valeurs mini/maxi je ne sais pas, mais je vais faire quelques tests...

  6. #6
    Responsable Arduino et Systèmes Embarqués

    Avec pwmclock=2, pwmrange=2, et rapport cyclique=50% (i=1 dans le programme bash),
    f = 19,2x106 / (2x 2) = 4,8 MHz

    La largeur de l'impulsion devrait être 1/(2 x 4,8x106) = 104 ns mais on observe 83 ns. Seulement, la période d'échantillonnage de mon analyseur (24 MHz) dans le meilleur cas est de 1/24x106= 42 ns, ce qui peut expliquer le défaut.


    Apparemment, on peut diviser la fréquence par 4096 au maxi.
    Avec pwmrange=2, et rapport cyclique=50%,
    f = 19,2x106 / (4096 x 2) = 2,344 kHz, soit une largeur d'impulsion = 1 / (2 x 2,344x103) = 0,2133 ms


    On peut obtenir des signaux pwm très lent.
    pwmclock=2, pwmrange=1 000 000 000 (1milliard!), et rapport cyclique=50% (i=500 000 000 dans le programme bash)
    f = 19,2x106 / (2 x 1 000 000 000) = 9,6 mHz (milliHertz), soit une période de 1/9,6x10-3=104,2 s ! Et le résultat est conforme. Je ne suis pas allé plus loin.

  7. #7
    Expert éminent sénior
    Salut à tous.

    Je tiens à préciser que je teste le "Pulse Width Modulation" matériel et non le logiciel qui doit se trouver dans la bibliothèque "WiringPi" de Gordon.
    Je ne sais pas trop si le principe reste le même, car coté matériel, il est fait usage des interruptions, sinon cela serait bloquant.

    Citation Envoyé par Delias
    (la variable i de l'exemple).
    Dans mon exemple, je fais varier la variable "i" pour visualiser l'effet PWM sur les deux GPIO18 et GPIO12 qui sont sur le même canal PWM0.
    Si j'avais utilisé d'autres GPIO, que ceux en PWM, je n'aurai pas eu l'effet escompté. Ou si vous préférez, les leds ne se seraient pas allumées.

    F-leb reprend mon exemple sans faire varier la variable "i". Autrement dit, il la force à 250.
    La persistance rétinienne entre en jeu, et nous avons l'impression de ne pas voir la led s'allumer et s'éteindre alternativement.
    D'où l'effet d'une diminution de l'intensité lumineuse.

    Citation Envoyé par Delias
    De mon interprétation ...
    Bien que je ne conteste pas ton interprétation, il me manque quelque chose d'important pour comprendre le fonctionnement de ce PWM.

    En premier lieu, comment être sûr de la fréquence de l'horloge de la Raspberry que l'on utilise dans le cadre du PWM bien sûr ?
    J'ai lu dans les didacticielles la valeur de 19.2MHz.
    Or en lisant le document "Broadcom.Datasheet.pdf" (en pièce jointe), la valeur serait plutôt de 100MHZ.
    Ce qui rend les résultats complètement différents !

    Ensuite, il y a deux valeurs que l'on nomme (dans le document) N et M.
    Disons que M est un nombre de pulsation, qui vont se répéter périodiquement.
    Et dans cette période M, nous aurons N pulsation où la sortie sera à 1 et M-N pulsations où la sortie sera à 0.

    Pour l'exemple donnée, N=4 et M=8.
    Le tableau stipule trois exemples dont le troisième serait correct ("good").
    Ce ne sont pas des "0" ou des "1" consécutifs, genre un "i" que varie de 0 jusqu'à M-1, avec "1" pour i>=N et zéro pour i<N, comme dans ("bad").
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    +------+---+---+---+---+---+---+---+---+---+---+---+---+
    | Bad  | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
    | Fair | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
    | Good | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
    +------+---+---+---+---+---+---+---+---+---+---+---+---+
    Mais plutôt une alternance de "1" et de zéro dans le genre si "i" est impair alors "1" sinon zéro (comme dans la ligne "good").
    Il y a un algorithme, mais celui-ci est tronqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    1. set context = 0
    2. context = context + N
    3. if (context >= M)
    		context = context - M
    		send 1
    	else
    cela s'arrête là, sans plus d'explication.
    Il y a une contradiction entre ce qui est dit et le résultat final.
    A moins que l'effet produit dépend d'un paramétrage.
    Dans le document, il est dit qu'il y a deux modes, soit pwm ou soit sérialiseur.
    Il semble aussi que le pwm contient deux modes qui sont msen=0 (par défaut) et msen=1 (celui indiqué dans ce sujet, l'envoi dit "bad").

    Ensuite, dans le document est abordé le remplissage des différents registres :
    --> CTL, STA, DMAC, RNG1, DAT1, FIF1, RNG2, DAT2

    En lisant le document, cela devient vit très compliqué à gérer.

    Si cela est possible, j'aimerai avoir plus de précision sur les résultats de vos analyses car vous avez certainement plus de matériels que moi.
    Entre autre :
    1) quel mode est utilisé ? (pwm ou serial), (alternance de 1 et de 0 ou alternance du groupe de 1 et du groupe de 0).
    2) comment être certain de la fréquence de l'horloge utilisée ?
    3) trouver le minimum et le maximum de pwmclock et pwmrange.

    Je m'aperçois qu'à partir d'une certain valeur, la led n'augmente plus sa luminosité.

    @+

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

  8. #8
    Expert éminent sénior
    Salut f-leb.

    Un très grand merci pour tes analyses !

    Nos deux messages ont été postés à la même heure (18H15).

    Dans la première analyse (poste #2), tu trouves trois résultats, qui sont conformes aux calculs.
    Dois-je comprendre que c'est ton analyseur qui a retrouvé ces chiffres ?
    Ou bien as-tu effectué un quelconque paramétrage de ton analyseur numérique ?

    Dans la deuxième analyse (poste #6), les résultats sont :
    --> W = 83.33 ns
    --> F = 4.8 MHz
    --> T = 0.2083 us

    Le paramétrage est :
    ==> hwmclock = 2
    ==> hwmrange = 2

    On retrouve bien :
    --> F = 19.2 MHz / ( 2 * 2 )
    --> F = 4.8 MHz.

    --> T = 1 / 4 800 000 Secondes
    --> T = 0.2083333 * 10-6 secondes.
    --> T = 0.2083333 micro secondes.

    Sauf ici :
    --> W = 0.2033333 * 10-6 secondes * 50%
    --> W = 0.1041666 * 10-6 secondes
    --> W = 0.1041666 micro secondes.
    --> W = 104.16666 nano secondes.

    Citation Envoyé par f-leb
    Seulement, la période d'échantillonnage de mon analyseur (24 MHz) dans le meilleur cas est de 1/24x106= 42 ns, ce qui peut expliquer le défaut.
    A bien comprendre, c'est ce que ton analyseur numérique lit.
    Pour moi, ce n'est pas une erreur mais ce que ta Raspberry Pi t'envoie.
    Si je fais le rapport entre 0.0833333 / 0.2083333, je trouve exactement 0,4. C'est ton rapport cyclique !

    Selon moi, c'est l'impulsion de base de la Raspberry Pi. On ne peut pas descendre plus bas.

    La bonne fréquence de l'horloge serait alors un multiple de ce 0.0833333 micro secondes, ce qui correspond à 1/12 micro secondes.
    Ne serais-tu pas par hasard sur une raspberry Pi 3B (sans le +) qui tourne à 1.2GHz ?

    Citation Envoyé par f-leb
    Apparemment, on peut diviser la fréquence par 4096 au maxi.
    Oui, il semble que cela soit le cas.

    Pour la troisième analyse, rien à dire, c'est conforme aux calculs.

    Peux-tu nous communiquer les références de ta raspberry pi ?
    Et comme je ne connais pas ton analyseur numérique, peux-tu expliquer comment tu procèdes.

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

  9. #9
    Responsable Modération

    Bonsoir à tous

    Entre la datasheet et le programme il y a l'OS, et oui c'est pratique pour programmer en Python ou en Batch, mais cela fout la m...de quand on attaque le bas niveau...

    Les 100MHz c'est de base, mais c'est configurable, et les mesures de F-Leb semble bien montré que cela est modifié par l'OS. Le cas 1 c'est bien un raté de l’analyseur qui est en sous échantillonnage. Il mesure à 0ns (état 1), 42ns (état 1), 84ns (état 1), 126ns (état 0), 168ns (état 0), etc.

    Les registres sont attaquable par l'OS (ring 0) ou les drivers (ring 1) mais pas par les programmes (ring 4 si je ne dis pas de conneries). Soit des fonctions sont prévues dans les appels systèmes et il faut les connaître, soit ce n'est pas prévu et tu es bon pour développer un driver (pour la théorie car dans les faits c'est inaccessible à 99% des programmateurs).

    Le PWM mesuré par F-Leb correspond à MSEN = 1 qui est un vrai PWM* adapté à la commande de puissance.
    L'algo partiellement montré correspond à MSEN = 0 qui produit un PWM sur-modulé adapté à un filtrage plus faible pour obtenir un signal analogique et utilisable en audio. La durée à 1 sur une période est égale au taux demandé par contre ce n'est pas un seul pulse mais plusieurs. L'algo indiqué doit être ce qui est implémenté matériellement pour le reproduire. Ce PWM a l'avantage d'avoir des harmoniques bien plus haute et donc plus facilement filtrable, par contre en ayant bien plus de commutation que le PWM, il est impraticable pour de la commande par transistor de puissance car les pertes de commutations vont prendre l’ascenseur. Il y a une petite explication car il est possible de définir soit-même cette séquence à sortir, mais dans ce cas c'est limité à 32 bits (correspondant à pwmRange !!!)

    * c'est un PWM à rampe parfois appelé Fast PWM, il existe aussi le PWM à triangle appelé généralement True PWM, non disponible ici et qui donne un meilleur résultat en cas de boucle de réglage rapide.

    Bonne suite

    Delias

  10. #10
    Responsable Arduino et Systèmes Embarqués

    Salut,

    Citation Envoyé par Artemus24 Voir le message
    Dans la première analyse (poste #2), tu trouves trois résultats, qui sont conformes aux calculs.
    Dois-je comprendre que c'est ton analyseur qui a retrouvé ces chiffres ?
    Ou bien as-tu effectué un quelconque paramétrage de ton analyseur numérique ?
    Ces petits analyseurs USB (une dizaine d'euros) sont du constructeur saleae (ou compatibles saleae) :

    Il faut un petit logiciel avec https://www.saleae.com/fr/downloads/ (Windows)

    Il n'y a pas grand-chose à paramétrer (fréquence d'échantillonnage à 24MHz par défaut, durée d'acquisition, démarrage sur front...), et un clic sur Start lance l'acquisition. Après acquisition, tu peux zoomer sur les courbes et relever les fréquences, largeur d'impulsion, etc en passant la souris sur les courbes.
    Le logiciel reconnait les protocoles standards : uart, spi, i2c...
    Je m'en suis servi ici pour décoder des trames spi :


    Mes essais ont été faits sur Raspberry Pi 3 B (sans le +)

    Citation Envoyé par f-leb Voir le message
    Avec pwmclock=2, pwmrange=2, et rapport cyclique=50% (i=1 dans le programme bash),
    f = 19,2x106 / (2x 2) = 4,8 MHz

    La largeur de l'impulsion devrait être 1/(2 x 4,8x106) = 104 ns mais on observe 83 ns. Seulement, la période d'échantillonnage de mon analyseur (24 MHz) dans le meilleur cas est de 1/24x106= 42 ns, ce qui peut expliquer le défaut.
    Le rapport cyclique demandé est bien de 50%. Si on constate un rapport de 40% seulement c'est bien, comme le confirme Delias, un défaut de l'analyseur dont la fréquence d'échantillonnage est trop faible ici étant donné la fréquence élevée du signal.
    (Comment peut-on mesurer précisément une largeur d'impulsion de 104 ns quand l'analyseur ne peut relever un échantillon que toutes les 42 ns seulement ?)


    Pour 10 balles, il ne faut pas trop lui en demander non plus

  11. #11
    Responsable Arduino et Systèmes Embarqués

    Citation Envoyé par Delias Voir le message
    Le PWM mesuré par F-Leb correspond à MSEN = 1 qui est un vrai PWM* adapté à la commande de puissance.
    L'algo partiellement montré correspond à MSEN = 0 qui produit un PWM sur-modulé adapté à un filtrage plus faible pour obtenir un signal analogique et utilisable en audio. La durée à 1 sur une période est égale au taux demandé par contre ce n'est pas un seul pulse mais plusieurs. L'algo indiqué doit être ce qui est implémenté matériellement pour le reproduire. Ce PWM a l'avantage d'avoir des harmoniques bien plus haute et donc plus facilement filtrable, par contre en ayant bien plus de commutation que le PWM, il est impraticable pour de la commande par transistor de puissance car les pertes de commutations vont prendre l’ascenseur. Il y a une petite explication car il est possible de définir soit-même cette séquence à sortir, mais dans ce cas c'est limité à 32 bits (correspondant à pwmRange !!!)
    Il me semble que ça correspond aux 2 modes : mark/space (le PWM classique) et balanced

  12. #12
    Expert éminent sénior
    Salut à tous.

    Un grand merci pour vos participations qui sont forts intéressantes.

    Citation Envoyé par Delias
    Les 100MHz c'est de base, mais c'est configurable,
    De quoi parles-tu ? De la Raspberry Pi ou de l'analyseur numérique de f-leb ?

    Citation Envoyé par Delias
    les mesures de F-Leb semble bien montré que cela est modifié par l'OS.
    Heu, je ne comprends pas.
    Il me semble que le paramétrage choisit par f-leb dans sa Raspberry Pi semble correspondre à ce que son analyseur numérique trouve, non ?

    Citation Envoyé par Delias
    Le cas 1 c'est bien un raté de l’analyseur qui est en sous échantillonnage.
    D'accord. Donc le 42ns, c'est l'impulsion de base de l'analyseur numérique de f-leb.
    A priori, toutes les mesures doivent être un multiple de cette impulsion de base.

    Citation Envoyé par Delias
    Le PWM mesuré par F-Leb correspond à MSEN = 1 qui est un vrai PWM* adapté à la commande de puissance.
    Que dois-je comprendre ? Que c'est la configuration par défaut.

    Citation Envoyé par Delias
    La durée à 1 sur une période est égale au taux demandé par contre ce n'est pas un seul pulse mais plusieurs.
    Oui, je suis d'accord, cela correspond à un multiple de cette impulsion de base.

    Citation Envoyé par Delias
    L'algo indiqué doit être ce qui est implémenté matériellement pour le reproduire.
    Comme il est incomplet, il est difficile de connaitre le fonctionnement de ce qui est implanté matériellement.
    Le reste de ton commentaire, je n'ai rien compris. Désolé de ne pas avoir un vernis électronique plus complet.

    Comme je n'ai pas encore testé ce PWM avec la bibliothèque libgpiod, il y a beaucoup de choses que je ne comprends pas.

    Citation Envoyé par f-leb
    Mes essais ont été faits sur Raspberry Pi 3 B (sans le +)
    C'est ce que j'ai déduis de mon raisonnement.
    Si tu fais le même genre de test mais sur une raspberry Pi 3B+ qui tourne à 1.4GHz, je suppose que tu ne trouveras pas le même résultat.

    Citation Envoyé par f-leb
    (Comment peut-on mesurer précisément une largeur d'impulsion de 104 ns quand l'analyseur ne peut relever un échantillon que toutes les 42 ns seulement ?)
    En faisant en sorte d'avoir coté Raspberry Pi et coté analyseur numérique, la même impulsion de base.
    42ns correspond à l'impulsion de base de ton analyseur numérique.
    A moins de me tromper, c'est une approximation de 1 / 24MHz, soit 41.666666 nano secondes ou encore 42 nano secondes.
    Dans ce cas, pour la raspberry Pi, c'est aussi une approximation de 1 / 19.2MHz, soit 52.083333 nano secondes ou encore 52 nano secondes.
    Le plus petit commun multiple entre 42 et 52 est 1092.

    Citation Envoyé par f-leb
    Pour 10 balles, il ne faut pas trop lui en demander non plus
    Oui, d'accord.

    Hormis les approximations dans les résultats, je trouve que c'est conforme aux calculs.
    La raspberry Pi 3B (sans le +) tourne à 1.2GHz. Or la formule a pour fréquence 19.2MHZ.
    A quoi correspond ce 19.2MHz dans la Raspberry Pi ?

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

  13. #13

  14. #14
    Responsable Modération

    Bonsoir à tous

    Citation Envoyé par Artemus24 Voir le message
    De quoi parles-tu ? De la Raspberry Pi ou de l'analyseur numérique de f-leb ?
    Je parle du Pi et de sa doc. Dans la doc c'est écrit que c'est de base 100MHz mais configurable par le gestionnaire des horloges la puce.

    Citation Envoyé par Artemus24 Voir le message
    Il me semble que le paramétrage choisit par f-leb dans sa Raspberry Pi semble correspondre à ce que son analyseur numérique trouve, non ?
    Le calcul de f-leb étant sur la base d'une horloge d'entrée de 19.2MHz, cela confirme que sur son Pi, l'horloge d'entrée dans le module PWM est bien de 19.2MHz et non de 100MHz et donc que l'OS est bien intervenu là dedans.

    Citation Envoyé par Artemus24 Voir le message
    D'accord. Donc le 42ns, c'est l'impulsion de base de l'analyseur numérique de f-leb.
    A priori, toutes les mesures doivent être un multiple de cette impulsion de base.
    Deux explications du problème:
    Repliement de spectre — Wikipédia
    Échantillonnage (signal) — Wikipédia

    Citation Envoyé par Artemus24 Voir le message
    Que dois-je comprendre ? Que c'est la configuration par défaut.
    Que dans le cadre du modèle de f-leb et de l'OS de f-leb, le signal PWM en sortie du Pi correspond au mode défini par MSEN = 1 et qui est un PWM prévu pour la commande de puissance (moteur, éclairage, etc.)

    Citation Envoyé par Artemus24 Voir le message
    Oui, je suis d'accord, cela correspond à un multiple de cette impulsion de base.
    Citation Envoyé par Artemus24 Voir le message
    Comme il est incomplet, il est difficile de connaitre le fonctionnement de ce qui est implanté matériellement.
    Le reste de ton commentaire, je n'ai rien compris. Désolé de ne pas avoir un vernis électronique plus complet.
    Non là personne n'a compris, je reviens plus tard avec des traces exemples. C'est plus ou moins le principe de fonctionnement du convertisseur analogique digital 1-bit utilisé en audio. L'algo qui est indiqué est l'algo implémenté dans la puce, mais qui peut également être utilisé pour remplir le mot de maximum 32 bits (qui a un FIFO de 16)

    Citation Envoyé par Artemus24 Voir le message
    En faisant en sorte d'avoir coté Raspberry Pi et coté analyseur numérique, la même impulsion de base.
    42ns correspond à l'impulsion de base de ton analyseur numérique.
    A moins de me tromper, c'est une approximation de 1 / 24MHz, soit 41.666666 nano secondes ou encore 42 nano secondes.
    Dans ce cas, pour la raspberry Pi, c'est aussi une approximation de 1 / 19.2MHz, soit 52.083333 nano secondes ou encore 52 nano secondes.
    Le plus petit commun multiple entre 42 et 52 est 1092.
    Ce calcul n'a aucune signification.
    Pour mesurer la fondamentale du signal PWM (et donc uniquement sa fréquence) l’échantillonnage doit avoir une fréquence au moins double, c'est le cas.
    Mais pour avoir une mesures comme le rapport cycle la fréquence échantillonnage doit être significativement supérieur à la fréquence du signal mesuré. Je renvoie aux deux pages Wikipédia en lien. De base c'est au minimum 10x, mais plus n'est pas gênant.
    L'important de cela c'est quand on lit la mesure de prendre en compte l'incertitude de lecture temporelle. Le logiciel trace une ligne, mais en fait il n'a que des points et entre-deux c'est extrapolé.

    Bonne soirée

    Delias

  15. #15
    Responsable Modération

    Bonsoir à tous

    Petite démonstration des signaux PWM (MSEN = 1) vs DAC 1 Bit (MSEN = 0).
    La représentation est faîte sous Excel et le défaut c'est que les transitions sont en pente et non droite, à vous de corriger cela à l'interpretation.
    Le cas est fait avec N = 64, N correspondant à pwmRange.
    Pour M = 10, M correspondant à la consigne:

    Pour M = 40

    Et pour M = 50


    En DAC 1 Bit, le signal n'est pas périodique et a une fréquence bien plus élevée.

    Le fichier excel qui a servit est joint pour ceux qui veulent jouer.

    Bonne soirée

    Delias

  16. #16
    Responsable Arduino et Systèmes Embarqués

    Code bash :Sélectionner tout -Visualiser dans une fenêtre à part
    gpio pwm-ms

    C'est le mode mark-space qui est sélectionné, celui vu jusqu'à maintenant pour la commande de puissance.

    avec un range=8 et un rapport cyclique = 50%, le pattern suivant est reproduit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1|1|1|1|0|0|0|0
     mark  |  space
    L'autre mode, c'est le mode balanced :
    Code bash :Sélectionner tout -Visualiser dans une fenêtre à part
    gpio pwm-bal


    avec un range=8 et un rapport cyclique = 50%, le pattern (obtenu avec l'algo) sera :
    Les impulsions sont "étalées" pour respecter le rapport cyclique.

    Avec un range=8 et un rapport cyclique = 37,5% (soit 3/8),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mode mark-space :
    1|1|1|0|0|0|0|0
    mark |  space
    
    mode balanced :
    0|0|1|0|0|1|0|1
    Le tout confirmé à l'analyseur logique.


    Sinon oui, l'horloge pwm semble fixée à 19,2 MHz sur Pi 3, mais je ne sais pas comment la configurer avec le clock manager.
    Sur un Pi 4, elle est fixée à 54 MHz, dommage pour la compatibilité... Ce sont sans doute des horloges internes (des quartz ?) sans rapport avec l'horloge du CPU.

  17. #17
    Expert éminent sénior
    Salut à tous.

    Citation Envoyé par Delias
    Je parle du Pi et de sa doc. Dans la doc c'est écrit que c'est de base 100MHz mais configurable par le gestionnaire des horloges la puce.
    Je comprends encore moins.

    Jusqu'à présent, j'ai cru comprendre que le 19.2MHz correspond à la fréquence de l'horloge qui est utilisé pour le PWM.
    Et non, la fréquence de l'horloge du CPU utilisé par la Raspberry Pi. Autrement dit, il y a deux horloges !
    Pouvez-vous me confirmer qu'il y a bien deux horloges dans la Raspberry Pi ?

    J'utilise la commande GPIO. Voici son help :
    Code : 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
    ~> gpio -h
    gpio: Usage: gpio -v
           gpio -h
           gpio [-g|-1] ...
           gpio [-d] ...
           [-x extension:params] [[ -x ...]] ...
           gpio [-p] <read/write/wb> ...
           gpio <mode/read/write/aread/awritewb/pwm/pwmTone/clock> ...
           gpio <toggle/blink> <pin>
           gpio readall
           gpio unexportall/exports
           gpio export/edge/unexport ...
           gpio wfi <pin> <mode>
           gpio drive <group> <value>
           gpio pwm-bal/pwm-ms
           gpio pwmr <range>
           gpio pwmc <divider>
           gpio load spi/i2c
           gpio unload spi/i2c
           gpio i2cd/i2cdetect
           gpio rbx/rbd
           gpio wb <value>
           gpio usbp high/low
           gpio gbr <channel>
           gpio gbw <channel> <value>
    ~>
    Citation Envoyé par f-leb
    Sinon oui, l'horloge pwm semble fixée à 19,2 MHz sur Pi 3, mais je ne sais pas comment la configurer avec le clock manager.
    Pour modifier l'horloge, si je ne me trompe pas, c'est la commande ci-après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ~> gpio clock
    Usage: gpio clock <pin> <freq>
    ~> gpio clock 18 100
    ~>
    Je n'ai aucune possibilité de vérifier si l'horloge passe à 100MHz.
    A part faire clignoter une led, je ne peux faire aucune analyse car j n'ai aucun matériel à ma disposition.

    Citation Envoyé par Delias
    ... et donc que l'OS est bien intervenu là dedans.
    La aussi, désolé, mais je ne comprends pas.

    Citation Envoyé par Delias
    Non là personne n'a compris
    Je vais essayer d'être clair.
    Nous avons une horloge qui va gérer le PWM.
    Sa fréquence est de 19.2MHz.
    Cela se traduit par une cadence dont le temps mis est de 1/19 200 000, soit 52.083333 nano secondes.
    Ce que j'entends par cadence, c'est (si je ne me trompe pas) ce que tu nommes une PULSE.
    C'est dans notre cas, le bit qui se met à '1' pour allumer une led.
    On ne peut pas aller plus vite que cette vitesse.
    Toutes les autres traitement sont des multiples de ce PULSE.
    Quand tu dis :
    Citation Envoyé par Delias
    La durée à 1 sur une période est égale au taux demandé par contre ce n'est pas un seul pulse mais plusieurs.
    Je comprends que le terme PULSE que tu utilises désigne la cadence, ou si tu préfères la vitesse la plus rapide pour traiter une unité de traitement.

    A partir de ce PULSE, toutes le reste est un multiple de ce PULSE, comme dans l'exemple ci-après :
    Citation Envoyé par Delias
    Il mesure à 0ns (état 1), 42ns (état 1), 84ns (état 1), 126ns (état 0), 168ns (état 0), etc.
    168ns, c'est quatre fois 42ns, donc quatre unités de traitement.

    Maintenant, si tu veux synchroniser tes deux horloges qui fonctionnent à deux vitesses différentes, comme par exemple, l'une à 42ns et l'autre à 52ns.
    Il faut trouver le plus petit commun multiple à 42 et 52, soit 1092 et s'alligner sur cette nouvelle vitesse, qui est plus lente.
    Cette nouvelle PULSE sera un multiple de 42 et de 52.
    --> 1092 / 42 = 26.
    --> 1092 / 52 = 21.
    (ce sont des nombres entiers)

    Les deux horloges étant synchronisées, tu n'auras pas une valeur erronée comme dans le deuxième exemple de f-leb.
    Tu vas me dire : comment fait-on cela ? Je suppose en passant son 24MHz à une autre valeur.

    Tant pis si ce n'est pas cela. Ca n'a aucune importante pour l'instant car je ne peux pas faire d'analyse numérique.

    Citation Envoyé par Delias
    Le cas est fait avec N = 64, N correspondant à pwmRange. Pour M = 10, M correspondant à la consigne:
    Dans le document, ce M représente le pwmrange et ce N la consigne. Enfin, je l'ai compris ainsi.
    J'avais compris la différence dans la façon de gérer ces 1 et ces 0 dans le cas MSEN=1 et MSEN=0.
    Dans MSEN=1, la led reste allumé les 10 premières impulsions et les 64-10 impulsions suivantes, la led s'éteint.
    Dans MSEN=1, on doit garder la même proportion, sauf que la répartition allumée/éteint est plus homogène.

    Citation Envoyé par f-leb
    C'est le mode mark-space qui est sélectionné,
    Citation Envoyé par f-leb
    L'autre mode, c'est le mode balanced :
    Merci pour l'information. A vrai dire, je n'ai pas trop cherché pour l'instant.

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

  18. #18
    Responsable Arduino et Systèmes Embarqués

    Salut,

    Citation Envoyé par Artemus24 Voir le message
    Jusqu'à présent, j'ai cru comprendre que le 19.2MHz correspond à la fréquence de l'horloge qui est utilisé pour le PWM.
    Et non, la fréquence de l'horloge du CPU utilisé par la Raspberry Pi. Autrement dit, il y a deux horloges !
    Pouvez-vous me confirmer qu'il y a bien deux horloges dans la Raspberry Pi ?
    Pas facile de savoir, ce n'est pas très documenté...
    J'ai trouvé une source qui en parle :

    Source https://www.tablix.org/~avian/blog/archives/2018/02/notes_on_the_general_purpose_clock_on_bcm2835/

    Une horloge (quartz) à 19,2MHz (est-ce la seule ?) dérivée en horloges internes utilisées par divers périphériques grâce à des multiplicateurs/diviseurs de fréquence.


    Citation Envoyé par Artemus24 Voir le message
    Maintenant, si tu veux synchroniser tes deux horloges qui fonctionnent à deux vitesses différentes, comme par exemple, l'une à 42ns et l'autre à 52ns....
    Tu n'y es pas, ce n'est pas un problème de synchronisation d'horloges. C'est un problème de fréquence d'échantillonnage en rapport avec la fréquence du signal que tu veux échantillonner.
    La fréquence du signal PWM qui pose problème est de 19,2/4=4,8 MHz. Pour un échantillonnage "correct", la fréquence d'échantillonnage de mon analyseur devrait être au moins 10x supérieure, disons 50 MHz au minimum. Mais mon analyseur à 10 euros ne dépasse pas 24 MHz.
    Le signal PWM du Pi est probablement correct, c'est l'outil de mesure qui atteint ses limites.

    Autre remarque de vocabulaire : MSEN=1=mode mark/space, MSEN=0=mode balanced

  19. #19
    Expert éminent sénior
    Salut à tous.

    C'est un sujet qui est plutôt difficile à traiter, il me semble.
    En résumé, je n'y comprends rien !

    Citation Envoyé par f-leb
    Pas facile de savoir, ce n'est pas très documenté...
    C'est ce que j'ai constaté aussi. J'ai passé toute l'après-midi à chercher des infos, sans succès.

    Citation Envoyé par f-leb
    La fréquence du signal PWM qui pose problème est de 19,2/4=4,8 MHz.
    Qu'est-ce qui t'empêche de mettre autre chose pour la Raspberry Pi ?

    Citation Envoyé par f-leb
    Pour un échantillonnage "correct", la fréquence d'échantillonnage de mon analyseur devrait être au moins 10x supérieure, disons 50 MHz au minimum.
    Ne change rien dans ton analyseur numérique qui reste à 24MHz. Mais pour la raspberry, tu prends 24MHz / 10, soit 2.4MHz.

    19.2 / 8 = 2.4 MHz.

    Si maintenant, tu veux garder les mêmes valeur que :
    --> pwmclock = 2
    --> pwmrange = 2

    Dans ce cas, tu dois faire passer l'horloge de 19.2MHz à 9.6MHz.

    9.6MHz / 4 = 2.4MHz.

    Citation Envoyé par f-leb
    Mais mon analyseur à 10 euros ne dépasse pas 24 MHz.
    Je ne vois pas en quoi l'analyseur pose problème.

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

  20. #20
    Responsable Arduino et Systèmes Embarqués

    Salut,

    Citation Envoyé par Artemus24 Voir le message
    Citation Envoyé par f-leb
    Mais mon analyseur à 10 euros ne dépasse pas 24 MHz.
    Je ne vois pas en quoi l'analyseur pose problème.
    Ben il pose problème quand les signaux analysés ont une fréquence qui dépasse quelques Mhz (cf. les problèmes de sous-échantillonnage, de repliement de spectre évoqués par Delias). Je te renvoie au signal PWM 4,8MHz rapport cyclique=50% dont l'analyseur retourne un résultat erroné.


    Citation Envoyé par Artemus24 Voir le message
    Ne change rien dans ton analyseur numérique qui reste à 24MHz. Mais pour la raspberry, tu prends 24MHz / 10, soit 2.4MHz.
    Certes, y'a qu'à... mais on ne génère pas des signaux uniquement pour le plaisir, certains utilisations nécessitent de hautes fréquences.
    Il est alors intéressant de savoir les limites en fréquence du pwm hardware du Pi.

    Je pense qu'on en sait maintenant beaucoup sur l'utilisation du pwm grâce à cette discussion

###raw>template_hook.ano_emploi###