mirror of
https://github.com/modelec/MarcelMoteurSTM32.git
synced 2026-01-18 16:47:23 +01:00
feat: add functions to turn right and left
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1663823120161288977" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-539313789031368032" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||
</provider>
|
||||
@@ -16,7 +16,7 @@
|
||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1663823120161288977" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-539313789031368032" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"" prefer-non-shared="true">
|
||||
<language-scope id="org.eclipse.cdt.core.gcc"/>
|
||||
<language-scope id="org.eclipse.cdt.core.g++"/>
|
||||
</provider>
|
||||
|
||||
@@ -10,15 +10,23 @@ private:
|
||||
uint16_t targetSpeed;
|
||||
bool isAccelerating;
|
||||
bool isReversing;
|
||||
bool isTurningRightForward = false;
|
||||
bool isTurningLeftForward = false;
|
||||
bool isTurningRightBackward = false;
|
||||
bool isTurningLeftBackward = false;
|
||||
|
||||
public:
|
||||
Motor(TIM_TypeDef *timer);
|
||||
void accelerer(int speed);
|
||||
void reculer(int speed);
|
||||
void ralentir();
|
||||
void ralentirEnvers();
|
||||
void stop();
|
||||
void tournerDroiteAvancer(int speed);
|
||||
void tournerGaucheAvancer(int speed);
|
||||
void tournerDroiteReculer(int speed);
|
||||
void tournerGaucheReculer(int speed);
|
||||
void stopTurning();
|
||||
void update();
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -4,35 +4,63 @@
|
||||
#include "functions.h"
|
||||
#include "motors.h"
|
||||
|
||||
|
||||
uint32_t lastTick = 0; // Variable pour mémoriser l'heure de la dernière action
|
||||
uint32_t delayTime = 0; // Variable pour définir le délai de la prochaine action
|
||||
|
||||
//Demo
|
||||
uint32_t lastTickDemo = 0;
|
||||
unsigned int demoStep = 0;
|
||||
|
||||
// Fonction pour vérifier si le délai est passé (permet de ne pas bloquer l'exécution)
|
||||
bool isDelayPassed(uint32_t delay) {
|
||||
if (HAL_GetTick() - lastTick >= delay) {
|
||||
lastTick = HAL_GetTick(); // Met à jour lastTick
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
bool isDelayPassed(uint32_t delay, uint32_t *lastTick) {
|
||||
if (HAL_GetTick() - *lastTick >= delay) {
|
||||
*lastTick = HAL_GetTick(); // Met à jour lastTick
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void Cpploop(Motor *motor) {
|
||||
|
||||
void Cpploop(Motor *motor){
|
||||
|
||||
GPIOC->ODR ^= (1<<10);
|
||||
|
||||
GPIOC->ODR ^= (1 << 10);
|
||||
|
||||
//On actualise toute les 10ms et on effectue tous les controles périodiques
|
||||
if(isDelayPassed(10)) {
|
||||
if (isDelayPassed(10, &lastTick)) {
|
||||
|
||||
//Demo
|
||||
if (isDelayPassed(2000, &lastTickDemo)) {
|
||||
|
||||
switch (demoStep) {
|
||||
case 0:
|
||||
motor->accelerer(300);
|
||||
break;
|
||||
case 1:
|
||||
motor->tournerGaucheAvancer(600);
|
||||
break;
|
||||
case 2:
|
||||
motor->tournerDroiteAvancer(600);
|
||||
break;
|
||||
case 3:
|
||||
motor->reculer(50);
|
||||
break;
|
||||
case 4:
|
||||
motor->tournerGaucheReculer(100);
|
||||
break;
|
||||
case 5:
|
||||
motor->tournerDroiteReculer(100);
|
||||
break;
|
||||
default:
|
||||
motor->stop();
|
||||
break;
|
||||
}
|
||||
demoStep++;
|
||||
|
||||
}
|
||||
|
||||
//On met à jour le statut des moteurs
|
||||
motor->update();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif /* SRC_FUNCTIONS_C_ */
|
||||
|
||||
@@ -102,8 +102,7 @@ int main(void) {
|
||||
Motor motor(TIM3);
|
||||
|
||||
//On fait accélérer les moteurs
|
||||
motor.accelerer(626);
|
||||
|
||||
motor.accelerer(300);
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Motor::Motor(TIM_TypeDef *timer) :
|
||||
tim(timer), currentSpeed(0), targetSpeed(0), isAccelerating(false), isReversing(
|
||||
false) {
|
||||
false), isTurningLeftBackward(false), isTurningLeftForward(false), isTurningRightBackward(false), isTurningRightForward(false) {
|
||||
}
|
||||
|
||||
void Motor::accelerer(int speed) {
|
||||
@@ -17,51 +17,101 @@ void Motor::reculer(int speed) {
|
||||
isAccelerating = false;
|
||||
}
|
||||
|
||||
void Motor::ralentir() {
|
||||
targetSpeed = 0;
|
||||
isAccelerating = true;
|
||||
isReversing = false;
|
||||
}
|
||||
|
||||
void Motor::ralentirEnvers() {
|
||||
targetSpeed = 0;
|
||||
isReversing = true;
|
||||
isAccelerating = false;
|
||||
}
|
||||
|
||||
void Motor::stop() {
|
||||
currentSpeed = 0;
|
||||
targetSpeed = 0;
|
||||
isAccelerating = false;
|
||||
isReversing = false;
|
||||
this->stopTurning();
|
||||
}
|
||||
|
||||
void Motor::tournerDroiteAvancer(int speed) {
|
||||
targetSpeed = speed;
|
||||
isTurningRightForward = true;
|
||||
isTurningLeftForward = false;
|
||||
isTurningRightBackward = false;
|
||||
isTurningLeftBackward = false;
|
||||
isAccelerating = true;
|
||||
}
|
||||
|
||||
void Motor::tournerGaucheAvancer(int speed) {
|
||||
targetSpeed = speed;
|
||||
isTurningLeftForward = true;
|
||||
isTurningRightForward = false;
|
||||
isTurningRightBackward = false;
|
||||
isTurningLeftBackward = false;
|
||||
isAccelerating = true;
|
||||
}
|
||||
|
||||
void Motor::tournerDroiteReculer(int speed) {
|
||||
targetSpeed = speed;
|
||||
isTurningRightBackward = true;
|
||||
isTurningLeftBackward = false;
|
||||
isTurningRightForward = false;
|
||||
isTurningLeftForward = false;
|
||||
isReversing = true;
|
||||
}
|
||||
|
||||
void Motor::tournerGaucheReculer(int speed) {
|
||||
targetSpeed = speed;
|
||||
isTurningLeftBackward = true;
|
||||
isTurningRightBackward = false;
|
||||
isTurningRightForward = false;
|
||||
isTurningLeftForward = false;
|
||||
isReversing = true;
|
||||
}
|
||||
|
||||
void Motor::stopTurning() {
|
||||
isTurningLeftForward = false;
|
||||
isTurningLeftBackward = false;
|
||||
isTurningRightBackward = false;
|
||||
isTurningRightForward = false;
|
||||
}
|
||||
|
||||
void Motor::update() {
|
||||
// Gestion de l'accélération/décélération
|
||||
if (isAccelerating && currentSpeed < targetSpeed) {
|
||||
currentSpeed++;
|
||||
} else if (isReversing && currentSpeed > -targetSpeed) {
|
||||
currentSpeed--;
|
||||
} else if (!isAccelerating && !isReversing && currentSpeed > targetSpeed) {
|
||||
currentSpeed--;
|
||||
}
|
||||
// Gestion de l'accélération/décélération
|
||||
if (isAccelerating && currentSpeed < targetSpeed) {
|
||||
currentSpeed++;
|
||||
} else if (isReversing && currentSpeed > -targetSpeed) {
|
||||
currentSpeed--;
|
||||
} else if (!isAccelerating && !isReversing && currentSpeed > targetSpeed) {
|
||||
currentSpeed--;
|
||||
}
|
||||
|
||||
// Mise à jour des registres du timer
|
||||
if (isAccelerating) {
|
||||
//2 et 3 avance
|
||||
tim->CCR2 = currentSpeed;
|
||||
tim->CCR3 = currentSpeed;
|
||||
// Mise à jour des registres du timer pour contrôler les moteurs
|
||||
if (isTurningRightForward) {
|
||||
// Turn right while moving forward: Left motor full speed, Right motor slower
|
||||
tim->CCR2 = currentSpeed; // Left forward
|
||||
tim->CCR3 = currentSpeed / 2; // Right forward (slower)
|
||||
}
|
||||
else if (isTurningLeftForward) {
|
||||
// Turn left while moving forward: Right motor full speed, Left motor slower
|
||||
tim->CCR2 = currentSpeed / 2; // Left forward (slower)
|
||||
tim->CCR3 = currentSpeed; // Right forward
|
||||
}
|
||||
else if (isTurningRightBackward) {
|
||||
// Turn right while reversing: Left motor full speed, Right motor slower
|
||||
tim->CCR1 = currentSpeed; // Left backward
|
||||
tim->CCR4 = currentSpeed / 2; // Right backward (slower)
|
||||
}
|
||||
else if (isTurningLeftBackward) {
|
||||
// Turn left while reversing: Right motor full speed, Left motor slower
|
||||
tim->CCR1 = currentSpeed / 2; // Left backward (slower)
|
||||
tim->CCR4 = currentSpeed; // Right backward
|
||||
}
|
||||
else {
|
||||
// Normal forward/backward movement
|
||||
if (isAccelerating) {
|
||||
tim->CCR2 = currentSpeed;
|
||||
tim->CCR3 = currentSpeed;
|
||||
} else if (isReversing) {
|
||||
tim->CCR1 = currentSpeed;
|
||||
tim->CCR4 = currentSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
} else if (isReversing) {
|
||||
// 1 et 4 recule
|
||||
tim->CCR1 = currentSpeed;
|
||||
tim->CCR4 = currentSpeed;
|
||||
|
||||
}
|
||||
|
||||
// Arrêt si vitesse cible atteinte
|
||||
if (currentSpeed == targetSpeed) {
|
||||
isAccelerating = false;
|
||||
isReversing = false;
|
||||
}
|
||||
// Arrêt si vitesse cible atteinte
|
||||
if (currentSpeed == targetSpeed) {
|
||||
isAccelerating = false;
|
||||
isReversing = false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user