{"id":3670,"date":"2013-07-06T08:30:05","date_gmt":"2013-07-06T07:30:05","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=3670"},"modified":"2013-07-06T09:17:55","modified_gmt":"2013-07-06T08:17:55","slug":"beaglebone-black-et-pwm","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2013\/07\/06\/beaglebone-black-et-pwm\/","title":{"rendered":"BeagleBone Black et PWM"},"content":{"rendered":"<p style=\"text-align: justify;\">Je me suis int\u00e9ress\u00e9 aux sorties <strong>PWM du BeagleBone Black<\/strong>. Quatre d&rsquo;entre elles sont directement accessibles sur les connecteurs d&rsquo;extension P8 et P9. L&rsquo;acc\u00e8s en est encore relativement simple. En revanche pour les deux autres, il a fallu que j&rsquo;explore le fonctionnement du <em>Device Tree<\/em> d\u00e9crivant les entr\u00e9es-sorties du BeagleBone Black, ce que j&rsquo;aborderai dans un autre article.<br \/>\n<!--more-->\n<\/p>\n<h1>Premi\u00e8re sortie PWM<\/h1>\n<p style=\"text-align: justify;\">Une <strong>sortie PWM<\/strong> (<em>Pulse Width Modulation<\/em>) est une broche sur laquelle on programme un signal p\u00e9riodique avec un rapport cyclique configurable. Le <strong>rapport cyclique<\/strong> (g\u00e9n\u00e9ralement not\u00e9 <strong>\u03b1<\/strong>) est le rapport entre la dur\u00e9e du niveau haut (<strong>T<sub>H<\/sub><\/strong> sur le sch\u00e9ma ci-dessous) et la p\u00e9riode <strong>T<\/strong> du signal.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/duty_cycle.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-3689 alignnone\" alt=\"Rapport cyclique\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/duty_cycle.png\" width=\"409\" height=\"102\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/duty_cycle.png 409w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/duty_cycle-300x74.png 300w\" sizes=\"auto, (max-width: 409px) 100vw, 409px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Lorsque la dur\u00e9e du signal au niveau haut (+3,3V sur le BeagleBone Black) est \u00e9gale \u00e0 celle du niveau bas, le rapport cyclique vaut 1\/2 et une mesure moyenne de la tension aux bornes de la sortie PWM donnera 3,3\/2 = 1,65V.<\/p>\n<p style=\"text-align: justify;\">Il y a quatre sorties PWM directement visibles sur les connecteurs P8 et P9 du BeagleBone Black&nbsp;:<\/p>\n<ul>\n<li>PWM 1A sur la broche 14 du port P9<\/li>\n<li>PWM 1B sur la broche 16 du port P9<\/li>\n<li>PWM 2A sur la broche 19 du port P8<\/li>\n<li>PWM 2B sur la broche 13 du port P8<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Je choisis par exemple d&rsquo;utiliser le <strong>PWM 1A<\/strong>. Nous pouvons prendre la masse GND sur la broche 1 ou 2 du connecteur P9. Nous devons commencer par activer le support des PWM dans le <em>Cape Manager<\/em> du BeagleBone.<\/p>\n<pre># <strong>cd \/sys\/devices\/bone_capemgr.*<\/strong>\n# <strong>pwd<\/strong>\n\/sys\/devices\/bone_capemgr.8\n# <strong>echo am33xx_pwm &gt; slots<\/strong>\n# <strong>cat slots<\/strong>\n 0: 54:PF---\n 1: 55:PF---\n 2: 56:PF---\n 3: 57:PF---\n 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G\n 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI\n 6: ff:P-O-L Override Board Name,00A0,Override Manuf,am33xx_pwm\n#<\/pre>\n<p style=\"text-align: justify;\">Le suffixe num\u00e9rique dans le nom de r\u00e9pertoire <code>bone_capemgr<\/code> (ici&nbsp;: <code>8<\/code>) peut varier suivant les BeagleBones aussi j&rsquo;utilise l&rsquo;ast\u00e9risque du shell pour le contourner. Nous voyons bien appara\u00eetre un composant <code>am33xx_pwm<\/code> dans les slots.<\/p>\n<p style=\"text-align: justify;\">Activons la sortie PWM 1A qui se trouve sur la broche <strong>P9-14<\/strong>.<\/p>\n<pre># <strong>echo bone_pwm_P9_14 &gt; slots<\/strong>\n# cat slots \n 0: 54:PF--- \n 1: 55:PF--- \n 2: 56:PF--- \n 3: 57:PF--- \n 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G\n 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI\n 6: ff:P-O-L Override Board Name,00A0,Override Manuf,am33xx_pwm\n 7: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P9_14\n#<\/pre>\n<p style=\"text-align: justify;\">\u00c0 nouveau une entr\u00e9e est apparue pour repr\u00e9senter le PWM. \u00c0 ce moment, une tension +3.3V est mesurable sur la broche P9-14.<\/p>\n<pre># <strong>cd \/sys\/devices\/ocp.2\/pwm_test_P9_14.*  <\/strong>\n# <strong>ls -l<\/strong>\ntotal 0\nlrwxrwxrwx 1 root root    0 Jan  1 00:10 driver -&gt; ..\/..\/..\/bus\/platform\/drivert\n-rw------- 1 root root 4096 Jan  1 00:12 duty\n-r--r--r-- 1 root root 4096 Jan  1 00:12 modalias\n-rw------- 1 root root 4096 Jan  1 00:12 period\n-rw------- 1 root root 4096 Jan  1 00:12 polarity\ndrwxr-xr-x 2 root root    0 Jan  1 00:12 power\n-rw------- 1 root root 4096 Jan  1 00:12 run\nlrwxrwxrwx 1 root root    0 Jan  1 00:12 subsystem -&gt; ..\/..\/..\/bus\/platform\n-rw-r--r-- 1 root root 4096 Jan  1 00:10 uevent\n# <strong>cat period <\/strong>\n500000\n# <strong>cat duty <\/strong>\n0\n#<\/pre>\n<p style=\"text-align: justify;\">La p\u00e9riode ainsi que la dur\u00e9e du niveau haut sont exprim\u00e9es en <strong>nanosecondes<\/strong>. La p\u00e9riode par d\u00e9faut est donc de <strong>500 microsecondes<\/strong>.<\/p>\n<p style=\"text-align: justify;\">Modifions la dur\u00e9e de <code>duty<\/code>.<\/p>\n<pre># <strong>echo 500000 &gt; duty   <\/strong>\n#<\/pre>\n<p style=\"text-align: justify;\">\u00c9tonnamment, le signal qui se trouvait au niveau +3.3V alors que <code>duty<\/code> valait z\u00e9ro, redescend \u00e0 0V lorsqu&rsquo;on fixe <code>duty<\/code> \u00e0 la m\u00eame dur\u00e9e que la p\u00e9riode. Nous voyons qu&rsquo;il existe un champ <code>polarity<\/code>, v\u00e9rifions sa valeur et essayons de la modifier.<\/p>\n<pre># <strong>cat polarity <\/strong>\n1\n# <strong>echo 0 &gt; polarity <\/strong>\n#<\/pre>\n<p style=\"text-align: justify;\">Le signal remonte bien \u00e0 +3.3V, ce qui semble plus logique.<\/p>\n<pre># <strong>echo 0 &gt; duty <\/strong>\n#<\/pre>\n<p style=\"text-align: justify;\">La sortie redescend \u00e0 z\u00e9ro.<\/p>\n<p style=\"text-align: justify;\">Essayons \u00e0 pr\u00e9sent de modifier le niveau de <code>duty<\/code>.<\/p>\n<pre># <strong>echo 200000 &gt; duty <\/strong>\n#<\/pre>\n<p style=\"text-align: justify;\">Nous voyons sur l&rsquo;oscilloscope un net signal de p\u00e9riode 500 microsecondes, dont le niveau haut dure 200 microsecondes.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3696\" alt=\"PWM BeagleBone Black\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-01.png\" width=\"400\" height=\"300\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-01.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-01-300x225.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Si on mesure la valeur de sortie avec un voltm\u00e8tre simple, on voit une tension de +1,32V, ce qui correspond \u00e0 2\/5 de +3,3V.<\/p>\n<p style=\"text-align: justify;\">En modifiant dans <code>duty<\/code> la dur\u00e9e accord\u00e9e au niveau haut, on peut faire varier en sortie la <strong>tension moyenne<\/strong>, et faire ainsi fluctuer par exemple l&rsquo;intensit\u00e9 lumineuse d&rsquo;une led.<\/p>\n<h1>Pr\u00e9cision de la p\u00e9riode<\/h1>\n<p style=\"text-align: justify;\">Le signal affich\u00e9 sur la sortie du PWM est g\u00e9n\u00e9r\u00e9 enti\u00e8rement par le mat\u00e9riel, sans intervention du noyau Linux, aussi est-il parfaitement stable quelque soit la charge du syst\u00e8me. Je voudrais quand m\u00eame v\u00e9rifier la <strong>pr\u00e9cision<\/strong> avec laquelle on peut r\u00e9ellement fixer la p\u00e9riode. Pour cela, je vais tester des p\u00e9riodes de dur\u00e9es d\u00e9croissantes, en observant le signal \u00e0 l&rsquo;oscilloscope. Comme la dur\u00e9e <code>duty<\/code> ne doit jamais \u00eatre sup\u00e9rieure \u00e0 la p\u00e9riode, je commence syst\u00e9matiquement par diminuer celle-ci.<\/p>\n<h2 style=\"text-align: justify;\">Signal \u00e0 10kHz<\/h2>\n<pre># <strong>echo  50000 &gt; duty<\/strong> \n# <strong>echo 100000 &gt; period<\/strong>\n#<\/pre>\n<p style=\"text-align: justify;\">Nous observons un beau signal de <strong>100 microseconde<\/strong>s de p\u00e9riode.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3700\" alt=\"PWM BeagleBone Black 2\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-02.png\" width=\"400\" height=\"300\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-02.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-02-300x225.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<h2 style=\"text-align: justify;\">Signal \u00e0 100 kHz<\/h2>\n<pre># <strong>echo  5000 &gt; duty<\/strong> \n# <strong>echo 10000 &gt; period<\/strong>\n#<\/pre>\n<p style=\"text-align: justify;\">Le signal de <strong>10 microsecondes<\/strong> de p\u00e9riode est toujours aussi net.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3701\" alt=\"PWM BeagleBone Black 3\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-03.png\" width=\"400\" height=\"310\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-03.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-03-300x232.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<h2 style=\"text-align: justify;\"><\/h2>\n<h2 style=\"text-align: justify;\">Signal \u00e0 1 MHz<\/h2>\n<pre># <strong>echo  500 &gt; duty<\/strong> \n# <strong>echo 1000 &gt; period<\/strong>\n#<\/pre>\n<p style=\"text-align: justify;\">Quelques effets capacitifs apparaissent sur les fronts des signaux, probablement dus aux sondes et aux prises grip-fils que j&rsquo;ai utilis\u00e9es. Le signal a une fr\u00e9quence de <strong>1 MHz<\/strong> et reste parfaitement stable.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-04.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3703\" alt=\"PWM BeagleBone Black 4\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-04.png\" width=\"400\" height=\"310\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-04.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-04-300x232.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<h2 style=\"text-align: justify;\"><\/h2>\n<h2 style=\"text-align: justify;\">Signal \u00e0 10 MHz<\/h2>\n<pre># <strong>echo  50 &gt; duty<\/strong> \n# <strong>echo 100 &gt; period<\/strong>\n#<\/pre>\n<p style=\"text-align: justify;\">A <strong>10MHz<\/strong>, nous atteignons les limites de mon oscilloscope portable et le signal affich\u00e9 est tr\u00e8s d\u00e9form\u00e9. Toutefois il conserve une bonne stabilit\u00e9.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-05.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3704\" alt=\"PWM BeagleBone Black 5\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-05.png\" width=\"400\" height=\"300\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-05.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-05-300x225.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<h2 style=\"text-align: justify;\"><\/h2>\n<h2 style=\"text-align: justify;\">Pr\u00e9cision de la p\u00e9riode<\/h2>\n<p style=\"text-align: justify;\">En revenant \u00e0 un signal de 1MHz, je vais faire une petite exp\u00e9rience&nbsp;: chercher le \u00ab\u00a0pas\u00a0\u00bb minimal avec lequel on peut fixer la dur\u00e9e du niveau <code>duty<\/code>. Pour cela, je vais la faire varier entre 200 et 400 nanosecondes, en faisant une pause d&rsquo;un dixi\u00e8me de seconde entre chaque valeur.<\/p>\n<pre># <strong>echo  1000 &gt; period<\/strong> \n# <strong>for i in $(seq 200 400) ; do echo $i &gt; duty; usleep 100000; done<\/strong><\/pre>\n<p style=\"text-align: justify;\">J&rsquo;observe alors que le front descendant du signal, bien qu&rsquo;assez bruit\u00e9 par les effets capacitifs, avance r\u00e9guli\u00e8rement, par de petits sauts toutes les secondes.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-06.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3707\" alt=\"PWM BeagleBone Black 6\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-06.png\" width=\"400\" height=\"300\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-06.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-06-300x225.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">En zoomant plus serr\u00e9, je peux alors v\u00e9rifier et m&rsquo;assurer que <strong>la p\u00e9riode et la dur\u00e9e de <code>duty<\/code> ont une pr\u00e9cision en dizaines de nanosecondes<\/strong>. Ceci signifie que les valeurs 500 \u00e0 509 par exemple fixeront la m\u00eame p\u00e9riode mais que 510 la modifiera.<\/p>\n<h1>Deuxi\u00e8me sortie PWM<\/h1>\n<p style=\"text-align: justify;\">Nous avons remarqu\u00e9 qu&rsquo;il y a deux paires de sorties PWM&nbsp;: 1A\/1B et 2A\/2B. Nous avons activ\u00e9 la sortie 1A. Pour activer la sortie 2A, on ex\u00e9cutera de mani\u00e8re similaire \u00e0 la sortie pr\u00e9c\u00e9dente.<\/p>\n<pre># <strong>cd \/sys\/devices\/bone_capemgr.* <\/strong>\n# <strong>echo bone_pwm_P8_19 &gt; slots<\/strong>\n# <strong><code>cd \/sys\/devices\/ocp.2\/pwm_test_P8_19.*<\/code><\/strong>\n#<\/pre>\n<p style=\"text-align: justify;\">On pourra configurer <code>period<\/code>, <code>duty<\/code> et <code>polarity<\/code> de fa\u00e7on totalement ind\u00e9pendante de la sortie 1A.<\/p>\n<p style=\"text-align: justify;\">Essayons \u00e0 pr\u00e9sent de configurer la sortie 1B.<\/p>\n<pre># <strong>cd \/sys\/devices\/bone_capemgr.*<\/strong>\n# <strong>echo bone_pwm_P9_16 &gt; slots<\/strong> \n[ 6067.120995] ehrpwm 48302200.ehrpwm: Period value conflicts with channel 0\n[ 6067.128319] pwm_test pwm_test_P9_16.14: pwm_config() failed<\/pre>\n<p style=\"text-align: justify;\">Un message du noyau Linux nous indique une erreur de configuration. Un conflit appara\u00eet entre les p\u00e9riodes des deux PWM. V\u00e9rifions quand m\u00eame si P9-16 est charg\u00e9.<\/p>\n<pre># <strong>cat slots <\/strong>\n 0: 54:PF--- \n 1: 55:PF--- \n 2: 56:PF--- \n 3: 57:PF--- \n 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G\n 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI\n 6: ff:P-O-L Override Board Name,00A0,Override Manuf,am33xx_pwm\n 8: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P9_14\n 9: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P8_19\n10: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P9_16\n#<\/pre>\n<p style=\"text-align: justify;\">Le slot num\u00e9ro 10 lui est pourtant bien attribu\u00e9. Essayons de l&rsquo;utiliser.<\/p>\n<pre># <strong>cd \/sys\/devices\/ocp.2\/pwm_test_P9_16*<\/strong>\n# <strong>ls -l<\/strong>\ntotal 0\n-r--r--r-- 1 root root 4096 Jan  1 01:41 modalias\ndrwxr-xr-x 2 root root    0 Jan  1 01:41 power\nlrwxrwxrwx 1 root root    0 Jan  1 01:41 subsystem -&gt; ..\/..\/..\/bus\/platform\n-rw-r--r-- 1 root root 4096 Jan  1 01:41 uevent\n#<\/pre>\n<p style=\"text-align: justify;\">Les fichiers nous permettant d&rsquo;acc\u00e9der \u00e0 la configuration du PWM sont absents. Nous ne pouvons pas l&rsquo;utiliser comme cela, il faut d\u00e9sactiver son slot.<\/p>\n<pre># <strong>cd \/sys\/devices\/bone_capemgr.*<\/strong>\n# <strong>echo -10 &gt; slots <\/strong>\n# <strong>cat slots <\/strong>\n 0: 54:PF--- \n 1: 55:PF--- \n 2: 56:PF--- \n 3: 57:PF--- \n 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G\n 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI\n 6: ff:P-O-L Override Board Name,00A0,Override Manuf,am33xx_pwm\n 8: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P9_14\n 9: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P8_19\n#<\/pre>\n<p style=\"text-align: justify;\">Je vais donc remettre la p\u00e9riode et la dur\u00e9e de <code>duty<\/code> initiales sur la sortie PWM 1A.<\/p>\n<pre># <strong>echo 500000 &gt; period<\/strong>\n# <strong>echo 0 &gt; duty<\/strong>\n#<\/pre>\n<p style=\"text-align: justify;\">Puis j&rsquo;active la sortie PWM 1B.<\/p>\n<pre># <strong>cd \/sys\/devices\/bone_capemgr.*<\/strong>\n# <strong>echo bone_pwm_P9_16 &gt; slots<\/strong> \n# <strong>cat slots <\/strong>\n 0: 54:PF--- \n 1: 55:PF--- \n 2: 56:PF--- \n 3: 57:PF--- \n 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G\n 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI\n 6: ff:P-O-L Override Board Name,00A0,Override Manuf,am33xx_pwm\n 8: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P9_14\n 9: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P8_19\n11: ff:P-O-L Override Board Name,00A0,Override Manuf,bone_pwm_P9_16\n#<\/pre>\n<p style=\"text-align: justify;\">Et je modifie la p\u00e9riode et le <code>duty<\/code>.<\/p>\n<pre># <strong>cd \/sys\/devices\/ocp.2\/pwm_test_P9_16.*<\/strong>\n# <strong>echo 100000 &gt; period <\/strong>\n[  901.071218] ehrpwm 48302200.ehrpwm: Period value conflicts with channel 0\n[  901.078557] pwm_test pwm_test_P9_16.15: pwm_config() failed\n-sh: echo: write error: Invalid argument\n# <strong>cat period<\/strong> \n500000\n#<\/pre>\n<p>Ah&nbsp;! Le m\u00eame probl\u00e8me se pose, puisque j&rsquo;essaye de modifier la p\u00e9riode de la sortie 1B et qu&rsquo;elle ne serait donc plus en accord avec celle de la sortie 1A.<\/p>\n<p style=\"text-align: justify;\">En fait <strong>les deux sorties 1A et 1B sont coupl\u00e9es (et synchronis\u00e9es)<\/strong>. Elles doivent avoir la m\u00eame p\u00e9riode, et la p\u00e9riode de <code>duty<\/code> commencera au m\u00eame instant sur les deux sorties. En revanche elles peuvent avoir des dur\u00e9es de <code>duty<\/code> et des polarit\u00e9s diff\u00e9rentes. Voici une capture par exemple o\u00f9 la sortie 1A (en haut) a une polarit\u00e9 \u00e0 <code>0<\/code> et une dur\u00e9e <code>duty<\/code> de 100 microsecondes, alors que la sortie 1B a une polarit\u00e9 \u00e0 <code>1<\/code> et une dur\u00e9e <code>duty<\/code> de 300 microsecondes.<\/p>\n<p><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-07.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3709\" alt=\"PWM BeagleBone Black 7\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-07.png\" width=\"400\" height=\"299\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-07.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/06\/pwm-beaglebone-black-07-300x224.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<h1>Conclusion<\/h1>\n<p style=\"text-align: justify;\">Les sorties PWM du BeagleBone Black sont performantes et pr\u00e9cises. Si l&rsquo;on n&rsquo;utilise qu&rsquo;une ou deux sorties, la programmation est tr\u00e8s simple. Il n&rsquo;en demeure pas moins que nous n&rsquo;avons pas trouv\u00e9 comment modifier la p\u00e9riode d&rsquo;un PWM dont les deux sorties sont utilis\u00e9es simultan\u00e9ment. Pour cela il faut certainement intervenir dans le <em>Device Tree<\/em> qui a fait son apparition dans le noyau Linux 3.5 sur le BeagleBone. Je continue \u00e0 explorer ce m\u00e9canisme, que je d\u00e9crirai dans un prochain article.<\/p>","protected":false},"excerpt":{"rendered":"<p>Je me suis int&eacute;ress&eacute; aux sorties PWM du BeagleBone Black. Quatre d&rsquo;entre elles sont directement accessibles sur les connecteurs d&rsquo;extension P8 et P9. L&rsquo;acc&egrave;s en est encore relativement simple. En revanche pour les deux autres, il a fallu que j&rsquo;explore le fonctionnement du Device Tree d&eacute;crivant les entr&eacute;es-sorties du BeagleBone Black, ce que j&rsquo;aborderai dans [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,5,8,10],"tags":[],"class_list":["post-3670","post","type-post","status-publish","format-standard","hentry","category-beagleboneblack","category-embarque","category-linux-2","category-microprocesseur"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=3670"}],"version-history":[{"count":34,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3670\/revisions"}],"predecessor-version":[{"id":3727,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3670\/revisions\/3727"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=3670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=3670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=3670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}