Laser / probleme avec le pin PWM

Électricité, électronique
mstrens
Messages : 2611
Enregistré le : 27 févr. 2018 12:58

Re: Laser / probleme avec le pin PWM

Message par mstrens »

le ULN2803 se comporte comme un transistor NPN.
L'entrée de l'ULN (= la sortie du STM32) est équivalente à la base du transistor (avec une résistance en série pour limiter le courant).
L'émetteur du transistor est raccordé en interne à Grnd.
La sortie de l'ULN est équivalente au collecteur du transistor.
Pour cette application, le transistor peut être vu comme un interrupteur dont une des bornes est connectée à Grnd.
Pour avoir une tension à l'autre borne de cet interrupteur (= la pin de sortie de l'ULN), il faut mettre une résistance de par exemple 1K (résistance de rappel) entre le pin de sortie de l'ULN et une source de tension (par exemple 5 volt Vcc).
Lorsque le STM32 génère un signal LOW, le transistor est "bloqué" et donc ne laisse pas passer de courant. "L'interrupteur" est ouvert et, grâce à la résistance de rappel, le voltage sur la pin de l'ULN sera de 5 Volt.
Lorsque le STM32 génère un signal HIGH, le transistor est "passant" et donc laisse passer le courant. "L'interrupteur" est fermé et le voltage sur la pin de l'ULN sera de 0 Volt (en fait de l'ordre de 0.8V).
On voit donc que l'uln inverse le signal en sortie du STM32.

Je n'ai pas trouvé dans le code de GRBL un paramètre qui permette d'inverser le signal généré par GRBL au niveau de la sortie PWM. C'est peut être possible de modifier le code du programme mais je n'ai pas essayé.

Si le laser fonctionne bien quand il est directement raccordé à la pin PWM du STM32, il devrait aussi fonctionner si on ajoute un circuit inverseur après la sortie de l'uln de manière à remettre le signal dans le même sens que celui qui est en sortie du STM32.
La façon la plus simple de faire un inverseur est d'utiliser un transistor et 2 résistances..
Au besoin je peux faire un schéma.
A noter que si je ne me trompe pas, il reste au moins un transistor de libre sur l'uln. Il devrait donc être possible de l'utiliser pour faire la seconde inversion.

A noter que, puisque le laser fonctionne quand il est raccordé directement au STM32, c'est qu'il attend un signal pulsé (= digital = carré) et non un signal analogique. Il ne faut donc pas utiliser de filtre RC.
sym71
Messages : 9
Enregistré le : 16 juil. 2020 22:22

Re: Laser / probleme avec le pin PWM

Message par sym71 »

Bonsoir , j'ai suivi avec intérêt vos conversations ,j'ai un petit probleme qui rejoint un peu le votre d’où ma prise de parole .
je construit actuellement une découpe laser C02 40w que je vais piloter avec un module ST32 Bluepill
j'ai chargé un firmware GRBL ver1.1f+ et en suis aux tests :P
l’entrée IN de l'alim laser peut se piloter au choix via une tension 0..5V issue d'un potard
soit en PWM 5V d’après les spec de l'alim PWM>=20KHz
comme les sorties du STM32 sont en 3.3v , la première chose sera donc de faire une adaptation tension (ULN2803)
dans le firmware GRBL il semble que la fréquence de la PWM soit réglée a 10KHz ce qui laisse entre PWM max et PWM min 100 niveaux de puissance ( ça me semble suffisant )

extrait du fichier cpu.map
#define SPINDLE_PWM_FREQUENCY 10000 //10KHz
#define SPINDLE_PWM_MAX_VALUE (1000000 / SPINDLE_PWM_FREQUENCY)
#define SPINDLE_PWM_MIN_VALUE 1 // Must be greater than zero.
#define SPINDLE_PWM_OFF_VALUE 0
#define SPINDLE_PWM_RANGE (SPINDLE_PWM_MAX_VALUE-SPINDLE_PWM_MIN_VALUE)

