Difference between revisions of "Projets:Perso:2015:LedTube:Conseils"

From Electrolab
Jump to: navigation, search
(Conseils aux utilisateurs de dandes de WS2812B)
Line 6: Line 6:
  
 
*Bien assurer que votre conception respecte que DI n'est jamais au dessus de VCC+0.5V, et tout de même au dessus de 0.7V*VCC, c'est le plus délicat en raison des chutes de tension dans le systeme.
 
*Bien assurer que votre conception respecte que DI n'est jamais au dessus de VCC+0.5V, et tout de même au dessus de 0.7V*VCC, c'est le plus délicat en raison des chutes de tension dans le systeme.
*Alimenter la bande de leds du coté DI sinon, cela ne fait qu'empirer le probleme de différence de tension entre l'alim et DI.
+
*Alimenter la bande de leds au moins du coté DI sinon, cela ne fait qu'empirer le problème de différence de tension entre l'alim et DI.
*Respecter les consignes Electrostatiques.
+
*Respecter les consignes électrostatiques.
 +
*Achetez du rab, elles sont assez fragiles.
 +
*Je recommande de ne pas les utiliser à puissance maximum. Rester à <=50%.
 +
*utiliser au moins une résistance série sur DI. Certains proposent 300 ohms.
 +
*Bien penser à la dissipation thermique. Sur le ledtube (tôle acier perforé), à 100%, ça chauffe pas mal, un flux d'air (convection au minimum) est nécessaire.
 +
*Si possible, mettez une capa de découplage en entrée de bande (470µF par exemple)
  
==A savoir sur les LEDS RGB WS2812B==
+
La plupart du temps, ce sont les WS2812B aux extrémités qui font fusible. Coté alim/DI pour des problèmes de tension.
 +
Mais aussi à l'autre extrémité non branchée. Comme j'ai vu mourir des leds en bout de bande alors que cette extrémité n'était pas connectée, j'en déduit qu'elles sont sensibles aux décharges électrostatiques.
 +
Des leds isolées peuvent aussi se mettre à battre de l'aile sans raison logique. Ces problèmes se révèlent toujours en charge.
  
Work in progress !! Je continue d'observer un effet que je n'explique pas encore : selon la temperature, et quand la charge est élevée (image blanche et lumineuse), il se peut que sur certaines bandes (toujours les mêmes) que à partir d'une led, pas necessairement la première, mais toujours la même sur cette bande, le signal de contrôle ne passe plus. Maintenant que j'arrive bien à reproduire le problème, je vais faire des mesures oscillo. Je me demande si ce ne serait pas juste un probleme de capa de découplage qui aurait une soudure sèche.
+
==Tensions sur les LEDS RGB WS2812B==
  
 
La datasheet précise trois choses importantes
 
La datasheet précise trois choses importantes
Line 19: Line 26:
  
 
Le chip WS2812B effectue une régulation en courant sur les leds.  
 
Le chip WS2812B effectue une régulation en courant sur les leds.  
Cela permet d'avoir une luminosité insensible à la tension d'alimentation et ainsi un éclairage régulier entre bandes.  
+
Cela permet d'avoir une luminosité insensible à la tension d'alimentation et ainsi un éclairage régulier entre bandes. Si ce n'était pas le cas, je l'aurait vu.
  
Le courant dans l'alim va varier et introduire une chute de tension dans les cables d'alimentation et la bande d'autant plus élevée que la luminosité est grande.  
+
Le courant dans l'alim va varier et introduire une chute de tension dans les câbles d'alimentation et la bande d'autant plus élevée que la luminosité est grande.  
  
Cette chute de tension n'est pas du tout négligable. On parle de courants de l'ordre de 3.6A pour 60 WS2812B en série si on s'en tient à la spec.
+
Cette chute de tension n'est pas du tout négligeable. On parle de courants de l'ordre de 3.6A pour 60 WS2812B en série si on s'en tient à la spec.
  
