Correction code asservissement + réglage des gains
- Prise en compte du temps pour calculer la vitesse :-\ - Ajout saturation de la commande - Initialisation de l'intégrateur à 0 - Réglage des gains P et I
This commit is contained in:
parent
67f0e3c8f2
commit
324646d199
@ -1,7 +1,7 @@
|
|||||||
#include "QEI.h"
|
#include "QEI.h"
|
||||||
#include "Moteurs.h"
|
#include "Moteurs.h"
|
||||||
|
|
||||||
/*** C'est ici que ce fait la conversion en mm
|
/*** C'est ici que se fait la conversion en mm
|
||||||
* ***/
|
* ***/
|
||||||
|
|
||||||
// Roues 60 mm de diamètre, 188,5 mm de circonférence
|
// Roues 60 mm de diamètre, 188,5 mm de circonférence
|
||||||
@ -13,12 +13,18 @@
|
|||||||
// Impulsion / mm : 42,44
|
// Impulsion / mm : 42,44
|
||||||
|
|
||||||
#define IMPULSION_PAR_MM (42.44f)
|
#define IMPULSION_PAR_MM (42.44f)
|
||||||
#define ASSERMOTEUR_GAIN_P 20
|
#define ASSERMOTEUR_GAIN_P 160
|
||||||
#define ASSERMOTEUR_GAIN_I 0.0f
|
#define ASSERMOTEUR_GAIN_I .80f
|
||||||
|
|
||||||
double consigne_mm_s[3]; // Consigne de vitesse (en mm/s)
|
double consigne_mm_s[3]; // Consigne de vitesse (en mm/s)
|
||||||
double commande_I[3]; // Terme integral
|
double commande_I[3]; // Terme integral
|
||||||
|
|
||||||
|
void AsserMoteur_Init(){
|
||||||
|
for(unsigned int i =0; i< 3; i ++){
|
||||||
|
commande_I[i]=0;
|
||||||
|
consigne_mm_s[i]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, double _consigne_mm_s){
|
void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, double _consigne_mm_s){
|
||||||
@ -26,8 +32,9 @@ void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, double _consigne_mm_s){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
double AsserMoteur_getVitesse_mm_s(enum t_moteur moteur){
|
double AsserMoteur_getVitesse_mm_s(enum t_moteur moteur, int step_ms){
|
||||||
enum QEI_name_t qei;
|
enum QEI_name_t qei;
|
||||||
|
double distance, temps;
|
||||||
switch (moteur)
|
switch (moteur)
|
||||||
{
|
{
|
||||||
case MOTEUR_A: qei = QEI_A_NAME; break;
|
case MOTEUR_A: qei = QEI_A_NAME; break;
|
||||||
@ -36,7 +43,10 @@ double AsserMoteur_getVitesse_mm_s(enum t_moteur moteur){
|
|||||||
|
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
return (double) QEI_get(qei) / (double)IMPULSION_PAR_MM;
|
distance = (double) QEI_get(qei) / (double)IMPULSION_PAR_MM;
|
||||||
|
temps = step_ms / 1000.0;
|
||||||
|
|
||||||
|
return distance / temps;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AsserMoteur_Gestion(int step_ms){
|
void AsserMoteur_Gestion(int step_ms){
|
||||||
@ -47,7 +57,7 @@ void AsserMoteur_Gestion(int step_ms){
|
|||||||
double commande;
|
double commande;
|
||||||
|
|
||||||
// Calcul de l'erreur
|
// Calcul de l'erreur
|
||||||
erreur = consigne_mm_s[moteur] - AsserMoteur_getVitesse_mm_s(moteur);
|
erreur = consigne_mm_s[moteur] - AsserMoteur_getVitesse_mm_s(moteur, step_ms);
|
||||||
|
|
||||||
// Calcul du terme propotionnel
|
// Calcul du terme propotionnel
|
||||||
commande_P = erreur * ASSERMOTEUR_GAIN_P;
|
commande_P = erreur * ASSERMOTEUR_GAIN_P;
|
||||||
@ -57,6 +67,10 @@ void AsserMoteur_Gestion(int step_ms){
|
|||||||
|
|
||||||
commande = commande_P + commande_I[moteur];
|
commande = commande_P + commande_I[moteur];
|
||||||
|
|
||||||
|
//Saturation de la commande
|
||||||
|
if(commande > 32760) {commande = 32760;}
|
||||||
|
if(commande < -32760) {commande = -32760;}
|
||||||
|
|
||||||
Moteur_SetVitesse(moteur, commande);
|
Moteur_SetVitesse(moteur, commande);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,2 +1,6 @@
|
|||||||
void AsserMoteur_setConsigne_mm_s(enum moteur_t moteur, consigne_mm_s);
|
#include "Moteurs.h"
|
||||||
AsserMoteur_Gestion(int step_ms);
|
|
||||||
|
void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, double consigne_mm_s);
|
||||||
|
double AsserMoteur_getVitesse_mm_s(enum t_moteur moteur, int step_ms);
|
||||||
|
void AsserMoteur_Gestion(int step_ms);
|
||||||
|
void AsserMoteur_Init();
|
@ -27,7 +27,7 @@ add_definitions(-DGYRO_ADXRS453)
|
|||||||
pico_enable_stdio_usb(test 1)
|
pico_enable_stdio_usb(test 1)
|
||||||
pico_enable_stdio_uart(test 1)
|
pico_enable_stdio_uart(test 1)
|
||||||
pico_add_extra_outputs(test)
|
pico_add_extra_outputs(test)
|
||||||
target_link_libraries(test pico_stdlib hardware_spi hardware_pwm hardware_structs hardware_pio)
|
target_link_libraries(test pico_stdlib hardware_spi hardware_pwm hardware_structs hardware_pio pico_multicore)
|
||||||
|
|
||||||
add_custom_target(Flash
|
add_custom_target(Flash
|
||||||
DEPENDS test
|
DEPENDS test
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
#include "pico/stdlib.h"
|
#include "pico/stdlib.h"
|
||||||
|
|
||||||
|
#ifndef MOTEURS_H
|
||||||
|
#define MOTEURS_H
|
||||||
enum t_moteur {
|
enum t_moteur {
|
||||||
MOTEUR_A=0,
|
MOTEUR_A=0,
|
||||||
MOTEUR_B=1,
|
MOTEUR_B=1,
|
||||||
MOTEUR_C=2
|
MOTEUR_C=2
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
void Moteur_Init(void);
|
void Moteur_Init(void);
|
||||||
void Moteur_SetVitesse(enum t_moteur moteur, int16_t vitesse );
|
void Moteur_SetVitesse(enum t_moteur moteur, int16_t vitesse );
|
||||||
|
41
test.c
41
test.c
@ -1,4 +1,5 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include "pico/multicore.h"
|
||||||
#include "pico/stdlib.h"
|
#include "pico/stdlib.h"
|
||||||
#include "hardware/gpio.h"
|
#include "hardware/gpio.h"
|
||||||
#include "pico/binary_info.h"
|
#include "pico/binary_info.h"
|
||||||
@ -9,6 +10,7 @@
|
|||||||
#include "Servomoteur.h"
|
#include "Servomoteur.h"
|
||||||
#include "Moteurs.h"
|
#include "Moteurs.h"
|
||||||
#include "QEI.h"
|
#include "QEI.h"
|
||||||
|
#include "Asser_Moteurs.h"
|
||||||
|
|
||||||
const uint LED_PIN = 25;
|
const uint LED_PIN = 25;
|
||||||
const uint LED_PIN_ROUGE = 28;
|
const uint LED_PIN_ROUGE = 28;
|
||||||
@ -22,6 +24,7 @@ int mode_test();
|
|||||||
int test_moteurs();
|
int test_moteurs();
|
||||||
int test_QIE();
|
int test_QIE();
|
||||||
int test_vitesse_moteur(enum t_moteur moteur);
|
int test_vitesse_moteur(enum t_moteur moteur);
|
||||||
|
int test_asser_moteur();
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
bi_decl(bi_program_description("This is a test binary."));
|
bi_decl(bi_program_description("This is a test binary."));
|
||||||
@ -55,6 +58,7 @@ int main() {
|
|||||||
Temps_init();
|
Temps_init();
|
||||||
Moteur_Init();
|
Moteur_Init();
|
||||||
QEI_init();
|
QEI_init();
|
||||||
|
AsserMoteur_Init();
|
||||||
|
|
||||||
while(mode_test());
|
while(mode_test());
|
||||||
|
|
||||||
@ -125,6 +129,10 @@ int mode_test(){
|
|||||||
stdio_flush();
|
stdio_flush();
|
||||||
switch (rep)
|
switch (rep)
|
||||||
{
|
{
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
while(test_asser_moteur());
|
||||||
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
case 'c':
|
case 'c':
|
||||||
while(test_QIE());
|
while(test_QIE());
|
||||||
@ -149,12 +157,43 @@ int mode_test(){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_asser_moteur_printf(){
|
||||||
|
int _step_ms = 1;
|
||||||
|
while(1){
|
||||||
|
printf("Vitesse A : %.0f, vitesse B : %.0f, vitesse C : %.0f\n", AsserMoteur_getVitesse_mm_s(MOTEUR_A, _step_ms),
|
||||||
|
AsserMoteur_getVitesse_mm_s(MOTEUR_B, _step_ms), AsserMoteur_getVitesse_mm_s(MOTEUR_C, _step_ms));
|
||||||
|
//sleep_ms(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_asser_moteur(){
|
||||||
|
int lettre;
|
||||||
|
int _step_ms = 1;
|
||||||
|
printf("Asservissement des moteurs :\nAppuyez sur une touche pour quitter\n");
|
||||||
|
AsserMoteur_setConsigne_mm_s(MOTEUR_A, 500);
|
||||||
|
AsserMoteur_setConsigne_mm_s(MOTEUR_B, 500);
|
||||||
|
AsserMoteur_setConsigne_mm_s(MOTEUR_C, 500);
|
||||||
|
multicore_launch_core1(test_asser_moteur_printf);
|
||||||
|
do{
|
||||||
|
QEI_update();
|
||||||
|
AsserMoteur_Gestion(_step_ms);
|
||||||
|
sleep_ms(_step_ms);
|
||||||
|
//printf("Vitesse A : %d, codeur B : %d, codeur C : %d\n", QEI_get(QEI_A_NAME), QEI_get(QEI_B_NAME), QEI_get(QEI_C_NAME));
|
||||||
|
//printf("Vitesse A : %.0f, vitesse B : %.0f, vitesse C : %.0f\n", AsserMoteur_getVitesse_mm_s(MOTEUR_A, _step_ms),
|
||||||
|
// AsserMoteur_getVitesse_mm_s(MOTEUR_B, _step_ms), AsserMoteur_getVitesse_mm_s(MOTEUR_C, _step_ms));
|
||||||
|
lettre = getchar_timeout_us(0);
|
||||||
|
}while(lettre == PICO_ERROR_TIMEOUT);
|
||||||
|
multicore_reset_core1();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int test_QIE(){
|
int test_QIE(){
|
||||||
int lettre;
|
int lettre;
|
||||||
printf("Affichage des QEI :\nAppuyez sur une touche pour quitter\n");
|
printf("Affichage des QEI :\nAppuyez sur une touche pour quitter\n");
|
||||||
do{
|
do{
|
||||||
QEI_update();
|
QEI_update();
|
||||||
printf("Codeur a : %d, codeur B : %d, codeur C : %d\n", QEI_get(QEI_A_NAME), QEI_get(QEI_B_NAME), QEI_get(QEI_C_NAME));
|
printf("Codeur A : %d, codeur B : %d, codeur C : %d\n", QEI_get(QEI_A_NAME), QEI_get(QEI_B_NAME), QEI_get(QEI_C_NAME));
|
||||||
sleep_ms(100);
|
sleep_ms(100);
|
||||||
|
|
||||||
lettre = getchar_timeout_us(0);
|
lettre = getchar_timeout_us(0);
|
||||||
|
Loading…
Reference in New Issue
Block a user