Général Vitesse acquisition arduino et codeur quadrature.

  • Auteur de la discussion biduleur34
  • Date de début
B

biduleur34

Compagnon
Bonjour,

je possède un moteur qui Maxon tournera a 6000tr/min avec un codeur 1000ppr.

a cette vitesse l’Arduino déclenchera (6000x1000x4)/60 -->400 000 interruption seconde. soit un intervalle de 2.5us entre chaque interuption.



pensez vous que ce sois imaginable.

je ne sais pas évalué la capacité acquisition d'un Arduino, et donc quel modèle choisir.

merci de votre aide.

++
 
J

JMe87

Apprenti
Bonjour,
c'est evidemment beaucoup trop pour un pauvre Arduino qui tourne a seulement 16MHz.

Si tu commencais par nous expliquer ce que tu veux faire.

Bon dimanche

Jacques
 
B

biduleur34

Compagnon
je souhaite faire l'acquisition d'un codeur quadrature et asservissement pid de position de ce moteur.

comment as tu déterminé que ce serait trop ?

je compte développé sur arduino Due ou Teensy 3.2. donc quelques chose d'assez rapide.

merci
 
Dernière édition:
G

gaston48

Compagnon
Bonjour,
La Beaglebone black avec ses 3 canaux codeur eQEP peut le faire (10 Mhz de fréquence max je crois)
et pour ton asservissement tu peux passer par Linuxcnc (Machinekit plus particulièrement avec la BBB).
 
J

JMe87

Apprenti
Parce que, quand il fait une interruption, le micro doit sauver tous ses registres internes (son contexte), executer ton code puis restituer son contexte. Comme le code de d'Arduino est tres loin d'etre optimise, cela va prendre beaucoup plus de temps que ce que tu lui accordes.
Sans compter que, j'imagine, il doit aussi executer du code entre les interruptions.

Donnes-nous plus d'explications sur ce que tu veux faire. Le but final.

Je viens de faire une petite recherche :
tu peux lire ici http://gammon.com.au/interrupts
que le minimum, avec du code en assembleur est de 2.6uS + le code de la routine d'interruption.
 
M

moissan

Compagnon
il devrait pouvoir le faire a condition de ne faire que ça , ou pas grand chose de plus

une solution est donc d'utiliser un microcontroleur uniquement pour compter , et transmettre le resultat a un autre microcontroleur qui fait l'ensemble du travail

le micro controleur qui fait le comptage rapide ne fait que la detection de sens de rotation et un comptage decomptage pour reconstitué un autre signal en quadrature beaucoup plus lent , utilisable par le deuxieme microcontroleur qui fait l'asservissement

quand il faut faire des mouvement rapide le 2eme micro ignore le signal d'origine du capteur et n'utilise que le signal divisé ... quand il faut faire des mouvement plus lent et plus precis , le 2eme micro controleur prend en compte le signal direct du capteur , mais utilise aussi le signal divisé par le premier micro pour eviter de perdre des pas si il rate un peu le comptage du signal rapide

comment determiné la frequence maxi
par interuption on est loin du maxi possible par le micro controleur ... a chaque interuption il doit faire tout un travail ... il n'aura plus le temps de rien faire entre les interuption

pour chercher la frequence maxi il faut un programme a une seule boucle qui ne fait que tester les entré du capteur et envoyer le resultat de la division

le signal transmis au 2eme micro controleur n'est pas forcement un signal en quadrature plus lent : ça peut etre encore mieux : le resultat d'un comptage sur 8bit : le 2eme micro controleur peut donc prendre en compte les 8 bit si il veut faire un travail precis a vitesse lente , et ignorer les bit de poid faible quand ça va trop vite

le premier micro controleur pourrait faire un comptage sur un mombre de bit suffisant pour aller d'un bout a l'autre du mouvement , mais il risque de ne pas pouvoir le faire en un assez faible nombre d'instruction donc limiter la frequence maxi : c'est pourquoi je prefer que le premier micro compte uniquement les bit de poids faible

pour le 2eme micro surveiller un compteur 8 bit avec 8 fils demande moins de travail que surveiller une entré en quadrature : il suffit qu'il lise le compteur a une cadence suffisante pour ne jamais laisser passer plus de 256 pas

bien sur le BBB est la solution ideale
 
B

biduleur34

Compagnon
je souhaite faire un pilotage step/dir et asservissement PID pour moteur DC.

mais les 6000tr/min je ne les aurai pas tous le temps, à la rigueur a cette vitesse " rapide" je peu me passé d'un comptage quadrature et me contenté du comptage sur un seul canal avec le front montant du signal A par exemple soit une division par 4 du nombre d’interruption. avec un incrément de 4 pour le comptage.
 
G

gaston48

Compagnon
Moissan a raison, de toute façon un asservissement PID d'un dispositif mécanique a nécessairement
un temps de réponse qui permet de descendre une boucle de calcul PID toutes les 1 ms par exemple.
Toutes les 1 ms, tu peux te contenter de relever un compteur de position hard entretenu par le codeur
(Linuxcnc et Mesa travaille comme ça)
 
5

59JAG

Ouvrier
Bonjour,
Pour info sur mon projet de reducteur électronique avec arduino , j avais meusrer a l oscilloscope la vitesse de traitement entre changement etat de l encodeur ,le calcul de la division et envoi step sur driver cela prenait moins de 4us.
 
V

vibram

Compagnon
Bonjour,
Je vais suivre le sujet car je compte faire quelque chose de semblable.
je pensais utiliser un STM32 car un poil plus performant que l'arduino de maniere generale mais je n'ai pas encore regardé les caractéristiques en détail. je vais approfondir cela cette semaine. Est-ce que tu as regardé de ce coté là ? car le STM32 n'est pas si éloigné de l'arduino
 
B

biduleur34

Compagnon
@gaston48 tu sous entends un compteur Hard, en logique TTL ou Cmos ? avec lecture serie de la valeur tu aurais une référence ?

merci
 
C

coredump

Compagnon
Bonjour,
Je vais suivre le sujet car je compte faire quelque chose de semblable.
je pensais utiliser un STM32 car un poil plus performant que l'arduino de maniere generale mais je n'ai pas encore regardé les caractéristiques en détail. je vais approfondir cela cette semaine. Est-ce que tu as regardé de ce coté là ? car le STM32 n'est pas si éloigné de l'arduino

Sur un STM32 tu peux utiliser un timer en mode décodage quadrature, comme ca aucune limite coté CPU. L'AVR peut peut etre aussi le faire, je ne connais pas trop ses périphériques timers.
 
V

vres

Compagnon
Sur l'arduino on peut faire une interruption timer au environ 35kHz et lire les entrées A et B du codeur.
C'est beaucoup plus fiable et rapide que des interruptions sur les signaux A et B.



J'ai déjà posté un petit algorithme de décodage quadrature rapide. mais on sera limité a 35KHz.

Si on veux passer sur un vitesse supérieure il faut un circuit spécialisé comme la indiqué Gaston

je pensais utiliser un STM32 car un poil plus performant
C'est un très gros poil.
 
D

Doctor_itchy

Compagnon
j'ai fait un projet similaire il y as un moment , j'ai un code sur un arduino nano et moteur dc , limité a 2000t/min , codeur 1000ppt , seul truc pour gagner en vitesse , j'ai utilisé une sortie du codeur pour le pulse et l'autre pour la direction , donc pas de 4x possible mais seulement du 2x en résolution , en AB complet le cpu limitais a 500t/min , il a aussi ete codé en C direct sans passer par le bootloader arduino , car ça limitais trop l'usage cpu ... mais bon un arduino n'est pas assez puissant , il faut plutot utilisé un attiny 2313 , comme elmchan :) http://elm-chan.org/works/smc/report_e.html , prochain projet pour remplacer les cpu arduino :)
 
Haut