Par exemple, si le cablage a une impédance de 0.1 ohms, ça fait une chute de tension de 0.1*3.6 = 0.36V
+
Par exemple, si le câblage a une impédance de 0.1 ohms, ça fait une chute de tension de 0.1*3.6 = 0.36V. A éclairage maxi, j'ai mesuré une chute de tension totale (câbles+bande) comprise entre 1.2 et 1.5V. Je suis donc juste à la limite de spec pour la tension d'alim des leds.
  
 
J'ai pu vérifier que la WS2812B n'aime pas du tout que DI soit hors spec.  
 
J'ai pu vérifier que la WS2812B n'aime pas du tout que DI soit hors spec.  
Elle ne crame par pour autant immédiatement, mais finit par battre de l'aile jusqu'à rendre l'âme au bout de quelques heures.
+
Elle ne crame par pour autant immédiatement, mais finit par battre de l'aile jusqu'à rendre l'âme au bout de quelques heures. Il se pourrait bien que je paye maintenant d'avoir laissé tourné un peu trop longtemps hors spec DI.
  
 
Le problème est alors, de bien piloter le niveau haut de DI, en dessous du seuil max et au dessus du seuil min, cela quelque soit la luminosité (et donc le courant et donc la chute de tension).
 
Le problème est alors, de bien piloter le niveau haut de DI, en dessous du seuil max et au dessus du seuil min, cela quelque soit la luminosité (et donc le courant et donc la chute de tension).
Line 35: Line 42:
  
 
J'ai donc alimenté mes buffers 74ACT244 vers DI en 5V (5VSB alim PC).  
 
J'ai donc alimenté mes buffers 74ACT244 vers DI en 5V (5VSB alim PC).  
Mais là, on tombe sur le probleme que lorsque la chute de tension sur les leds descend à 3.5, envoyer du 5V est assez destructeur.
+
Mais là, on tombe sur le problème que lorsque la chute de tension sur les leds descend à 3.5, envoyer du 5V est assez destructeur.
J'ai mis une résistance série de 100 ohm pour un minimum de protection en courant et pour adapter l'impédance. Cela donne un signal très propre à l'oscillo, mais il reste qu'il est hors spec sur les bandes de LED en forte charge.
+
J'ai mis une résistance série de 100 ohm pour un minimum de protection en courant et pour adapter l'impédance. Cela donne un signal très propre à l'oscilloscope, mais il reste qu'il est hors spec sur les bandes de LED en forte charge.
  
 
Revenons à la spec :  
 
Revenons à la spec :  
 
Le niveau haut DI minimum est 0.7 * VCCLed. Sous 3.5V ça fait 2.45V. Sous 5V, ça fait 3.5V.
 
Le niveau haut DI minimum est 0.7 * VCCLed. Sous 3.5V ça fait 2.45V. Sous 5V, ça fait 3.5V.
Un bon compromis serait alors d'injecter sur DI du 4V. Avec ça, dans toute la plage de tension fontionnelle VCCLed, on est en dessous de VCCLed+0.5 et au dessus du seuil bit à 1. On reste quand même aux limites de la spec absolue.
+
Un bon compromis serait alors d'injecter sur DI du 4V. Avec ça, dans toute la plage de tension fonctionnelle VCCLed, on est en dessous de VCCLed+0.5 et au dessus du seuil bit à 1. On reste quand même aux limites de la spec absolue.
 
On voit d'ailleurs qu'il est impossible d'avoir une tension fixe qui respecte la spec exactement dans toute la plage de tension d'alim acceptée.  
 
On voit d'ailleurs qu'il est impossible d'avoir une tension fixe qui respecte la spec exactement dans toute la plage de tension d'alim acceptée.  
 
Au mieux, ce serait 3.5V, mais sous 5V, on arriverait jamais en pratique à atteindre le seuil bit à 1 de 3.5V
 
Au mieux, ce serait 3.5V, mais sous 5V, on arriverait jamais en pratique à atteindre le seuil bit à 1 de 3.5V
Line 46: Line 53:
 
Dans mon cas, où j'ai 20 bandes, chacune allumée différemment, avec donc des chutes de tension différentes, mais une seule source de tension pour le signal DI, c'est problématique.  
 
Dans mon cas, où j'ai 20 bandes, chacune allumée différemment, avec donc des chutes de tension différentes, mais une seule source de tension pour le signal DI, c'est problématique.  
  