naturellement si je change ces valeurs , en mettant par exemple la fréquence a 20KHz je vais donc réduire la définition pour n'obtenir plus que 50 nuances de gris :lol: ce qui me parait insuffisant
je suppose que dans l'alim il doit y avoir un filtre RC calculé pour obtenir a la fois un bon temps de réponse et une faible ondulation résiduelle face a une PWM de 20KHz et supérieure
Ma question est la suivante :
peut on raisonnablement mettre en entrée une PWM de 10KHz sans voir la puissance du signal laser devenir trop fluctuante ? (tout ajout d’électronique entre le signa PWM du STM32 et l'entree IN de l'alim risquant de grever fortement le temps de réponse qui doit être excellent en cas de gravure d'image par exemple.
si quelqu'un a une idée , je suis preneur
Merci et bravo pour votre travail.
cordialement
mstrens
Messages : 2611
Enregistré le : 27 févr. 2018 12:58

Re: Laser / probleme avec le pin PWM

Message par mstrens »

A ma connaissance il n'y a pas de rapport direct entre la fréquence du signal PWM et la résolution.
La fréquence détermine l'intervalle de temps entre 2 impulsions. A 10kz, il y a une impulsion toutes les 100usec.
La puissance est en fait déterminée par le ratio entre le signal haut et le signal bas.
Le nombre de niveaux de puissance est déterminé par le nombre de bits du timer du STM32. Ce timer étant en 16bits soit 1024 pas, je présume que l'on a largement plus de 50 niveaux disponibles même si on passe à 20khz (car la fréquence du timer n'est pas de 1Mhz mais de 80 Mhz)

Même si le STM32 a ses sorties en 3V, il est possible d'obtenir un signal PWM de plus de 3 volt car la sortie PWM sur le shield est la sortie d'un ULN2803.
En mettant une résistance de rappel à 5v, le signal ira de 5V à environ 0.8V; Si l'entrée du laser est constituée d'un optocoupleur, il ne faut même pas de résistance de rappel et il faut relier l'entrée "-" de l'optocoupleur à la pin PWM du shield, la pin + de l'optocoupleur étant raccordée à 5V (ou 10V suivant le voltage attendu par le laser sur l'entrée PWM)
sym71
Messages : 9
Enregistré le : 16 juil. 2020 22:22

Re: Laser / probleme avec le pin PWM

Message par sym71 »

