Skip to content

Commit

Permalink
Commit de Noël
Browse files Browse the repository at this point in the history
Ajout d'une loi de commande en position des roues avant
Modif globales:
- TrameCAN traitée par la Nucleo = [cmdARG cmdARD cmdAV cmdPOS 0 0 0 0]
- Fix envoi msg Nucleo sur CAN
  • Loading branch information
vinchatl committed Dec 23, 2018
1 parent 3d68199 commit 3ce973d
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 34 deletions.
2 changes: 1 addition & 1 deletion nucleo/Inc/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@

/* USER CODE BEGIN Private defines */
#define PERIOD_UPDATE_CMD 20 // Period in ms to update motor commands
#define PERIOD_SEND_MES 20000 // Period to send data -> 100 = 1ms
#define PERIOD_SEND_MES 100 // Period in ms to send data
/* USER CODE END Private defines */

#ifdef __cplusplus
Expand Down
12 changes: 11 additions & 1 deletion nucleo/Inc/steering.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@
#include "stm32f1xx_hal_gpio.h"


/**
* Set the max and min value of the steering wheels sensor
**/
void steering_Init(void);

/**
* Set the speed of the steering motor. Speed value has to be between 0 and 100
**/
Expand All @@ -13,6 +18,11 @@ void steering_set_speed(GPIO_PinState en_steering, int speed);
/**
* Return the steering angle.
**/
int get_steering_angle(void);
int steering_get_angle(void);

/**
* Command the front wheel position
**/
void steering_set_position (GPIO_PinState en_steering, int msg_CAN);

#endif
8 changes: 4 additions & 4 deletions nucleo/Src/can.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,8 @@

/* USER CODE BEGIN 0 */


extern int cmdLRM, cmdRRM, cmdSFM ;
extern int en_MARG, en_MARD, en_MAV;
extern int cmdLRM, cmdRRM, cmdSFM, cmdPOS;
extern int en_MARG, en_MARD, en_MAV, en_POS;
/* USER CODE END 0 */

CAN_HandleTypeDef hcan;
Expand Down Expand Up @@ -215,8 +214,9 @@ void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
cmdLRM = read_cmd(hcan->pRxMsg->Data[0], &en_MARG);
cmdRRM = read_cmd(hcan->pRxMsg->Data[1], &en_MARD);
cmdSFM = read_cmd(hcan->pRxMsg->Data[2], &en_MAV);
cmdPOS = read_cmd(hcan->pRxMsg->Data[3], &en_POS);
}

__HAL_CAN_ENABLE_IT(hcan, CAN_IT_FMP0);
}
/* USER CODE END 1 */
Expand Down
27 changes: 18 additions & 9 deletions nucleo/Src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,21 +68,20 @@ int SEND_CAN = 0;
*/
uint32_t ADCBUF[5];

int cmdLRM = 50, cmdRRM = 50, cmdSFM = 50; // 0 à 100 Moteur gauche, droit, avant
int cmdLRM = 50, cmdRRM = 50, cmdSFM = 50, cmdPOS = 50; // 0 à 100 Moteur gauche, droit, avant, angle avant

uint32_t VMG_mes = 0, VMD_mes = 0, per_vitesseG = 0, per_vitesseD = 0;
//int volatile i=0;
/* Enable Moteurs */

/* Enable Moteurs */
/* GPIO_PIN_SET : activation */
/* GPIO_PIN_RESET : pont ouvert */
GPIO_PinState en_MARG = GPIO_PIN_RESET;
GPIO_PinState en_MARD = GPIO_PIN_RESET;
GPIO_PinState en_MAV = GPIO_PIN_RESET;
GPIO_PinState en_MAV = GPIO_PIN_RESET;
GPIO_PinState en_POS = GPIO_PIN_RESET;
/*********************************Informations rotation volant********************************/
/* mesure angulaire potentiometre amplitudes volant +/- 17 % environ autour du centre */
/* PWM = 0.5 (50) % arret, PWM = 0.4 tourne gauche, PWM = 0.6 tourne droite */
/*butees potar volant : */
#define gauche_volant 2395
#define centre_volant 2056
#define droite_volant 1825
/* PWM = 0.5 (50) % arret, PWM = 0.4 tourne gauche, PWM = 0.6 tourne droite */

CanTxMsgTypeDef TxMessage;
CanRxMsgTypeDef RxMessage;
Expand Down Expand Up @@ -214,6 +213,9 @@ int main(void)
/* Infinite loop */
/* USER CODE BEGIN WHILE */

/* Initialisation Steering */
steering_Init();

while (1)
{
/* USER CODE END WHILE */
Expand All @@ -225,7 +227,14 @@ int main(void)
UPDATE_CMD_FLAG = 0;

wheels_set_speed(en_MARD, en_MARG, cmdRRM, cmdLRM);

// Assure la non-contradiction des commandes moteurs
if ((en_MAV == GPIO_PIN_SET) && (en_POS == GPIO_PIN_SET))
{
en_POS = GPIO_PIN_RESET;
}
steering_set_speed(en_MAV, cmdSFM);
steering_set_position(en_POS, cmdPOS);
}