Donc, pour redescendre à 4V, une possibilité serait de mettre une resistance de 400 ohms entre DI et la masse. Le pont diviseur donne : vout = vcc*(400)/(400+100) = 4V. Mais le problème devient la quantité de courant tirée : 5/500 = 10mA. Pour un fil ça irait, mais avec 20 fils, ça fait 200mA (1 Watt total, 80mA par octo buffer), ce qui est vraiment beaucoup (en plus, ce sont des courants impulsionnels). D'autant que le firmware fait que tous les DI passent à 1 simultannément.  
+
Donc, pour redescendre à 4V, une possibilité serait de mettre une resistance de 400 ohms entre DI et la masse. Le pont diviseur donne : vout = vcc*(400)/(400+100) = 4V. Mais le problème devient la quantité de courant tirée : 5/500 = 10mA. Pour un fil ça irait, mais avec 20 fils, ça fait 200mA (1 Watt total, 80mA par octo buffer), ce qui est vraiment beaucoup (en plus, ce sont des courants impulsionnels). D'autant que le firmware fait que tous les DI passent à 1 simultanément.  
Ce serait bien, pour réduire le courant, d'augmenter la résistance série à 270 ohms (avec 1000 vers la masse => VDI = 3.93V, courant total = 20*5/1270=78mA, 31mA par octo buffer). Mais le probleme devient (peut-être) alors les temps de montée et descente ainsi que la sensibilité au bruit ambient. Je n'ai pas encore testé ça. C'est la modif la plus simple par rapport à mon design actuel.  
+
Ce serait bien, pour réduire le courant, d'augmenter la résistance série à 270 ohms (avec 1000 vers la masse => VDI = 3.93V, courant total = 20*5/1270=78mA, 31mA par octo buffer). Mais le problème devient (peut-être) alors les temps de montée et descente ainsi que la sensibilité au bruit ambiant. Je n'ai pas encore testé ça. C'est la modif la plus simple par rapport à mon design actuel.  
  
Dans mon cas, pour ça, j'aurais pu faire ceci : un LDO (low drop regulator) génère du 4V à partir du 5V. Et ce 4V alimente VCC des 74ACT244. La sortie des buffers sont des resistances de 100ohms qui vont vers DI. Peut-être même devrait-on prendre un LDO ajustable pour trouver le meilleur compromis selon chaque configuration.
+
Dans mon cas, pour ça, j'aurais pu faire ceci : un LDO (low drop regulator) génère du 4V à partir du 5V. Et ce 4V alimente VCC des 74ACT244. La sortie des buffers sont des résistances de 100ohms qui vont vers DI. Peut-être même devrait-on prendre un LDO ajustable pour trouver le meilleur compromis selon chaque configuration.
  
La plupart du temps, ce sont les WS2812B aux extrémités qui font fusible. Coté alim/DI pour des problemes de tension.
+
Autre Info : En pratique, j'ai mesuré, et cela de plusieurs façons différentes (courant sur une alim 13.8V avec derrière un convertisseur DCDC12/24V vers 5V , mais aussi directement sur le 220V avec 1200 LEDs connectées) qu'en réalité le courant moyen par WS2812B lorsqu'elle est à fond est plutôt de 30mA et non pas 60mA comme annoncé dans la spec. Peut-être est ce parce que la spec indique le courant max instantané et que la PWM ne dépasse jamais le rapport cyclique de 50%.
Mais aussi à l'autre extrémité non branchée. Comme j'ai vu mourir des leds en bout de bande alors que cette extrémité n'était pas connectée, j'en déduit qu'elles sont sensibles aux décharges electrostatiques.
+
 
+
Autre Info : En pratique, j'ai mesuré, et cela de plusieurs façons différentes (courant sur une alim 13.8V avec derrière un convertisseur DCDC12/24V vers 5V , mais aussi directement sur le 220V avec 1200 LEDs connectées) qu'en réalité le courant moyen par WS2812B lorsqu'elle est à fond est plutôt de 30mA et non pas 60mA comme annoncé dans la spec. Peut-être est ce parce que la spec indique le courant max instantanné et que la PWM ne dépasse jamais le rapport cyclique de 50%.
+
  
 
Si dans votre design, vous ne pilotez qu'une seule bande (même longue), les choses sont plus simples. Vous pouvez vous permettre d'avoir un circuit d'adaptation prenant comme référence de tension l'alim VCCLed. Un transistor en collecteur ouvert (avec pull-up) pourrait être OK.
 
