Outils PWM Frequence et duty Cycle

  • Auteur de la discussion vibram
  • Date de début
V

vibram

Compagnon
Salut,

J'ai du changer le moteur des avances de ma fraiseuse, j'en ai profité pour mettre un servo que je vais piloter via un microcontroller. j'ai deux modes, soit des avances auto via une commande step/dir (en utilisant le PWM du MCU), soit via un encodeur rotatif (jog) converti en step/dir via le MCU.

J'ai juste un doute concernant le PWM pour créer mon signal step.
Je pensais utiliser un dutycycle de 50% pour avoir un beau signal équilibré et jouer sur la frequence (via un potentiometre) pour varier la vitesse mais je remarque que dans la plupart des codes, la frequence est fixe et on fait varier le duty cycle pour faire varier l'intensité de la led.

Certains ont-ils deja fait ce genre de chose ? avez-vous des conseils ?
Merci
 
G

gégé62

Compagnon
je ne sais pas si ce que je vais dire est judicieux, mais bon

Pour avoir pas mal bricolé avec des brushless (des petits, juste pour apprendre et m'amuser) et arduino, je dirais que au départ les fréquences sur lesquelles "on" s'appuie sont toutes plus ou moins des sous-multiples de la fréquence d'horloge, en général 16 Mz sur arduino. Donc ce que tu constates parait logique.
A partir du moment où tu veux d'autres fréquences, en particulier si tu veux qu'elle varient de façon progressive, il faut que tu "fabriques" toi-même ton PWM. On détermine l'instant exact du début et de fin de chaque impulsion par comptage des impulsions d'horloge (ou de ses sous-multiples). Il faut utiliser les interruptions et je pense qu'on est plus ou moins obligé d'employer le langage direct du microcontroleur, pour ces commandes là (pas de "AttachInterrupt"....). Mais peut-être connais-tu cela très bien. Sinon il y a des tutos géniaux, comme Locoduino, à ne pas rater ! et ce forum bien sûr.
Difficile d'en dire plus pour l'instant, à toi la balle...... :-D
 
V

vibram

Compagnon
OK merci pour les Infos !
Effectivement mon code est composé de pas mal de attachinterrupt justement mais qui sont là pour mettre en route ou arrêter le PWM.

Pour le reste de ton message, c'est un peu au dessus de mes compétences vis à vis de l'horloge. Comme souvent ça va se finir en tests empiriques :wink:
 
D

DavidH

Compagnon
EDIT: J'ai mal compris la question. Ignorez SVP ma réponse

Salut,
Je suppose que c'est un moteur DC.
Si tu envoies le signal (0,1) avec un "duty cycle" 50 % - la valeur moyenne du tension est 50% du max - peu importe la fréquence.
c'est pourquoi il faut changer le rapport entre le zéro et la crête.
Tu peux soit garder la fréquence fixe et modifier la durée du zéro et de la crête.
Soit tu gardes la durée de la crête fixe et tu modifies la durée du zéro (du zero - puissance max, infinie -)
puissance zero) dans ce cas la fréquence va varier en fonction de la puissance

(bien évidement c'est pas la même chose pour les moteurs pas à pas ou d'autre moteurs synchrones )

Cordialement David
 
Dernière édition:
G

gégé62

Compagnon
Je suppose que c'est un moteur DC
j'avais supposé que c'était un brushless.....à vrai dire sans y réfléchir. En fait je l'ai traité comme moteur synchrone, de même qu'un PaP. Une impulsion vers le moteur tour à tour vers chaque bobine. Ce n'et sûrement pas très orthodoxe.
 
D

DavidH

Compagnon
Rebonjour,
je viens de relire le post initial et je pense que j'ai mal compris la question.
J'ai pensé au électronique qui contrôle le moteur mais @vibram s interroge sur les signaux (step et dir) envoyés dans le servo.
(ça je ne sais pas comment ça marche)

Pour les "RC servo" selon wikipedia
"l'impulsion d'entrée se traduit par une vitesse de rotation et la valeur centrale typique de 1,5 ms est la position d'arrêt. Une valeur plus petite devrait faire tourner le servo dans le sens des aiguilles d'une montre et une valeur plus élevée dans le sens inverse des aiguilles d'une montre."

Cdt David
 
Dernière édition:
V

vibram

Compagnon
Pardon je parlais bien des signaux step/dir qu'on envoie au driver. Après ce que fait le driver ce n'est plus mon problème :)