/* CAN */
Expand Down
100 changes: 81 additions & 19 deletions nucleo/Src/steering.c
Original file line number Diff line number Diff line change
@@ -1,31 +1,93 @@

/* Includes ------------------------------------------------------------------*/

#include "steering.h"
#include "stdlib.h"
#include "math.h"


/* Private define ------------------------------------------------------------*/

#define LEFT_MAX_SPEED_STEERING 65 // Left steering max speed
#define RIGHT_MAX_SPEED_STEERING 35 // Right steering max speed
#define LEFT_MED_SPEED_STEERING 58 // Left steering medium speed
#define RIGHT_MED_SPEED_STEERING 42 // Right steering medium speed
#define NO_STEERING 50

#define centre_volant (gauche_volant + droite_volant)/2 // valeur initiale = 2110

#define MAX_SPEED_STEERING 60
#define MIN_SPEED_STEERING 40
#define LEFT_CMD_STEERING 60 // Left steering command
#define RIGHT_CMD_STEERING 40 // Right steering command
#define CENTER_CMD_STEERING (LEFT_CMD_STEERING + RIGHT_CMD_STEERING)/2

#define SPEED_STEP_1 30
#define SPEED_STEP_2 150


/* Private variables ---------------------------------------------------------*/

extern uint32_t ADCBUF[5];
int droite_volant, gauche_volant;


/* Programs ------------------------------------------------------------------*/

void steering_Init (void){
steering_set_speed(GPIO_PIN_SET, RIGHT_MAX_SPEED_STEERING);
HAL_Delay(2000);
droite_volant = steering_get_angle();

steering_set_speed(GPIO_PIN_SET, LEFT_MAX_SPEED_STEERING);
HAL_Delay(2000);
gauche_volant = steering_get_angle();

steering_set_position(GPIO_PIN_SET, centre_volant);
}

void steering_set_speed(GPIO_PinState en_steering, int speed){

/* Threshold */
/* The speed */
if (speed < MIN_SPEED_STEERING){
speed = MIN_SPEED_STEERING;
} else if (speed > MAX_SPEED_STEERING){
speed = MAX_SPEED_STEERING;
}

speed = 3200 * ( speed/ 100.0 );

TIM1->CCR3 = speed;

/* Enable moteurs */
/* GPIO_PIN_SET : activation */
/* GPIO_PIN_RESET : pont ouvert */
HAL_GPIO_WritePin( GPIOC, GPIO_PIN_12, en_steering); //PC12 AV
/* Threshold rotating speed of steering wheels*/
if (speed < RIGHT_MAX_SPEED_STEERING){
speed = RIGHT_MAX_SPEED_STEERING;
} else if (speed > LEFT_MAX_SPEED_STEERING){
speed = LEFT_MAX_SPEED_STEERING;
}

speed = 3200 * ( speed/ 100.0 );
TIM1->CCR3 = speed;

HAL_GPIO_WritePin( GPIOC, GPIO_PIN_12, en_steering); //PC12 AV
}

int get_steering_angle(void){
int steering_get_angle(void){
return ADCBUF[1];
}

void steering_set_position (GPIO_PinState en_steering, int msg_CAN){

int cpt_pos = steering_get_angle();
int cpt_centre, msg_corr, angle_diff;

// Correction messages
if (msg_CAN > 100){msg_CAN = 100;} // limit the CAN msg to [0,100]
msg_corr = 6*(msg_CAN - CENTER_CMD_STEERING);
cpt_centre = cpt_pos - centre_volant;
angle_diff = msg_corr - cpt_centre;

// Discrete command - steady/turning slow/turning
if (((abs(cpt_pos - gauche_volant) <SPEED_STEP_1) && (msg_corr > cpt_pos)) | ((abs(cpt_pos - droite_volant) <SPEED_STEP_1)) && (msg_corr > cpt_pos))
{
steering_set_speed(GPIO_PIN_RESET, NO_STEERING);
}
else
{
if (abs(angle_diff)<SPEED_STEP_1){steering_set_speed(GPIO_PIN_RESET, NO_STEERING);} // steering wheels close to objective
else if (abs(angle_diff)<SPEED_STEP_2) // steering wheels approaching objective
{
if (angle_diff > 0){steering_set_speed(en_steering, LEFT_MED_SPEED_STEERING);}
else {steering_set_speed(en_steering, RIGHT_MED_SPEED_STEERING);}
}
else if (angle_diff > 0){steering_set_speed(en_steering, LEFT_MAX_SPEED_STEERING);} // steering wheels far to the left
else {steering_set_speed(en_steering, RIGHT_MAX_SPEED_STEERING);} // steering wheels far to the right
}
}

0 comments on commit 3ce973d

Please sign in to comment.