Si dans votre design, vous ne pilotez qu'une seule bande (même longue), les choses sont plus simples. Vous pouvez vous permettre d'avoir un circuit d'adaptation prenant comme référence de tension l'alim VCCLed. Un transistor en collecteur ouvert (avec pull-up) pourrait être OK.
  
==Pilotage des Leds par DMA==
+
Work in progress !! Je continue d'observer un effet que je n'explique pas encore : selon la température, et quand la charge est élevée (image blanche et lumineuse), il se peut que sur certaines bandes (toujours les mêmes) que à partir d'une led, pas necessairement la première, mais toujours la même sur cette bande, le signal de contrôle ne passe plus. Maintenant que j'arrive bien à reproduire le problème, je vais faire des mesures oscillo. Je me demande si ce ne serait pas juste un probleme de capa de découplage qui aurait une soudure sèche.
 +
 
 +
[[File:projets_perso_2015_ledtube_voltagedrop.png]]
 +
==Timings WS2812B et pilotage par DMA==
 
Le timing DI offre une opportunité.
 
Le timing DI offre une opportunité.
  
Line 81: Line 88:
 
0xFFFF,0xFFFF,0x0000 32*60 fois de suite, on va allumer 16 bandes de 60 leds connectées à GPIOB0..GPIOB15 au blanc max
 
0xFFFF,0xFFFF,0x0000 32*60 fois de suite, on va allumer 16 bandes de 60 leds connectées à GPIOB0..GPIOB15 au blanc max
  
Le signal de RESET est obtenu avec >50µs à 0. 50/0.4 = 125.  Pour ça, j'ai mis en tête de séquence 140 fois 0x0000.
+
Le signal de 'RESET' est obtenu avec >50µs à 0.50/0.4 = 125.  Pour assurer ça, j'ai mis 137x 0x0000.
  
 
Le DMA est mis ultra prioritaire pour ce qui est de la prise du bus, si possible plus prioritaire que le CPU.
 
Le DMA est mis ultra prioritaire pour ce qui est de la prise du bus, si possible plus prioritaire que le CPU.
  
 
Le gros avantage de la méthode est de supprimer toute contrainte temps réel tordue au niveau du code. On remplit la mémoire à sa guise et on démarre le DMA. En pratique, le remplissage de la mémoire se fait quasiment à la même vitesse que le transfert DMA. Donc, on ne perd même pas de temps. Pendant le transfert DMA, la charge sur le BUS est négligeable.
 
Le gros avantage de la méthode est de supprimer toute contrainte temps réel tordue au niveau du code. On remplit la mémoire à sa guise et on démarre le DMA. En pratique, le remplissage de la mémoire se fait quasiment à la même vitesse que le transfert DMA. Donc, on ne perd même pas de temps. Pendant le transfert DMA, la charge sur le BUS est négligeable.
 +
 +
La datasheet spécifie des timings inutilement contraignants. En réalité, les timings peuvent être largement relaxés. <br>
 +
Cf https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/  <br>
 +
On y trouve des informations très utiles.
 +
Au point que finalement, ce qui compte, c'est d'assurer juste pour les bits à 0, que l'impulsion dure bien 0.4µs. Pour les bits 0 et 1 il faut assurer seulement que la phase niveau bas ne dépasse pas 5µs (alors que la spéc dit pas plus de 0.95µs...). La durée du 'RESET' (improprement nommé car ce serait en fait la commande de latch effectif des 24 bits transférés, et serait donc à mettre à la fin) n'a pas besoin de durer aussi longtemps que 50µs, en fait 6µs suffisent.
 +
 +
Cela ne retire pas un certain intérêt d'utiliser des transferts par DMA.
  
 
==Capas de Découplage en entrée ?==
 
