position_feedback_loop/README.md
2022-01-20 19:53:59 +01:00

3.3 KiB
Raw Blame History

Asservissement de Position

Intro

- Programmable System on Chip
- Lidé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 dinitialiser 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 dune consigne via UART

- Récupérer une suite de caractère dans un tableau
- Le convertir via la fonction atoi (iota faisant linverse)
- En mode debug tout fonctionnait
- La fonction getbuffersize permet de ne récupérer quà un certain moment

Affichage de lerreur avec sortie analogique

- Au début idée davoir 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 dune 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 lerreur sur une réponse à une rampe
- Calcul de laire de lerreur pour la réduire
- Réducteur Ki doit être bas à 10^-4 près
- Perturbe léchelon car augmente très vite dun 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 dune fonction (bool non présent)
- Allume le quaddec quand à 0°