merci pour votre réponse rapide
j'ai bien vu tout ça :)
la distinction entre rapport cyclique et fréquence ;
le problème est que dans les laser CO2 (Alim) l'entrée IN est normalement prévue pour un signal en tension 0..5V fourni par un potentiomètre ou éventuellement par une PWM (amplitude 5V) et rapport cyclique variant de 0 a 100%
il est précisé dans les caractéristiques de l'alim que la fréquence de cette PWM devait être supérieure a 20KHz et cela se comprend car a l’entrée IN de l'alim il y a probablement un filtre passe bas RC prévu pour filtrer la PWM (>=20KHZ )et en tirer un signal continu en interne
(si on met une tension continue ça passe tout droit a travers le filtre)
si on met une fréquence PWM plus faible , je pense qu'il va rester une ondulation résiduelle sur le signal continu qui risque de provoquer une instabilité du faisceau laser (fluctuation de puissance peut être sensible à faible puissance (quand le rapport cyclique PWM est faible, c'est la que l'ondulation sera la plus forte)
normalement plus la fréquence est élevée plus le filtre RC sera efficace et réduira cette ondulation (au delà de plus d'une décade de la fréquence de coupure du filtre)
ma question est de savoir si avec une fréquence de 10 KHz l’atténuation de l'ondulation interne sera acceptable pour un bon fonctionnement du laser.
je crois avoir détecté dans le firmware que la fréquence PWM max était de

#define SPINDLE_PWM_MAX_VALUE (1000000 / SPINDLE_PWM_FREQUENCY)

le 1000000 vient de la prédivision du signal d'horloge micro ( prescaler) (je sais pas si on peut la changer sans effets de bord sur le reste)
donc si je programme 20000 dans SPINDLE_PWM_FREQUENCY ce qui fait 20KHz
je dois m'attendre a SPINDLE_PWM_MAX_VALUE =50
et donc une amplitude de variation de 50 pour la PWM entre MX et MIN qui vaut 1 ce qui fait donc 50 niveaux de puissance , ce qui me parait un peu juste pour faire de la gravure d'images en niveaux de gris , ligne par ligne (le mode pixels fonctionne différemment)
ce serait bien d'avoir au moins 100 niveaux de gris
Nb j'ai pas de pb avec électronique et les tensions a générer :) j'ai l'habitude
merci pour votre réponse
bien cordialement
mstrens
Messages : 2611
Enregistré le : 27 févr. 2018 12:58

Re: Laser / probleme avec le pin PWM

Message par mstrens »

Tu as probablement raison.

Il faudrait tester en changeant le prescaler dans cette instruction:
timerInitStructure.TIM_Prescaler = F_CPU / 1000000 - 1;
sym71
Messages : 9
Enregistré le : 16 juil. 2020 22:22

Re: Laser / probleme avec le pin PWM

Message par sym71 »

merci
je fais ça des que possible ! (j'ai cramé la liaison USB sur mon module BluePill et j'attends un autre que j'ai commandé :mrgreen: )
cordialement
mstrens
Messages : 2611
Enregistré le : 27 févr. 2018 12:58

Re: Laser / probleme avec le pin PWM

Message par mstrens »

a noter qu'il faut aussi sans doute changer aussi cette ligne dans cpu_map.h (en fonction de la nouvelle féquence attribuée au prescaler)
#define SPINDLE_PWM_MAX_VALUE (1000000 / SPINDLE_PWM_FREQUENCY)
sym71
Messages : 9
Enregistré le : 16 juil. 2020 22:22

Re: Laser / probleme avec le pin PWM

Message par sym71 »

oui je vais regarder ça , je suis en train (en attendant mon bluepill) d’étudier le datasheet du STM32 pour bien comprendre le fonctionnement du timer tel qu'il est utilisé ici , je te ferais part de toutes mes remarques , ça commence a devenir un peu plus clair, et il y a certaine variables redondantes (me semble t il) dans le firmware
cordialement
sym71
Messages : 9
Enregistré le : 16 juil. 2020 22:22

Re: Laser / probleme avec le pin PWM

Message par sym71 »

Bonjour
toujours pas reçu mes modules BluePill donc je cogite en attendant sur le timer
voici le résultat de mes recherches et réflexions , ça peut clarifier l'esprit et rendre service

le Timer (1) fonctionne de la même manière que dans la plupart des µcontroleurs actuels
c'est un compteur (ici sur 16bits) qui travaille en mode free run , c'est a dire qu'il compte des tics d'horloge de 0 a (65536-1) soit 2^16 puis repasse a 0 en générant au passage une interruption dans laquelle on pourra ou non modifier une pin du µcontroleur associée
l'horloge du timer peut provenir de différentes sources (programmation)
soit une source externe (ce n'est pas notre cas)
soit une source interne (c'est notre cas)
dans ce cas la source et l'horloge CPU qui possède une fréquence F_CPU=72MHz
cette fréquence étant trop élevée on la fait passer dans un prédiviseur qui la ramène a une valeur plus raisonnable
ce prédiviseur est programmable grâce a un registre (prescaler) qui contiendra une valeur entière égale a PSC= Diviseur-1
on aura ainsi F_TIM=F_CPU/(PSC+1)
on aura ainsi la largeur d'un tic d'horloge timer = 1/F_TIM
exemple: F_CPU=72000000 Hz
PSC=71 ; // diviseur=72
F_TIM=72MHz/72=1MHz
tic timer=1µsec
si on génère une pulse sur la sortie a chaque passage a 0 du timer on devra compter 65536 tics
soit une période de 65536 µs et une fréquence de signal de 10^6/65536=15,25Hz
une PWM a cette fréquence sera beaucoup top faible dans la plupart des cas , c'est pour cela qu'il existe une autre possibilité qui complique un peu mais qui est bien utile
on peut arreter le timer avant qu'il n'arrive a 65535 grace a un registre qu'on nomme souvent CTC (clear to Compare) qui permet la remise a zero anticipée du timer
ce registre s'appelle TIM_period dans le firmware
pour faire simple , si TIM_period contient 100-1 le timer sera remis a 0 au bout de 100 tics et générera une interruption au passage (dans laquelle on pourra (ou pas) modifier la sortie)
comme le timer a été aborté avant sa fin naturelle , la période est écourtée et donc la fréquence est augmentée
si tic =1µsec
avec TIM_period=99 on aura une période de 100 tics soit 100µs ce qui équivaut à 10KHz
et la PWM dans tout ça ?
la PWM consiste a utiliser une sortie digitale du µControleur et d'en modifier le niveau (0=gnd , 1=3.3v) en fonction des valeurs du timer , on définira ainsi une valeur SH et SB (pour haut et bas) sachant que SH+SB=TIM_period+1
dans notre exemple la PWM variera donc de 0 a 100 ce qui aura pour conséquence

sur une CNC la vitesse se fera en 100 paliers maxi
sur un laser la puissance en 100 niveaux

// en résumé
pour la PWM il y a deux choses a considérer
1) on doit déterminer la précision (résolution ) de la PWM c'est a dire le nombre de paliers de réglage ,
pour une CNC je pense que c'est clair , ça l'est moins pour le laser , car suivant les matières on commence a graver à partir d'une certaine puissance et il risque de n'y avoir que peu de latence pour faire les niveaux de gris désirés (pour une image par exemple)
ce réglage se fait par la valeur de SPINDLE_PWM_MAX_VALUE (souvent 100) (cpu_map.h)
qui sera reportée dans spindle control par TIM_Period=SPINDLE_PWM_MAX_VALUE-1;
2) on doit choisir la frequence de la PWM
ce choix dépend du driver de Spindle , les caractéristiques sont différentes suivant les cas (CNC analogique,brushless ; laser LED;laser CO2 etc..)
si on veux 100 niveaux sur un laser CO2 par exemple
les alims de laser CO2 exigent pour un bon filtrage une fréquence PWM >= 20KHz

voila comment on fait le calcul
soit N=nombre de tics Timer = nombre de niveaux = SPINDLE_PWM_MAX_VALUE
PSC+1= division de frequence CPU ; PSC = valeur prescaler

F_TIM=F_CPU / (PSC+1)
F_PWM=F_TIM/N donc F_TIM=F_PWM+N
on en déduit PSC+1= F_CPU/(N*F_PWM)

vérification sur des exemples:
1er) exemple défaut du firmware
frequence PWM = 10KHz
N=100 => on mettra 99 dans TIM_Period
PSC+1= 72000000/(100*10000)=72 => on mettra 71 dans TIM_Prescaler

2 ex) laser CO2 a 20KHz
frequence PWM = 20KHz
N=100 => on mettra 99 dans TIM_Period
PSC+1=72000000/(100*20000)=36 => on mettra 35 dans TIM_Prescaler

3ex ) ou ça tombe pas sur des entiers
laser CO2 a 20KHz
frequence PWM = 20KHz
N=256 => on mettra 255 dans TIM_Period
PSC+1=72000000/(256*20000)=14.0625
on prendra donc 13 pour PSC
ce qui donnera une valeur réelle de F_PWM=F_CPU/(N*(PSC+1))
F_PWM=72000000/(256*14)=20.089 kHz
voilà
j’espère que cela pourra éclairer certains
je compte vérifier tout ça bientôt avec ma carte et un oscillo
cordialement
sym71
Messages : 9
Enregistré le : 16 juil. 2020 22:22

Re: Laser / probleme avec le pin PWM

Message par sym71 »

petite erreur ds le texte il faut lire
F_PWM=F_TIM/N donc F_TIM=F_PWM*N au lieur de F_PWM=F_TIM/N donc F_TIM=F_PWM+N
desolé
Répondre