==Capas de Découplage en entrée ?==
 
J'ai lu sur certaines pages qu'il était recommandé d'avoir d'assez grosses capas de découplage sur VCCLed (genre 470µF). Une première raison serait la protection de VCCLed au démarrage de l'alim PC qui peut être violente. J'en ai provisionné, mais pas équipé parce que je n'ai pas un moyen simple, propre et fiable (risque élevé de CC) de les souder aux entrées des bandes. Elles sont grosses. Je n'ai pas remarqué de problème de ce genre. Mes bandes sont équipées de capas de 100nF sur chaque LED. A suivre...
 
J'ai lu sur certaines pages qu'il était recommandé d'avoir d'assez grosses capas de découplage sur VCCLed (genre 470µF). Une première raison serait la protection de VCCLed au démarrage de l'alim PC qui peut être violente. J'en ai provisionné, mais pas équipé parce que je n'ai pas un moyen simple, propre et fiable (risque élevé de CC) de les souder aux entrées des bandes. Elles sont grosses. Je n'ai pas remarqué de problème de ce genre. Mes bandes sont équipées de capas de 100nF sur chaque LED. A suivre...

Revision as of 21:04, 1 May 2016

Conseils aux utilisateurs de bandes de WS2812B

Datasheet https://www.adafruit.com/datasheets/WS2812B.pdf

En résumé

  • Bien assurer que votre conception respecte que DI n'est jamais au dessus de VCC+0.5V, et tout de même au dessus de 0.7V*VCC, c'est le plus délicat en raison des chutes de tension dans le systeme.
  • Alimenter la bande de leds au moins du coté DI sinon, cela ne fait qu'empirer le problème de différence de tension entre l'alim et DI.
  • Respecter les consignes électrostatiques.
  • Achetez du rab, elles sont assez fragiles.
  • Je recommande de ne pas les utiliser à puissance maximum. Rester à <=50%.
  • utiliser au moins une résistance série sur DI. Certains proposent 300 ohms.
  • Bien penser à la dissipation thermique. Sur le ledtube (tôle acier perforé), à 100%, ça chauffe pas mal, un flux d'air (convection au minimum) est nécessaire.
  • Si possible, mettez une capa de découplage en entrée de bande (470µF par exemple)

La plupart du temps, ce sont les WS2812B aux extrémités qui font fusible. Coté alim/DI pour des problèmes de tension. Mais aussi à l'autre extrémité non branchée. Comme j'ai vu mourir des leds en bout de bande alors que cette extrémité n'était pas connectée, j'en déduit qu'elles sont sensibles aux décharges électrostatiques. Des leds isolées peuvent aussi se mettre à battre de l'aile sans raison logique. Ces problèmes se révèlent toujours en charge.

Tensions sur les LEDS RGB WS2812B

La datasheet précise trois choses importantes

  • La tension d'alimentation du chip peut aller de 3.5V à 5.3V
  • La tension haute (bit à 1) du fil de contrôle DI ne doit pas dépasser la tension d'alimentation Led de plus de 0.5V (absolute max rating)
  • Le niveau haut DI minimum est 0.7 * VCCLed. Sous 3.5V ça fait 2.45V. Sous 5V, ça fait 3.5V.

Le chip WS2812B effectue une régulation en courant sur les leds. Cela permet d'avoir une luminosité insensible à la tension d'alimentation et ainsi un éclairage régulier entre bandes. Si ce n'était pas le cas, je l'aurait vu.

Le courant dans l'alim va varier et introduire une chute de tension dans les câbles d'alimentation et la bande d'autant plus élevée que la luminosité est grande.

Cette chute de tension n'est pas du tout négligeable. On parle de courants de l'ordre de 3.6A pour 60 WS2812B en série si on s'en tient à la spec.

Par exemple, si le câblage a une impédance de 0.1 ohms, ça fait une chute de tension de 0.1*3.6 = 0.36V. A éclairage maxi, j'ai mesuré une chute de tension totale (câbles+bande) comprise entre 1.2 et 1.5V. Je suis donc juste à la limite de spec pour la tension d'alim des leds.

