# Asservissement de Position ## Intro - Programmable System on Chip - L’idée de remplacer par du numérique - Blocs VHDL et du code en C ## Matériel Utilisé - Différence entre Kitprog et PSoC 5LP - Différence avec un FPGA classique -> mémoire flash/blocs analogiques - PSoC 5LP CY8C5888LTI-LP097 - Choix des Pins -> mode lock - Topdesign.cysch -> blocs VHDL, pins - main.c -> utiliser les fonctions des blocs ## Prise en main PSoC - pins 12.7 et 12.6 pour TX et RX - LCD en mode 4 bits + diff des pins - Utilisation de la datasheet - UART 57.6 Kbauds + COM26 ## Signal PWM - Différence entre 5-0 = 5, 2.5 - 2.5 = 0, 0-5 = -5 - Valeur moyenne captée par le moteur car alimenté à 3 MHz - Compare mode less(-128) et mode greater(+128) -> Période de 255 - Start permet d’initialiser comme ATMega16 - WriteCompare1&2 -> change la valeur de comparaison sur 8 bits - Alpha (0-1) converti avec la période (0-256) - Ne pose aucun problème si alpha > 1 ou alpha < 1 ## Acquisition de la position - Deux trous décalés et avec une certaine résolution - B en avance sur A -> incrémente, sinon décrémente - Résolution 16 bits mais peut être mise à 32 bits - Voir la valeur sur le mode debug pour convertir en angle ## Calcul Erreur pour asservir - Pour 27.7° nous augmentons de 0.1 alpha - Il faut ajouter 0.5 car alpha ne peut pas être négatif - 0.00461 paraît mieux ## Envoi d’une consigne via UART - Récupérer une suite de caractère dans un tableau - Le convertir via la fonction atoi (iota faisant l’inverse) - En mode debug tout fonctionnait - La fonction getbuffersize permet de ne récupérer qu’à un certain moment ## Affichage de l’erreur avec sortie analogique - Au début idée d’avoir 360° = 4V et 0° = 0V -> abs - 4V avec résolution de 16 mV/bit - 255/360 bits/degrés - Maintenant avec ampli + entre 180 et -180° -> ajout de +127 (comme +0.5) ## Cadencement à 10ms sous interruption - Avoir un Te plus bas pour faire un échantillonnage adapté - Bloc timer qui interrupt toutes les 10ms - Sortie isr_3 convertie en int grâce à PROTO - Quand int_3 = 1 -> va dans la fonction, flag à 1 - ReadStatusRegister remet certains bits à 0 quand appelée - UART reste dans le while(1) - Création d’une variable flagTemp pour compter 1s ## Création d’échelon/rampe - On commence avec une consigne de 50 - Toutes les secondes on inverse la consigne - On commence avec une consigne de 0 - On incrémente jusqu’à 0.5s, on décrémente par la suite -> boucle ## Erreur de traînage - Permet de réduire l’erreur sur une réponse à une rampe - Calcul de l’aire de l’erreur pour la réduire - Réducteur Ki doit être bas à 10^-4 près - Perturbe l’échelon car augmente très vite d’un coup -> dépassement - Ki = 0.00002 ## Passage par 0 - Utilisation du capteur de position - 12 bits -> résolution précise avec CAN à 18 KHz - Mode free-running, mode Vdda = Vref*2 = 2.5 *2 = 5V - Alimenté en 5V/0V - 5V à 0V pour 360° à 0° - On prend getresult16 car au-dessus de 12 - 0° est obtenu a 1854 via le debug - Création d’une fonction (bool non présent) - Allume le quaddec quand à 0°