Étape 5: Détails du logiciel : vitesse contrôle et autres fonctions de base
Étant donné que c’est une sorte d’une coopérative très simple «système d’exploitation temps réel , "chaque routine doit être exécuté dans les plus brefs délais, libérant ainsi le système pour s’occuper des interruptions très fréquentes.
Il y a pas « attendre » et aucun retard dans le code. Chaque fois que possibles interruptions sont utilisées, en particulier pour lentes opérations telles que la transmission ou la réception de chaînes de caractères. UART communication prend l’advantege des capacités de la dsPIC33F DMA pour gagner du temps CPU, faisant tout le travail « sale » dans le matériel.
Périphériques utilisés sur dsPIC33FJ128MC802 :
-QEIs pour calculer la trajectoire parcourue.
-Entrée (IC) pour calculer la vitesse de Capture.
-Convertisseurs A/N à lire le courant moteur.
-Amélioration de PWM pour piloter les moteurs.
-UART pour communiquer avec le monde extérieur
Modules de QEI servent de savoir combien les roues ont voyagé et dans quelle direction. Cette valeur est algébriquement cumulées dans une variable chaque 1ms et envoyé aux fonctions de surveillant à sa demande. Après l’envoi de la valeur, les variables sont réinitialisés.
La vitesse est mesurée à impulsion tous de l’encodeur comme décrit ci-dessous. Chaque 1ms, il calcule la vitesse moyenne en faisant la moyenne des échantillons, exécute l’algorithme PID et corrige la vitesse du moteur en conséquence à son résultat, changer le rapport cyclique PWM. Pour une description détaillée de l’application de bibliothèque de C30 PID, consultez exemple de Code de puce : CE019 - contrôleurs utilisant proportionnel intégral dérivé (PID) de systèmes de contrôle de boucle fermée. http://WW1.Microchip.com/downloads/en/DeviceDoc/CE019_PID.zip
Les variations de vitesse des moteurs sont exécutées en douceur, accélération ou décélération avec une rampe inclinée montante ou descendante, afin d’éviter une déformation mécanique lourde et le glissement de roue qui puisse provoquer des erreurs dans l’odométrie. Décélération est plus rapide, puis accélération pour éviter les bosses avec obstacles pendant le freinage.
IC , capture d’entrée modules sont utilisés pour mesurer le temps écoulé entre deux impulsions générées par l’encodeur, le s signifiant lorsque les roues se sont rendus pour un célèbre fixe la quantité d’espace (constante SPACE_ENC ). Branchées en parallèle à QEA (interne à la DSC grâce à le sélectionnez périphérique de Pin de la dsPIC33F), ils capturent le temps écoulé sur front montant de signaux codeurs. TIMER2 est utilisé en mode course libre. À chaque interruption de l’IC, la valeur actuelle de TMR2 est stockée et sa valeur antérieure est soustraite de Il s’agit de la période d’impulsion. La valeur actuelle deviendrait alors la valeur précédente, en attendant la prochaine interruption. Drapeau de TMR2 doit être vérifié pour savoir si un dépassement de capacité s’est produit dans le registre de 16 bits. Dans l’affirmative, la différence entre 0xFFFF et l’échantillon précédent doit être ajoutée à la valeur actuelle. Les échantillons sont ajoutées algébriquement dans la variable IcPeriod selon _UPDN bit, afin de déterminer également la direction de la vitesse. C’est une des méthodes suggérées dans la note d’application Microchip AN545 .
La variable IcIndx contient le nombre d’échantillons ajoutés dans IcPeriod .
Chaque 1ms, la vitesse moyenne est calculée comme V = espace/temps
où espace = SPACE_ENC•IcIndx
(= espace couvert dans un codeur impulsion • nombre d’impulsions)
et temps = TCY•IcPeriod
(= la seule période TMR • sommation des périodes s’est produite).
Single_TMR_period = TCY = 1/FCY (fréquence d’horloge).
Oui V=Kvel•(IcIndx/IcPeriod)
où Kvel = SPACE_ENC•FCY d’avoir la vitesse en m/s.
Décalage à gauche 15 bits Kvel const (KvelLong = Kvel << 15 ) la vitesse est déjà calculée sous forme fractionnaire (aussi si seulement variables entières sont utilisées) prêt à être utilisé en routine de PID. Voir le fichier « descrEng.txt » dans le projet MPLAB pour obtenir une description plus détaillée.
Convertisseurs A/N mesurer en permanence les moteurs actuels, stocker des valeurs dans les 16 positions tampons ADCBUF. Lorsque les mémoires tampons sont pleines, une interruption se produit et une valeur moyenne est calculée approximativement chaque 1ms.
UARTs sont utilisés pour recevoir des commandes de dehors et de renvoyer les résultats des mesures. La partie communication du programme s’exécute comme une machine à États. Variables d’État sont utilisés pour exécuter des actions dans l’ordre. Très simple et rapide Interrupt Service routine (ISR) obtenir ou mettre chaque octet unique d’ou vers une mémoire tampon et définir les indicateurs de droite pour permettre le bon fonctionnement doit être exécutée.
Si n’importe quel type d’erreur se produit au cours de la réception (UART, somme de contrôle, l’analyse des erreurs), la variable d’État est définie sur un nombre négatif et le voyant rouge est allumé à communiquer à l’extérieur de cette anomalie. Voir le fichier « descrEng.txt » dans le projet MPLAB pour une liste complète des erreurs possibles.
Le protocole utilisé pour la poignée de main est indépendante de la couche physique et peut être utilisé aussi bien avec le bus I2C ou RS485 pour communiquer.
La première couche est contrôlée par l’interface de périphérique dsPIC. Erreurs de trame ou de dépassement (UART) ou à une collision (I2C) est détectées par le matériel, en définissant l’indicateur approprié.
La deuxième couche est gérée par des routines ISR. Ils remplissent le buffer RX les octets reçus des interfaces. Ils détectent aussi par buffer overflow et commande envahie.
Fonctions UartRx ou UartRx2 gérer la troisième couche . Tel que déjà décrit ces routines (voir aussi l’organigramme) agissent comme une machine à États, obtenir les octets de la mémoire tampon et le décodage de la chaîne de commandement.
Les octets sont échangés entre les deuxième et troisième couches (fonction ISR et UartRx) via une mémoire tampon circulaire. Rapport de recherche internationale reçoit un octet, stocke dans un tableau et incrémente le pointeur vers le tableau, si le pointeur atteint la fin du tableau qu'il est redémarré au début. La fonction UartRx a son propre pointeur de lire le même tableau, incrémenté (dans une circulaire beaucoup trop) dès que l’octet est décodé en l’état actuel de la RX. Boucle principale appelle la fonction UartRx chaque fois que le pointeur « in » diffère « out » pointeur.
Chaque paquet de commande se compose de :
0 - en-tête @
1 - ASCII ID 0-9
2 - Cmd A-Z ASCII
3 - CmdLen N = 1-MAX_RX_BUFF nombre d’octets suivant (checksum inclus)
4 - données...
...
N-1-données
N - checksum 0-255, obtenu en ajoutant simplement une variable 8 bits, tous les octets composant le message (checksum lui-même exclu).
Cette couche contrôle timeout et erreurs de somme de contrôle, ainsi que Constance paquet (en-tête correct, bonne longueur). Si tout est ok, il permet de routine Parser (quatrième couche ) pour décoder le message et d’exécuter l’action requise. Cette routine définit l’indicateur d’erreur approprié si le code de message reçu n’est pas connu.
TMR1 génère une horloge de synchronisation 1000Hz - le battement de coeur du programme. Sur interruption de chaque TMR1, horloges internes sont mises à jour, le chien de garde est effacé et un indicateur est défini pour activer la fonction qui demande la valeur d’espace fréquentée. Chaque fonction de « All_Parameters_Ask » de 10ms (vitesse, position, courante) est activée.