J'ai pu vérifier que la WS2812B n'aime pas du tout que DI soit hors spec. Elle ne crame par pour autant immédiatement, mais finit par battre de l'aile jusqu'à rendre l'âme au bout de quelques heures. Il se pourrait bien que je paye maintenant d'avoir laissé tourné un peu trop longtemps hors spec DI.

Le problème est alors, de bien piloter le niveau haut de DI, en dessous du seuil max et au dessus du seuil min, cela quelque soit la luminosité (et donc le courant et donc la chute de tension).

Quand la tension d'alim de la led vaut 5V, on voit qu'on ne peut pas piloter DI par une puce alimentée en 3.3V, car on ne peut dépasser 3.3V alors qu'on doit générer au minimum du 3.5V.

J'ai donc alimenté mes buffers 74ACT244 vers DI en 5V (5VSB alim PC). Mais là, on tombe sur le problème que lorsque la chute de tension sur les leds descend à 3.5, envoyer du 5V est assez destructeur. J'ai mis une résistance série de 100 ohm pour un minimum de protection en courant et pour adapter l'impédance. Cela donne un signal très propre à l'oscilloscope, mais il reste qu'il est hors spec sur les bandes de LED en forte charge.

Revenons à la spec : Le niveau haut DI minimum est 0.7 * VCCLed. Sous 3.5V ça fait 2.45V. Sous 5V, ça fait 3.5V. Un bon compromis serait alors d'injecter sur DI du 4V. Avec ça, dans toute la plage de tension fonctionnelle VCCLed, on est en dessous de VCCLed+0.5 et au dessus du seuil bit à 1. On reste quand même aux limites de la spec absolue. On voit d'ailleurs qu'il est impossible d'avoir une tension fixe qui respecte la spec exactement dans toute la plage de tension d'alim acceptée. Au mieux, ce serait 3.5V, mais sous 5V, on arriverait jamais en pratique à atteindre le seuil bit à 1 de 3.5V

Dans mon cas, où j'ai 20 bandes, chacune allumée différemment, avec donc des chutes de tension différentes, mais une seule source de tension pour le signal DI, c'est problématique.

Donc, pour redescendre à 4V, une possibilité serait de mettre une resistance de 400 ohms entre DI et la masse. Le pont diviseur donne : vout = vcc*(400)/(400+100) = 4V. Mais le problème devient la quantité de courant tirée : 5/500 = 10mA. Pour un fil ça irait, mais avec 20 fils, ça fait 200mA (1 Watt total, 80mA par octo buffer), ce qui est vraiment beaucoup (en plus, ce sont des courants impulsionnels). D'autant que le firmware fait que tous les DI passent à 1 simultanément. Ce serait bien, pour réduire le courant, d'augmenter la résistance série à 270 ohms (avec 1000 vers la masse => VDI = 3.93V, courant total = 20*5/1270=78mA, 31mA par octo buffer). Mais le problème devient (peut-être) alors les temps de montée et descente ainsi que la sensibilité au bruit ambiant. Je n'ai pas encore testé ça. C'est la modif la plus simple par rapport à mon design actuel.

Dans mon cas, pour ça, j'aurais pu faire ceci : un LDO (low drop regulator) génère du 4V à partir du 5V. Et ce 4V alimente VCC des 74ACT244. La sortie des buffers sont des résistances de 100ohms qui vont vers DI. Peut-être même devrait-on prendre un LDO ajustable pour trouver le meilleur compromis selon chaque configuration.

Autre Info : En pratique, j'ai mesuré, et cela de plusieurs façons différentes (courant sur une alim 13.8V avec derrière un convertisseur DCDC12/24V vers 5V , mais aussi directement sur le 220V avec 1200 LEDs connectées) qu'en réalité le courant moyen par WS2812B lorsqu'elle est à fond est plutôt de 30mA et non pas 60mA comme annoncé dans la spec. Peut-être est ce parce que la spec indique le courant max instantané et que la PWM ne dépasse jamais le rapport cyclique de 50%.

Si dans votre design, vous ne pilotez qu'une seule bande (même longue), les choses sont plus simples. Vous pouvez vous permettre d'avoir un circuit d'adaptation prenant comme référence de tension l'alim VCCLed. Un transistor en collecteur ouvert (avec pull-up) pourrait être OK.

