Arduino lit la valeur du cycle de service PWM avec entrée (analogique / numérique)

Je travaille sur la comparaison de pilotes automatiques comme Ardupilot , CC3D , KK2.1.5 . La comparaison porte sur les réactions / comportements du système quil donne pendant le vol. Pour cela, jai besoin de lire les valeurs du cycle de service PWM (comme les osilascopes – la fréquence PWM peut varier de 50 à 430 Hz) à partir de la carte de pilote automatique. Il y a 4 PWM dentrée de commande et 4 PWM de commande esc pour un quadrotor typique. Je dois lire 8 valeurs de rapport cyclique avec des broches dentrée numériques / analogiques. Comment mesurer le rapport cyclique de 8 signaux PWM? De plus, la mesure numérique ou analogique est-elle précise et plus rapide?

Remarque à propos de la commande attachInterrupt : Selon arduino.cc Les séries AtMega328 ont 2 interruptions , La série Arduino ATmega 2560 a des interruptions 7 .

Réponse

Le code affiché dans ma réponse à la question 18183 , « Lire les canaux du récepteur RC en utilisant Interrupt au lieu de PulseIn ». Cette réponse a un code pour lire quatre canaux de RC PWM. Il peut facilement être adapté pour fonctionner avec huit canaux. Il a un ISR qui sexécute lorsque les broches sélectionnées changent. Il trie les canaux modifiés et stocke la valeur de micros() à chaque modification.

Voir également ma réponse à la question 19106 , « Les interruptions externes peuvent-elles être OU » d ensemble sur le « 328 (Uno)? » Cette réponse comprend un croquis pour générer un code ISR approprié. Ma réponse à la question 32572 , « Comment détecter la direction dun encodeur rotatif? », montre une autre instance.

Entrée numérique, comme utilisé dans le code mentionné ci-dessus, prend moins de une microseconde dix microsecondes dans lISR. Comme indiqué dans le commentaire de dannyf, le déroulement de la boucle for et (si possible) lutilisation de constantes au lieu de variables peut réduire le temps dentrée-ISR à 3,4 μs. Remarque, entrée et sortie ISR ajoutez encore plusieurs microsecondes.

Une entrée analogique 10 bits, par contre, prendra environ 104 microsecondes par lecture, un temps comparable à certaines des largeurs dimpulsion que vous mesurerez. Donc, ce nest pas assez rapide. Si la précision dégradée de lADC est acceptable, la diminution du facteur déchelle de lhorloge ADC comme expliqué dans une page Web sur microsmart.co.za peut réduire le temps de conversion AD à 20 μs. Cest environ trois fois plus long que lentrée numérique, donc plutôt lent.

Commentaires

  • > prend moins dune microseconde dans lISR, je trouve cela improbable. Évidemment, je ' ne suis pas sûr de quels morceaux de code vous parliez – car ils sont trois dentre eux. mais un regard causal sur eux suggérerait quil faudra plus de 16 ticks pour exécuter le corps de lISR – sans compter les frais généraux. En fait, un petit oiseau à moi a dit quil le ferait prenez près de 8us pour les exécuter sur un Uno, 🙂
  • @dannyf, je regardais lun des ISR les plus simples (comptage dun seul encodeur) lorsque jai écrit cela, il faudra donc modifier la réponse avec le correct heure. Désolé!
  • pas de problème. Deux suggestions: 1) dérouler la boucle while; 2) utilisez des constantes plutôt que des variables. et je ferais également de rcOld un élément statique à lintérieur de lISR afin que le code soit plus modulaire. avec cela, jai réduit le temps dexécution à 3,4us.
  • Pouvez-vous partager votre code au lieu de liens. En outre, la série AtMega328 a 2 interruptions, la série Arduino ATmega 2560 a 7 interruptions. Alors, comment puis-je mesurer 8 signaux PWM simultaneus? arduino.cc/en/Reference/attachInterrupt
  • @acs, ATmega328 ' ont 26 vecteurs dinterruption différents. Les vecteurs utilisés dans le code référencé sont pour les interruptions de changement de broche, ou PCINT, qui utilisent 3 de ces vecteurs. Les PCINT sont disponibles sur 22 des broches Nano ATmega328 et un nombre similaire sur les Uno ' s. Veuillez vous référer au code indiqué dans les questions précédentes – pour le moment, jai des délais de travail à respecter.

Réponse

si cela est fait en analogique, exécutez le pwm via un lpf et effectuez un adc sur la sortie;

si cela est fait en numérique, utilisez la fonction de capture dune minuterie ou utilisez une interruption externe / une interruption de changement de broche pour capturer le temps sur une base de temps.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *