mirror of
https://github.com/yoboujon/dumber.git
synced 2025-06-09 14:20:50 +02:00
182 lines
5.4 KiB
C
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;*/
|
|
}
|
|
}
|
|
}
|
|
|