Work in progress !! Je continue d'observer un effet que je n'explique pas encore : selon la température, et quand la charge est élevée (image blanche et lumineuse), il se peut que sur certaines bandes (toujours les mêmes) que à partir d'une led, pas necessairement la première, mais toujours la même sur cette bande, le signal de contrôle ne passe plus. Maintenant que j'arrive bien à reproduire le problème, je vais faire des mesures oscillo. Je me demande si ce ne serait pas juste un probleme de capa de découplage qui aurait une soudure sèche.

Projets perso 2015 ledtube voltagedrop.png

Timings WS2812B et pilotage par DMA

Le timing DI offre une opportunité.

  • Data Bit 0 : 1 pendant 0.4us±150ns puis 0 pendant 0.85µs±150ns
  • Data Bit 1 : 1 pendant 0.8us±150ns puis 0 pendant 0.45µs±150ns

par conséquent on reste dans la spec avec ce timing :

  • Data Bit 0 : 1 pendant 0.4us±150ns puis 0 pendant 0.8µs+200ns-100ns
  • Data Bit 1 : 1 pendant 0.8us±150ns puis 0 pendant 0.4µs±200ns-100ns

L'idée est d'utiliser un DMA, Mémoire->GPIO avec chaque transfert déclenché par un timer toutes les 0.4µs

Tous les micros ne savent pas faire ça, mais les STM32F446 oui.

A supposer qu'on configure le DMA pour envoyer la mémoire vers le GPIOB

Si par exemple on remplit la mémoire avec la séquence 0xFFFF,0x0000,0x0000 32*60 fois de suite, on va passer 16 bandes de 60 leds connectées à GPIOB0..GPIOB15 au noir

Si par exemple on remplit la mémoire avec la séquence 0xFFFF,0xFFFF,0x0000 32*60 fois de suite, on va allumer 16 bandes de 60 leds connectées à GPIOB0..GPIOB15 au blanc max

Le signal de 'RESET' est obtenu avec >50µs à 0.50/0.4 = 125. Pour assurer ça, j'ai mis 137x 0x0000.

Le DMA est mis ultra prioritaire pour ce qui est de la prise du bus, si possible plus prioritaire que le CPU.

Le gros avantage de la méthode est de supprimer toute contrainte temps réel tordue au niveau du code. On remplit la mémoire à sa guise et on démarre le DMA. En pratique, le remplissage de la mémoire se fait quasiment à la même vitesse que le transfert DMA. Donc, on ne perd même pas de temps. Pendant le transfert DMA, la charge sur le BUS est négligeable.

La datasheet spécifie des timings inutilement contraignants. En réalité, les timings peuvent être largement relaxés.
Cf https://wp.josh.com/2014/05/13/ws2812-neopixels-are-not-so-finicky-once-you-get-to-know-them/
On y trouve des informations très utiles. Au point que finalement, ce qui compte, c'est d'assurer juste pour les bits à 0, que l'impulsion dure bien 0.4µs. Pour les bits 0 et 1 il faut assurer seulement que la phase niveau bas ne dépasse pas 5µs (alors que la spéc dit pas plus de 0.95µs...). La durée du 'RESET' (improprement nommé car ce serait en fait la commande de latch effectif des 24 bits transférés, et serait donc à mettre à la fin) n'a pas besoin de durer aussi longtemps que 50µs, en fait 6µs suffisent.

Cela ne retire pas un certain intérêt d'utiliser des transferts par DMA.

Capas de Découplage en entrée ?

J'ai lu sur certaines pages qu'il était recommandé d'avoir d'assez grosses capas de découplage sur VCCLed (genre 470µF). Une première raison serait la protection de VCCLed au démarrage de l'alim PC qui peut être violente. J'en ai provisionné, mais pas équipé parce que je n'ai pas un moyen simple, propre et fiable (risque élevé de CC) de les souder aux entrées des bandes. Elles sont grosses. Je n'ai pas remarqué de problème de ce genre. Mes bandes sont équipées de capas de 100nF sur chaque LED. A suivre...