mirror of
https://github.com/modelec/MarcelMoteurSTM32.git
synced 2026-01-18 16:47:23 +01:00
code prêt à être transféré sur nouvelle carte
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
/* Private includes ----------------------------------------------------------*/
|
/* Private includes ----------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
|
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
@@ -33,9 +34,9 @@
|
|||||||
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
/* Private define ------------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN PD */
|
/* USER CODE BEGIN PD */
|
||||||
void ModelecOdometrySetup();
|
void ModelecOdometrySetup(void **out_pid, void **out_pidG, void **out_pidD);
|
||||||
|
|
||||||
void ModelecOdometryLoop();
|
void ModelecOdometryLoop(void* pid, void* pidG, void* pidD);
|
||||||
|
|
||||||
/* USER CODE END PD */
|
/* USER CODE END PD */
|
||||||
|
|
||||||
@@ -103,15 +104,19 @@ int main(void)
|
|||||||
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
|
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
|
||||||
HAL_TIM_Encoder_Start(&htim21, TIM_CHANNEL_ALL);
|
HAL_TIM_Encoder_Start(&htim21, TIM_CHANNEL_ALL);
|
||||||
//HAL_TIM_Encoder_Start_IT(&htim2, TIM_CHANNEL_ALL);
|
//HAL_TIM_Encoder_Start_IT(&htim2, TIM_CHANNEL_ALL);
|
||||||
ModelecOdometrySetup();
|
void *pid;
|
||||||
|
void *pidG;
|
||||||
|
void *pidD;
|
||||||
|
ModelecOdometrySetup(&pid, &pidG, &pidD);
|
||||||
|
|
||||||
/* USER CODE END 2 */
|
/* USER CODE END 2 */
|
||||||
|
|
||||||
/* Infinite loop */
|
/* Infinite loop */
|
||||||
/* USER CODE BEGIN WHILE */
|
/* USER CODE BEGIN WHILE */
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
ModelecOdometryLoop();
|
ModelecOdometryLoop(pid, pidG, pidD);
|
||||||
|
|
||||||
}
|
}
|
||||||
/* USER CODE END WHILE */
|
/* USER CODE END WHILE */
|
||||||
|
|||||||
@@ -45,17 +45,21 @@ bool isDelayPassed(uint32_t delay) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//PID
|
//PID
|
||||||
void determinationCoefPosition(Point objectifPoint, Point pointActuel){
|
void determinationCoefPosition(Point objectifPoint, Point pointActuel, PidPosition pid, PidVitesse pidG, PidVitesse pidD){
|
||||||
PidPosition pid(0,0,0,0,0,0,objectifPoint);
|
//PidPosition pid(0,0,0,0,0,0,objectifPoint);
|
||||||
|
|
||||||
|
|
||||||
|
pid.setConsignePositionFinale(objectifPoint);
|
||||||
std::array<double, 2> vitesse = pid.updateNouvelOrdreVitesse(pointActuel);
|
std::array<double, 2> vitesse = pid.updateNouvelOrdreVitesse(pointActuel);
|
||||||
PidVitesse pidG(0, 0, 0, vitesse[0]);
|
//PidVitesse pidG(0, 0, 0, vitesse[0]);
|
||||||
PidVitesse pidD(0, 0, 0, vitesse[1]);
|
//PidVitesse pidD(0, 0, 0, vitesse[1]);
|
||||||
|
pidG.setConsigneVitesseFinale(vitesse[0]);
|
||||||
|
pidD.setConsigneVitesseFinale(vitesse[1]);
|
||||||
|
|
||||||
pidG.updateNouvelleVitesse(motor.getLeftCurrentSpeed());
|
pidG.updateNouvelleVitesse(motor.getLeftCurrentSpeed());
|
||||||
pidD.updateNouvelleVitesse(motor.getRightCurrentSpeed());
|
pidD.updateNouvelleVitesse(motor.getRightCurrentSpeed());
|
||||||
|
|
||||||
|
|
||||||
float nouvelOrdreG = pidG.getNouvelleConsigneVitesse();
|
float nouvelOrdreG = pidG.getNouvelleConsigneVitesse();
|
||||||
float nouvelOrdreD = pidD.getNouvelleConsigneVitesse();
|
float nouvelOrdreD = pidD.getNouvelleConsigneVitesse();
|
||||||
|
|
||||||
@@ -70,7 +74,7 @@ void determinationCoefPosition(Point objectifPoint, Point pointActuel){
|
|||||||
}
|
}
|
||||||
//Odométrie
|
//Odométrie
|
||||||
|
|
||||||
void ModelecOdometrySetup() {
|
void ModelecOdometrySetup(void **out_pid, void **out_pidG, void **out_pidD) {
|
||||||
HAL_UART_Transmit(&huart2, (uint8_t*) "SETUP COMPLETE\n", 15,
|
HAL_UART_Transmit(&huart2, (uint8_t*) "SETUP COMPLETE\n", 15,
|
||||||
HAL_MAX_DELAY);
|
HAL_MAX_DELAY);
|
||||||
lastPosRight = __HAL_TIM_GET_COUNTER(&htim2);
|
lastPosRight = __HAL_TIM_GET_COUNTER(&htim2);
|
||||||
@@ -78,7 +82,14 @@ void ModelecOdometrySetup() {
|
|||||||
x = 0.0f;
|
x = 0.0f;
|
||||||
y = 0.0f;
|
y = 0.0f;
|
||||||
theta = 0.0f;
|
theta = 0.0f;
|
||||||
motor.accelerer(300);
|
//motor.accelerer(300);
|
||||||
|
|
||||||
|
*out_pid = new PidPosition(0,0,0,0,0,0,Point());
|
||||||
|
*out_pidG = new PidVitesse(0, 0, 0, 0);
|
||||||
|
*out_pidD = new PidVitesse(0, 0, 0, 0);
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelecOdometryUpdate() {
|
void ModelecOdometryUpdate() {
|
||||||
@@ -126,8 +137,12 @@ void receiveControlParams(){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelecOdometryLoop() {
|
void ModelecOdometryLoop(void* pid, void* pidG, void* pidD) {
|
||||||
receiveControlParams();
|
PidPosition* pidPosition = static_cast<PidPosition*>(pid);
|
||||||
|
PidVitesse* pidVitesseG = static_cast<PidVitesse*>(pidG);
|
||||||
|
PidVitesse* pidVitesseD = static_cast<PidVitesse*>(pidD);
|
||||||
|
|
||||||
|
//receiveControlParams();
|
||||||
GPIOC->ODR ^= (1 << 10);
|
GPIOC->ODR ^= (1 << 10);
|
||||||
|
|
||||||
//On met à jour toutes les 10ms
|
//On met à jour toutes les 10ms
|
||||||
@@ -135,10 +150,7 @@ void ModelecOdometryLoop() {
|
|||||||
ModelecOdometryUpdate();
|
ModelecOdometryUpdate();
|
||||||
Point currentPoint(x, y,theta, StatePoint::INTERMEDIAIRE);
|
Point currentPoint(x, y,theta, StatePoint::INTERMEDIAIRE);
|
||||||
Point targetPoint(0.20, 0.20,0, StatePoint::FINAL);
|
Point targetPoint(0.20, 0.20,0, StatePoint::FINAL);
|
||||||
determinationCoefPosition(currentPoint,targetPoint);
|
determinationCoefPosition(currentPoint,targetPoint, *pidPosition, *pidVitesseG, *pidVitesseD);
|
||||||
|
|
||||||
sprintf(msg, "X: %.3f m, Y: %.3f m, Theta: %.3f rad\r\n", x, y, theta);
|
|
||||||
HAL_UART_Transmit(&huart2, (uint8_t*) msg, strlen(msg), HAL_MAX_DELAY);
|
|
||||||
|
|
||||||
motor.update();
|
motor.update();
|
||||||
|
|
||||||
@@ -147,4 +159,4 @@ void ModelecOdometryLoop() {
|
|||||||
publishStatus();
|
publishStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} //extern C end
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "pid.h"
|
#include "pid.h"
|
||||||
|
#include "stm32l0xx_hal.h" // <--- D'abord
|
||||||
|
#include "stm32l0xx_hal_uart.h" // optionnel, déjà dans le précédent
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
extern UART_HandleTypeDef huart2;
|
||||||
|
|
||||||
// Constructeur
|
// Constructeur
|
||||||
Pid::Pid(float kp, float ki, float kd){
|
Pid::Pid(float kp, float ki, float kd){
|
||||||
@@ -62,10 +66,15 @@ int Pid::getPWMCommand(float vitesse){
|
|||||||
if (pwm < PWM_MIN){
|
if (pwm < PWM_MIN){
|
||||||
pwm = 0;
|
pwm = 0;
|
||||||
}
|
}
|
||||||
|
int32_t pwm_signed = (vitesse >= 0) ? std::floor(pwm) : -std::floor(pwm);
|
||||||
|
|
||||||
|
char msg[64];
|
||||||
|
// Debug UART ici
|
||||||
|
sprintf(msg, "Vitesse: %.3f m/s, PWM: %d\r\n", vitesse, pwm_signed);
|
||||||
|
HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 10); // timeout court
|
||||||
|
|
||||||
// Renvoi avec le bon signe
|
// Renvoi avec le bon signe
|
||||||
return (vitesse >= 0) ? std::floor(pwm) : -std::floor(pwm);
|
return pwm_signed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -137,6 +137,9 @@ std::array<double, 2> PidPosition::updateNouvelOrdreVitesse(Point pointActuel) {
|
|||||||
if (vitesseLineaire > this->Vmax){
|
if (vitesseLineaire > this->Vmax){
|
||||||
vitesseLineaire = this->Vmax;
|
vitesseLineaire = this->Vmax;
|
||||||
}
|
}
|
||||||
|
if (vitesseLineaire < -this->Vmax){
|
||||||
|
vitesseLineaire = -this->Vmax;
|
||||||
|
}
|
||||||
if (vitesseAngulaire > this->Wmax){
|
if (vitesseAngulaire > this->Wmax){
|
||||||
vitesseAngulaire = this->Wmax;
|
vitesseAngulaire = this->Wmax;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user