Bonjour,
J'ai 2 signaux PWM de 20kHz et j'ai besoin d'en déphaser un pour que les signaux soient en oppositions de phases, si vous aviez des solutions je suis preneur !
Bonjour,
J'ai 2 signaux PWM de 20kHz et j'ai besoin d'en déphaser un pour que les signaux soient en oppositions de phases, si vous aviez des solutions je suis preneur !
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.
Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone".
Bonjour remilefortiche
Comme ceci?
int signalPwm = 55;
analogWrite(5, signalPwm);
analogWrite(6, 255 - signalPwm); // En opposition de phase
Cordialement
jpbbricole
Tu es sûr de toi là?
Si tu mets 127 comme consigne, tu crois que tu auras 2 signaux carrés en opposition de phase?
Si les PWM sont générés par 2 timers différents tu penses que cela restera vrai?
@remilefortiche il faudrait déjà nous dire sur quelle plateforme tu travailles. Sur certains processeurs c'est une fonction matérielle native.
Après, si la fonction n'est pas implémentée en matériel et que les signaux doivent seulement être en opposition de phase. Un porte inverseuse te donnera le complément de ton signal.
Donnes nous un peu plus de détails peut-être.
La vous ne gérez que le duty cycle mais pas le phase shift
(Et sur uno par exemple le PWM est à 490 Hz sauf sur les pins 5 and 6 où il est à 980 Hz)
hello, sur UNO
void setup() {
DDRB = 0b00000011;//D8 et D9 en sortie
}
void loop() {
PORTB = 0b00000010;
delayMicroseconds(75);
PORTB = 0b00000001;
delayMicroseconds(76);
}
Bonsoir fdufnews
Non, plus vraiment
Cordialement
jpbbricole
Bonsoir
rapport cyclique 50% ou rapport cyclique quelconque ?
(Si le rapport cyclique est différent de 50% un déphasage n'équivaut pas à une inversion......)
pour moi, éléctronicien , sans prise de tête j'inverse le signal PWM initial (rapport cyclique quelconque) avec une porte logique, un transistor bipolaire ou un Mosfet quelque soit le microcontrolleur utilisé pour produire le PWM.....
+1 Reference du mcro obligatoire.
Ce n’est que le resultat du réglage à la sauce arduino, c’est modifiable.
Comme cela, sans connaitre le nom de la plate-forme, je dirais que la PWM est basée sur la valeur de compteurs, in french un timer s’appelle un compteur ( certes évolué ).
La valeur de départ d’un compteur peut-etre modifiée avant le lancement de la PWM, ce qui permet d’avoir n’importe quel dephasage.
Pour cela, surtout s’il s’agit d’un atmega qui est simple, AMHA, il est préférable d’oublier la fonction arduino analogWrite et de ne travailler qu’avec les registres du micro.
oui certes mais faut faire attention à ce que l'on fait.
L'ATmega328P dispose de plusieurs timers qui contrôlent le PWM. Timer 0 pour les pins 5 et 6 et Timer 1 et Timer 2 pour les pins 9, 10 et 3 , 11.
Le Timer 0 est configuré pour être utilisé comme base de temps pour millis()
et micros()
est a une configuration adaptée à cet usage (quasiment 1KHz)
les Timer 1 et 2 sont configurés pour une fréquence PWM de 490 Hz (sans doute parce que c'est plus adapté pour piloter des moteurs ou de l'audio ?).
➜ il est bien sûr possible de modifier les fréquence mais dans l'absolu il vaut mieux éviter de toucher à la configuration du Timer 0 car cela affectera les fonctions de temporisation du système.
si @remilefortiche reste sur une solution de contrôle des PWM pour son opposition de phase et ne prend pas une solution matérielle (inverseur, 2 optos avec un pullup,...) il vaut mieux prendre les 2 pins parmi 3, 9, 10 et 11.
Oui, comme une voiture s'appelle un moteur (certes évolué)
490Hz : timer 1 oui, timer 2 non 980 Hz comme le timer 0
Timer 1
Les 3 timers ayant le même diviseur d'horloge, les 490Hz sont le résultat du choix de mode de PWM (de mémoire mode "phase correcte").
Ce n'est pas documenté, il faut lire les registres de pilotage de la PWM et comparer avec les renseignements de la datasheet du micro.
Mais ce n'est valable que pour le micro Atmel AVR.
Pour les micro ARM et/ou Espressif ou Rp2040 c'est plus complexe, et même trop complexe pour moi et ce que j'ai à faire avec la PWM.
A mes tous débuts avec arduino j'avais testé le déphasage en fixant la valeur de départ du compteur d'un timer.
C'est à cette occasion que j'avais remarqué que la fonction analogWrite n'était pas vraiment terrible.
Si on fait un changement de rapport cyclique avec analogWrite, le signal hoquette pendant plusieurs périodes.
Si on fait la même chose avec les registres, le signal est immédiatement parfaitement stable et le changement de RC est instantané.
Il est vrai que si @remilefortiche ne cherche qu'à obtenir deux signaux PWM en opposition de phase une porte logique inverseuse est LA réelle solution.
La solution du déphasage en jouant sur la valeur de départ d'un timer oblige à monopoliser deux timers.
Si on ne veut pas toucher au timer0 parce que l'on utilise des fonctions de temps il faut modifier la configuration du timer 1 pour le rendre identique au timer 2.
effectivement j'ai dit n'importe quoi sur ce point là
Je croyais que c'était un char.
Cela fait au final 3 signaux PWM d'après l'énoncé.
Toutes les solution utilisant analogWrite ne fonctionnent pas à cause du 20kHz.
Une fois de plus, si le besoin n'est pas bien clair, on bavarde dans le vide. Par exemple:
~ on a besoin d'un seul signal PWM et d'un deuxième signal construit à partir du premier?
~ le deuxième est déphasé de 180° ou inversé (je ne parle d'opposition de phase que pour des signaux sinusoïdaux)?
~ A quoi servent ces signaux? Il y a parfois de meilleures solutions que celle du départ.
~ De quel résolution a-t-on besoin?
~ Le ou les signaux sont produit par la carte micro ou viennent-il d'ailleurs?
~ ...
hors sujet car mes signaux sont à 28.846KHz
il est possible de jouer sur le ratio mais pas sur la fréquence ( elle est prisonnière du préscaler)
sur UNO
void setup() {
DDRB |= 0b00001000; //D11
DDRD |= 0b00001000; //D3
TCCR2A = 0b11100001; //toggle A(D6) et B(D5) mode CTC
TIMSK2 = 0b00000001; //overflow
OCR2A = 127;
OCR2B = 127;
TCCR2B = 0b00000001; //prescaler /8
}
void loop() {
// put your main code here, to run repeatedly:
}
Vrai seulement si on veut 256 niveaux avec le timer 2. Si on veut deux signaux de tensions opposées avec un choix de la fréquence et du rapport cyclique on peut utiliser:
Si on veux deux signaux décalés de 25µs, on peut utiliser deux timers.
La question de départ n'est pas assez précise!
On peut faire quelchose en jouant avec deux timers. Voir le site de Mike Gammon. Il explique comment créer un vrai 38 kHz ou un vrai 40 je ne me rappelle plus exactement. Ce qui est sur c’est que la valeur s’échappe de la prison prescaleur.
Merci, je vais aller voir👍
édit: punaise il a fait un sacré boulot
Dommage qu'il ne l'a pas étendu à ESP32.