1 pièce(s) jointe(s)
Non linéarité vitesse/PWM
Bonjour à tous,
J'ai utilisé le programme de Jay M
J'ai réglé le PWM à différentes valeurs >=64, pas de 16
J'ai relevé la vitesse finale (Nb de fronts par sec) en faisant la moyenne sur 30 sec
Voilà ce que ça donne :
Pièce jointe 593352
Pas linéaire du tout !!
Je m'y attendais pour les basses valeurs de PWM, puisqu'en deçà de 64, la rotation n'a plus lieu
A noter, la singularité du PWM à 255 (à cause de l'absence de commutation ?)
Du coup, pour un éventuel asservissement en vitesse, il faudra calculer un gain en linéarisant autour du point de fonctionnement,
en travaillant sur des échelons de vitesse d'amplitude modeste, si on veut avoir une chance de faire matcher calculs et mesures.
Idem pour obtenir la constante de temps.
Comme le disait jpbbricole, il y a de nombreux phénomènes qui rendent cette linéarité caduque, sur de grandes amplitudes.
Cordialement
Horus68
2 pièce(s) jointe(s)
Comparaison de différents ponts
Bonjour,
Après avoir suspecté mon alim, une HQPower 2A, 0 à 12V
et testé le comportement moteur avec une Elix 3A, 0-30V sans constater d'amélioration...
J'ai testé différents hacheurs pour comparaison. Même programme, branchements analogues et même principe de commande :
PWM sur la broche En (Enable) ou sur la "gate" du MosFet
Pont en H L293D du starter kit, avec branchements du livret ;
MosFet IRF520, diode de roue libre, résistance, conforme au schéma ci-dessous :
Pièce jointe 595418
Et ça donne ça :
Pièce jointe 595419
On peut observer une certaine constance des résultats (non linéarité), et des différences importantes...
Aucune idée des causes probables...
Cordialement
Horus68
1 pièce(s) jointe(s)
Correction des imprécisions du codeur par post-traitement
Re,
J'avais dit que je ferai un petit programme python pour voir si on pouvait améliorer les mesures, le voilà
(les puristes y trouveront sans doute beaucoup à redire)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| ## Repérage des différents poles et calcul des angles entre chaque
# En régime permanent, la vitesse est constante, la durée entre deux poles n'est pas exactement la même
# On importe le fichier texte contenant les intervalles de temps en microsecondes entre 2 ticks
# On prend la moyenne des intervalles sur n tours consécutifs en partant de la fin
# On en déduit une succession d'intervalles angulaires pour faire un tour
# On calcule la vitesse en prenant angle calculé/durée mesurée
import numpy as np
import matplotlib.pyplot as plt
poles = 6 # fronts par voie (paires de poles)
voies = 2 # voies codeur
nbtours = 1 # nb de tours sur lesquels est calculée la moyenne
cycle = poles*voies # nb de fronts sur un tour
fichier = open("essai.csv","r",encoding="utf8")
# temps en millisecondes entre deux fronts
temps = [float(x) for x in fichier.read().split()]
# vitesse en tours par seconde, sachant qu'un tour est fait en "cycle"s fronts
# en supposant que l'écart angulaire entre 2 fronts est absolument régulier
vitesse = np.array([1000/(t*cycle) for t in temps])
# Echelle des temps
T=np.array([sum(temps[:i]) for i in range(len(temps))])/1000
# Ici, on a exclu le dernier tour (ralentissement) du fichier csv
def moyenne(temps) :
""" Moyenne des périodes de chaque "pole", à vitesse supposée constante, appliquée à un fichier 'propre', sans valeur exceptionnelle en fin de colonne"""
temps_sum = temps[-cycle:] # somme des valeurs en vue d'une moyenne, initialisation
for i in range(nbtours-1) :
for j in range(cycle) :
temps_sum[j] += temps[-(2*(i+1)*cycle)+j]
return np.array(temps_sum)/nbtours # Calcul et renvoi de la moyenne
DeltaT_moy = moyenne(temps) # Période moyenne de chaque "pole" en ms
Theta_moy = DeltaT_moy/sum(DeltaT_moy) # angle moyen entre chaque pole (en fraction de tour)
def vitesse_corr(temps) :
""" Vitesse corrigée des variations angulaires des poles"""
i0 = cycle - len(temps)%cycle
return np.array([Theta_moy[(i0+j)%cycle]*1000/temps[j] for j in range(len(temps))])
vitesse2 = vitesse_corr(temps)
plt.plot(T,vitesse,label = "vitesse brute (tr/s)")
plt.plot(T,vitesse2,label = "vitesse corrigee (tr/s)")
plt.legend()
plt.show() |
Mais bon, ça tourne.
On obtient ça sur un fichier test, extrait de mesures en millisecondes, la durée étant un peu courte pour assurer être en régime permanent sur plus d'un tour (le dernier), mais la comparaison est sans équivoque (sauf le premier point qui est une singularité due à une mauvaise maitrise de la communication série, sans doute)
Pièce jointe 595427
C'est pour le moment le travail le plus satisfaisant que j'ai pu effectuer sur ce thème.
Il parait que la démarche d'investigation c'est pédagogiquement super, mais c'est un peu chronophage quand on est pas doué !!
Cordialement
Horus68
1 pièce(s) jointe(s)
Vitesse et précipitation : Au temps pour moi !!
Salut Guesset,
Finalement, la différence entre 980Hz et 490Hz existe, mais elle n'était pas transcendante à mes yeux.
J'ai essayé de pousser la logique jusqu'au bout, puisque sur la notice du PmodHB5, ils parlaient de 2 kHz,
en modifiant la fréquence PWM, ça donne :
Pièce jointe 595879
Seuls les 31250 Hz donnent un résultat avec une linéarité jusqu'à 0,
celle à 3906 ayant une cassure, comme les autres...
L'inconvénient majeur, c'est la faible plage de valeurs permettant de faire tourner le moteur : de 130 à 255,
la moitié de la plage de réglage totale a priori disponible.
Je vais pouvoir essayer de mesurer le transitoire pour différentes valeurs de PWM en échelon,
pour voir si on obtient une vraie constante de temps, ce qui n'est absolument pas le cas avec des fréquences PWM standard.
Cordialement