dumber/incubateur/dumby_rtos2/dumby2/Src/Motor.c
Sébastien DI MERCURIO 776a2f4ce6 initial commit
2018-08-27 16:39:49 +02:00

182 lines
5.4 KiB
C

#include "Motor.h"
#include "tim.h"
#include "common.h"
/*Set Motors Values and regulate them*/
/*Global variables*/
uint32_t coderValue = 0;
/*Local Prototype function*/
void SET_STATEMOTORR(uint8_t state);
void SET_STATEMOTORL(uint8_t state);
uint16_t tempsRoueD;
uint16_t tempsRoueG;
uint16_t distanceR;
uint16_t distanceL;
float speedR;
float speedL;
/*Local variable*/
uint16_t speedSensorR[2];
uint16_t speedSensorL[2];
/*Function*/
void SpeedSensor_Right_Callback(DMA_HandleTypeDef * _hdma);
void SpeedSensor_Left_Callback(DMA_HandleTypeDef * _hdma);
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/*Init Function*/
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
void ENCODER_INIT(void){
HAL_TIM_Base_Start_IT(&htim1);
//HAL_DMA_RegisterCallback(&hdma_tim1_ch1,0x00, SpeedSensor_Right_Callback);
//HAL_DMA_RegisterCallback(&hdma_tim1_ch3,0x00, SpeedSensor_Left_Callback);
HAL_TIM_IC_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)speedSensorR,2);
htim1.State = HAL_TIM_STATE_READY;
HAL_TIM_IC_Start_DMA(&htim1,TIM_CHANNEL_3,(uint32_t *)speedSensorL,2);
//HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);
//HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_3);
HAL_GPIO_WritePin(enableEncoders_GPIO_Port,enableEncoders_Pin, GPIO_PIN_RESET);
}
void MOTOR_INIT(uint8_t motor){
if(motor == MOTOR_RIGHT)
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
else if(motor == MOTOR_LEFT)
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/*Motor commande function*/
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
void MOTORS_SET(uint8_t state, uint16_t speed){
MOTOR_RIGHT_SET(state, speed);
MOTOR_LEFT_SET(state, speed);
}
void MOTOR_LEFT_SET(uint8_t state, uint16_t speed){
SET_STATEMOTORL(state);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, speed);
}
void MOTOR_RIGHT_SET(uint8_t state, uint16_t speed){
SET_STATEMOTORR(state);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, speed);
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/*Private Function declaration*/
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
void SET_STATEMOTORL(uint8_t state){
switch (state) {
case MOTOR_BREAK:
HAL_GPIO_WritePin(cmdStateMotorR_A_GPIO_Port,cmdStateMotorR_A_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(cmdStateMotorR_B_GPIO_Port,cmdStateMotorR_B_Pin,GPIO_PIN_SET);
break;
case MOTOR_FORWARD:
HAL_GPIO_WritePin(cmdStateMotorR_A_GPIO_Port,cmdStateMotorR_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(cmdStateMotorR_B_GPIO_Port,cmdStateMotorR_B_Pin,GPIO_PIN_SET);
break;
case MOTOR_BACKWARD:
HAL_GPIO_WritePin(cmdStateMotorR_A_GPIO_Port,cmdStateMotorR_A_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(cmdStateMotorR_B_GPIO_Port,cmdStateMotorR_B_Pin,GPIO_PIN_RESET);
break;
default:
HAL_GPIO_WritePin(cmdStateMotorR_A_GPIO_Port,cmdStateMotorR_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(cmdStateMotorR_B_GPIO_Port,cmdStateMotorR_B_Pin,GPIO_PIN_RESET);
}
}
void SET_STATEMOTORR(uint8_t state){
switch (state) {
case MOTOR_BREAK:
HAL_GPIO_WritePin(cmdStateMotorL_A_GPIO_Port,cmdStateMotorL_A_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(cmdStateMotorL_B_GPIO_Port,cmdStateMotorL_B_Pin,GPIO_PIN_SET);
break;
case MOTOR_FORWARD:
HAL_GPIO_WritePin(cmdStateMotorL_A_GPIO_Port,cmdStateMotorL_A_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(cmdStateMotorL_B_GPIO_Port,cmdStateMotorL_B_Pin,GPIO_PIN_RESET);
break;
case MOTOR_BACKWARD:
HAL_GPIO_WritePin(cmdStateMotorL_A_GPIO_Port,cmdStateMotorL_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(cmdStateMotorL_B_GPIO_Port,cmdStateMotorL_B_Pin,GPIO_PIN_SET);
break;
default:
HAL_GPIO_WritePin(cmdStateMotorL_A_GPIO_Port,cmdStateMotorL_A_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(cmdStateMotorL_B_GPIO_Port,cmdStateMotorL_B_Pin,GPIO_PIN_RESET);
}
}
unsigned int valabs(int val){
if (val < 0) return -val;
else return val;
}
uint8_t borneVitesse(int vitesse){
if(vitesse <= 0)
return 0;
else if(vitesse >=100)
return 100;
else
return (uint8_t)vitesse;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
/*
* htim retourne une valeur de channel de 0x01 ou 0x04 selon que l'information vient de la roue droite ou gauche
*/
if(htim1.Instance==TIM1 && htim1.Channel==0x01){ // Roue droite
distanceR++;
if(speedSensorR[1] - speedSensorR[0] > 0){
tempsRoueD = speedSensorR[1] - speedSensorR[0];
if(tempsRoueD <= SPEED_MAX)
speedR=100;
else if(tempsRoueD >=SPEED_MIN)
speedR=0;
else{
speedR = (SPEED_MIN-SPEED_MAX) - tempsRoueD;
speedR = (speedR/(SPEED_MIN-SPEED_MAX))*100;
}
}
}
if(htim1.Instance==TIM1 && htim1.Channel==0x04){ // Roue gauche
distanceL++;
if(speedSensorR[1] - speedSensorR[0] > 0){
tempsRoueG = speedSensorL[1] - speedSensorL[0];
// Borne de la valeur;
if(tempsRoueG <= SPEED_MAX)
speedL=100;
else if(tempsRoueG >=SPEED_MIN)
speedL=0;
else{
speedL = (SPEED_MIN-SPEED_MAX) - tempsRoueG;
speedL = (speedL/(SPEED_MIN-SPEED_MAX))*100;
}
/*if(tempsRoueD>100)
tempsRoueD=100;*/
}
}
}