STM32 - ESC: Problème avec mon BEMF

Nov 06 2020

Je fabrique un ESC pour mon moteur BLDC. J'ai utilisé un STM32 (pour générer mon PWM), 3 pilotes mosfet IR2101 (https://www.infineon.com/dgdl/ir2101.pdf?fileId=5546d462533600a4015355c7a755166c) et 6 mosfets pour contrôler les différentes phases du moteur.

Mon schéma:

Je génère ma phase avec un PWM côté haut et un GPO côté bas.

Côté HAUT de mon PWM (phase A, B et C)

PHASE A (en dessous de 0V!)

Le signal semble correct mais quand je connecte mon moteur, nous pouvons voir que le BEMF est en arrière par rapport à un bon BEMF.

PHASE ABC

BEMF ABC

J'essaye de changer la fréquence du PWM, de changer le rapport cyclique ou le délai entre chaque phase mais rien ne change (et parfois c'est pire ...). Avez-vous une idée pourquoi?

Mon STM fonctionne à 8 MHz. Fréquence PWM: 900Hz avec un rapport cyclique de 5%. Lors de ce test, mon moteur consomme 12 V / 0,8 A.

ÉDITER

Je ne sais pas pourquoi mon BEMF est inversé par rapport à un bon.

Ci-dessous vous pouvez voir ma phase C (jaune), la masse virtuelle de mon moteur (bleu clair), l'opération mathématique Phase C - Masse virtuelle (bleu foncé) et la sortie de mon LM339 (rose).

J'ai vu plusieurs sujets sur ce problème sur Stack Exchange, mais à chaque fois, la réponse n'est pas claire. ( entrez la description du lien ici ).

Je suppose que mon PWM et mon BEMF ne sont pas «en phase» .. J'ai besoin d'explications.

Réponses

3 slightlynybbled Nov 10 2020 at 09:10

Bienvenue sur StackExchange! Bien joué premier message.

Vous avez raison, votre tension de forçage est déphasée avec votre moteur.

Il me semble que vous échantillonnez à un emplacement incorrect pendant votre cycle PWM. Assurez-vous que votre échantillon ADC se trouve au centre du cycle PWM lorsque le cycle PWM est élevé. Un cycle de service minimum peut être requis pour obtenir un échantillon approprié, mais ce n'est peut-être pas le cas car 900 Hz est une fréquence assez basse.

Il est difficile de supposer à partir des captures d'écran de votre scope, mais il semble que la phase soit négative allant du côté bas de votre PWM et positive du côté supérieur de votre PWM ... donc votre code fait probablement exactement ce que vous lui disent de faire, mais au mauvais endroit dans le cycle.

J'aime vérifier ma synchronisation d'interruption (approximativement) en configurant une broche pour qu'elle s'allume lorsque l'interruption ADC commence et qu'elle s'éteigne lorsque l'interruption ADC se termine. Je peux généralement en tirer de bonnes informations.

Si vous vérifiez / corrigez votre temps d'échantillonnage ADC et que le problème persiste, publiez une capture d'écran d'une phase en cours de montée, sur l'axe Y à pleine échelle.

Tenez-vous-en! Les problèmes sont résolus en baissant la tête et en y travaillant. Mais n'oubliez pas de vous éloigner et de dormir un peu. Les problèmes sont très différents le matin!


modifié pour ajouter

Sur la base de vos commentaires, j'ai l'impression qu'il peut y avoir des malentendus fondamentaux (je me trompe peut-être).

Calcul de la tension neutre

Tout d'abord, vous n'avez pas besoin de mesurer une tension neutre. Ceci est un module ADC gaspillé. Vous pouvez calculer votre tension neutre: neutral = (phaseA + phaseB + phaseC) / 3;. Vous recommandons de convertir cela en une notation à virgule fixe pour la vitesse, mais le calcul est correct. Maintenant, c'est un ADC de moins dont vous avez besoin!

Votre neutre semble assez correct. Si vous faites mentalement le calcul que je viens de décrire, vous verrez que la tension neutre est en effet la moyenne (ou très proche) des tensions de phase.

Configurer les registres pour faire le travail

Ensuite, si vous configurez vos registres TIM1 et ADC12 en alignement central et déclenchés au pic du mode compteur, aucun calcul n'est nécessaire pour échantillonner correctement.

Quand faire la navette

Dans votre commentaire, vous avez écrit

si la phase flottante - le sol virtuel = 0. Si c'est vrai, alors je connais théoriquement la durée à attendre avant de commuter la phase suivante sur haut

Cela n'est vrai que la moitié du temps et je veux juste le formuler avec clarté. Notez que la phase BEMF alterne entre la montée sur une phase et la chute sur une autre.

if(phaseIsRising){
    if(phaseVoltage > neutral)
        commutate();
}else{
    if(phaseVoltage < neutral)
        commutate();
}

Si vous implémentez correctement le code ci-dessus, vous pourrez faire fonctionner le moteur, mais 30 degrés d'avance. Croyez-moi, cela sera beaucoup mieux que dans vos captures d'écran.

La poursuite des travaux

Si vous arrivez jusqu'ici, je vous laisse le soin de déterminer comment décaler l'événement de commutation de 30 degrés.