Jai pas mal avancé le code, je vais bientôt passer au prototypage si ma femme n accouche pas d'ici là :)
 
B

Boris_25

Compagnon
Il y a un topo qui explique comment faire varier la fréquence sur ARDUINO, perso je n'ai jamais testé, et franchement j'ai du mal à comprendre le truc.

Par contre il y a une fonction que j'utilise, certes un peu cavalière, et peu académique, mais très simple et qui peut faire l'affaire, elle est d'ailleurs décrite dans l'article ci-dessus, qui consiste à générer les "puls" manuellement,c'est ce que j'utilise et c'est facile mettre en œuvre, voici le code :

On fixe par programmation une activation HIGH/LOW avec les délais en microsecondes, il suffit de faire varier le temps du "LOW" pour varier la vitesse.
Il faut cependant faire attention à plusieurs choses:
- Activer le "dir" avant d'envoyer les "puls", il y a un délai à respecter, voir la documentation du driver.
- Le temps de la "puls" en "HIGH" doit avoir une valeur minimum, de même se référer à la documentation du driver.
- Il y a une fréquence à ne pas dépasser, limite du driver, mais je pense que l'arduino aura sa limite avant celle du driver.
- Ce système est sensible aux interruptions qui vont perturber la fréquence générée.

PS : @vibram profite bien de la naissance. :smt023
 
V

vibram

Compagnon
Il y a un topo qui explique comment faire varier la fréquence sur ARDUINO, perso je n'ai jamais testé, et franchement j'ai du mal à comprendre le truc.

Par contre il y a une fonction que j'utilise, certes un peu cavalière, et peu académique, mais très simple et qui peut faire l'affaire, elle est d'ailleurs décrite dans l'article ci-dessus, qui consiste à générer les "puls" manuellement,c'est ce que j'utilise et c'est facile mettre en œuvre, voici le code :

On fixe par programmation une activation HIGH/LOW avec les délais en microsecondes, il suffit de faire varier le temps du "LOW" pour varier la vitesse.
Il faut cependant faire attention à plusieurs choses:
- Activer le "dir" avant d'envoyer les "puls", il y a un délai à respecter, voir la documentation du driver.
- Le temps de la "puls" en "HIGH" doit avoir une valeur minimum, de même se référer à la documentation du driver.
- Il y a une fréquence à ne pas dépasser, limite du driver, mais je pense que l'arduino aura sa limite avant celle du driver.
- Ce système est sensible aux interruptions qui vont perturber la fréquence générée.

PS : @vibram profite bien de la naissance. :smt023
Merci :) ça va arriver d un moment à l'autre c'est censé être la dernière semaine !

Pour le code, c'est exactement ce que je fais pour le mode Jog ou je compte les pulses du codeur rotatif et je génère le signal comme tu le décris en décomptant pour être air d'avoir le bon nombre de pulses.

Je voulais utiliser le PWM pour les avances auto /rapides car tout le semble dire que c'est la bonne pratique. Mais je ne vais pas me prendre la tête plus que ça, si ça me fonctionne pas rapidement je ferais tout en mode manuel. Je crois que l'intérêt du PWM c'est que tu peux aller sur des fréquences plus élevées sans saturer le mcu. Surtout que ça tourne sur un timer et donc pas dans la boucle loop qui doit pouvoir faire autre chose en même temps.


La suite bientôt
 
C

cr-_-

Compagnon
Bonsoir,
Le pwm ou mli en français (modulation de largeur d'impulsion) n'est pas adapté ici puisqu'il y a besoins de faire varier la fréquence du signal et par définition en pwm la fréquence est fixe. Par contre l'utilisation des timers du microcontroleur est plus large que ce mode là.

Par exemple ce projet utilise un des timers dispo en faisant varier la fréquence des impulsions https://hackaday.io/project/188811-arduino-based-square-pulse-generator-1mhz
 

Sujets similaires

V
Réponses
3
Affichages
1 002
vibram
V
P
Réponses
33
Affichages
15 247
wika58
wika58
F
Réponses
6
Affichages
25 644
fraiddy
F
V
Réponses
182
Affichages
11 515
Precis84
P
B
Réponses
70
Affichages
3 000
Bambi
B
L
Réponses
30
Affichages
3 348
MegaHertz
MegaHertz
den's 12
Réponses
7
Affichages
2 503
den's 12
den's 12
O
Réponses
28
Affichages
5 311
dh42
S
Réponses
10
Affichages
2 138
sweex59
S
Haut