PROJET SOURCE
Le répertoire MCC_PYSIM contient :
Pysimcoder permet donc dans un premier temps de réaliser un système sous forme de schémas blocs, de le tester ( tracé de courbes en simulation ), puis de générer un fichier correspondant à ces blocs afin de programmer une cible STM32.
$ bash pysim-run.sh
Nous retrouvons les éléments de notre système :
Faire Simulation –> Simulate :; puis double cliquer sur Plot :
Nous avons l’évolution de la vitesse en fonction du temps pour une consigne donnée.
Ouvrir maintenant mcc_target.dgm :
On retrouve une partie du schéma de simulation ; le scope et le modèle du moteur ont été retirés.
Les blocs jaunes ( pulse, speed, duty1 ) correspondent à des variables de notre programme microcontrôleur qui seront mis à jour avec les périphériques.
Les blocs bleus correspondent à des fonctions, qui seront appelées depuis le fichier généré par pysimCoder.
Faire Simulation –> Generate Code
Il se crée alors un répertoire mcc_target_gen, dans lequel se trouve mcc_target.c
Ouvrons maintenant le workspace WORKSPACE_F411_MCC_CUBEIDE se trouvant dans MCC_PYSIM, avec le logiciel STM32CUBEIDE.
La tache fast_task met à jour les variables correspondant aux blocs jaunes, PYSIM_ISR(MODEL_NAME,ISR) permet d’appeler une fonction de PYSIMCODER/mcc_target_gen/mcc_target.c.
Si vous observez le makefile du projet, vous constaterez le chemin vers ce fichier, ainsi qu’à la bibliothèque des blocs pysimcoder.
REMARQUE : PysimCoder impose l’utilisation du type double.
extern double potentiometre_pysim;
extern double speed_pysim;
extern double duty1_pysim;
extern double pulse_pysim;
static void fast_task(void *pvParameters)
{
for (;;)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 1);
adc1_Get(&potentiometre);
// MISE A JOUR INPUTS
potentiometre_pysim=(double)potentiometre;
pulse_pysim = (double)pulse;
speed = quadEncoder_GetSpeedL();
speed_pysim = (double)speed;
PYSIM_ISR(MODEL_NAME,ISR); // FONCTION PYSIMCODER
// MISE A JOUR OUTPUTS
motor_SetDuty(100+(int)(duty1_pysim));
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, 0);
xSemaphoreGive( xSemaphore_Slow);
xSemaphoreTake( xSemaphore_Fast, portMAX_DELAY );
}
}
Il suffit alors de compiler et de lancer la session de Debug. Le tracé avec RTScope.py redonne :