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 ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@@ -33,9 +34,9 @@
|
||||
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
/* 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 */
|
||||
|
||||
@@ -103,15 +104,19 @@ int main(void)
|
||||
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
|
||||
HAL_TIM_Encoder_Start(&htim21, 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 */
|
||||
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
|
||||
while (1)
|
||||
{
|
||||
ModelecOdometryLoop();
|
||||
ModelecOdometryLoop(pid, pidG, pidD);
|
||||
|
||||
}
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
@@ -45,17 +45,21 @@ bool isDelayPassed(uint32_t delay) {
|
||||
}
|
||||
|
||||
//PID
|
||||
void determinationCoefPosition(Point objectifPoint, Point pointActuel){
|
||||
PidPosition pid(0,0,0,0,0,0,objectifPoint);
|
||||
void determinationCoefPosition(Point objectifPoint, Point pointActuel, PidPosition pid, PidVitesse pidG, PidVitesse pidD){
|
||||
//PidPosition pid(0,0,0,0,0,0,objectifPoint);
|
||||
|
||||
|
||||
pid.setConsignePositionFinale(objectifPoint);
|
||||
std::array<double, 2> vitesse = pid.updateNouvelOrdreVitesse(pointActuel);
|
||||
PidVitesse pidG(0, 0, 0, vitesse[0]);
|
||||
PidVitesse pidD(0, 0, 0, vitesse[1]);
|
||||
//PidVitesse pidG(0, 0, 0, vitesse[0]);
|
||||
//PidVitesse pidD(0, 0, 0, vitesse[1]);
|
||||
pidG.setConsigneVitesseFinale(vitesse[0]);
|
||||
pidD.setConsigneVitesseFinale(vitesse[1]);
|
||||
|
||||
pidG.updateNouvelleVitesse(motor.getLeftCurrentSpeed());
|
||||
pidD.updateNouvelleVitesse(motor.getRightCurrentSpeed());
|
||||
|
||||
|
||||
float nouvelOrdreG = pidG.getNouvelleConsigneVitesse();
|
||||
float nouvelOrdreD = pidD.getNouvelleConsigneVitesse();
|
||||
|
||||
@@ -70,7 +74,7 @@ void determinationCoefPosition(Point objectifPoint, Point pointActuel){
|
||||
}
|
||||
//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_MAX_DELAY);
|
||||
lastPosRight = __HAL_TIM_GET_COUNTER(&htim2);
|
||||
@@ -78,7 +82,14 @@ void ModelecOdometrySetup() {
|
||||
x = 0.0f;
|
||||
y = 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() {
|
||||
@@ -126,8 +137,12 @@ void receiveControlParams(){
|
||||
|
||||
}
|
||||
|
||||
void ModelecOdometryLoop() {
|
||||
receiveControlParams();
|
||||
void ModelecOdometryLoop(void* pid, void* pidG, void* pidD) {
|
||||
PidPosition* pidPosition = static_cast<PidPosition*>(pid);
|
||||
PidVitesse* pidVitesseG = static_cast<PidVitesse*>(pidG);
|
||||
PidVitesse* pidVitesseD = static_cast<PidVitesse*>(pidD);
|
||||
|
||||
//receiveControlParams();
|
||||
GPIOC->ODR ^= (1 << 10);
|
||||
|
||||
//On met à jour toutes les 10ms
|
||||
@@ -135,10 +150,7 @@ void ModelecOdometryLoop() {
|
||||
ModelecOdometryUpdate();
|
||||
Point currentPoint(x, y,theta, StatePoint::INTERMEDIAIRE);
|
||||
Point targetPoint(0.20, 0.20,0, StatePoint::FINAL);
|
||||
determinationCoefPosition(currentPoint,targetPoint);
|
||||
|
||||
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);
|
||||
determinationCoefPosition(currentPoint,targetPoint, *pidPosition, *pidVitesseG, *pidVitesseD);
|
||||
|
||||
motor.update();
|
||||
|
||||
@@ -147,4 +159,4 @@ void ModelecOdometryLoop() {
|
||||
publishStatus();
|
||||
}
|
||||
|
||||
}
|
||||
} //extern C end
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
|
||||
|
||||
#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
|
||||
Pid::Pid(float kp, float ki, float kd){
|
||||
@@ -62,10 +66,15 @@ int Pid::getPWMCommand(float vitesse){
|
||||
if (pwm < PWM_MIN){
|
||||
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
|
||||
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){
|
||||
vitesseLineaire = this->Vmax;
|
||||
}
|
||||
if (vitesseLineaire < -this->Vmax){
|
||||
vitesseLineaire = -this->Vmax;
|
||||
}
|
||||
if (vitesseAngulaire > this->Wmax){
|
||||
vitesseAngulaire = this->Wmax;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user