dumber/software/robot/main.c
Sébastien DI MERCURIO 776a2f4ce6 initial commit
2018-08-27 16:39:49 +02:00

227 lines
4.6 KiB
C

#include "Battery.h"
#include "system_dumby.h"
#include <stm32f10x.h>
#include "cmde_usart.h"
#include "motor.h"
#include <string.h>
#include "cmde_spi.h"
#include "MAE.h"
#include "led.h"
#include <stdio.h>
float integration1 = 0;
float integration2 = 0;
const float kp = 6;
const float ki = 0.6;
float motD=0,motG=0;
int erreurD;
int erreurG;
char cptMesureHigh=0;
char cptMesureMedium=0;
char cptMesureLow=0;
uint16_t testPostion=0;
/**
* @brief Initialise les fréquences des périphérique et du micro.
*/
void Configure_Clock_Periph(void)
{
///Configuration de la fréqyence d'horloge de l'adc*/
RCC_ADCCLKConfig(RCC_PCLK2_Div2);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
///Activation de l'horloge du GPIO, de A B et C, de ADC1, de AFIO
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM2|RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1| RCC_APB2Periph_TIM1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1|RCC_APB2Periph_SPI1, ENABLE);
}
int main(void)
{
/**
* Initialisation
*/
Configure_Clock_Periph();
default_settings();
MAP_PinShutDown();
MAP_MotorPin();
MAP_LEDpin();
MAP_UsartPin();
MAP_batteryPin();
INIT_TIM2();
INIT_OCMotorPwm();
Configure_SysTick();
INIT_USART();
//INIT_TIM3Led();
INIT_IT_UsartReceive();
DMA_BAT();
ADC1_CONFIG();
INIT_IT_DMA();
IC_TIM1_CHANEL3();
IC_TIM1_CHANEL1();
IT_TIM1();
GPIO_ResetBits(GPIOA,GPIO_Pin_12); //enable encodeurs
while(1)
{
uint16_t k;
uint16_t mesureVoltage;
if(Dumber.acquisition==VOLTAGE&&Dumber.BatterieChecking==TRUE)
{
mesureVoltage=ADCConvertedValue[0];
for(k=1;k<16;k++)
{
mesureVoltage+=ADCConvertedValue[k];
mesureVoltage/=2;
}
if(mesureVoltage < 1650)
mesureVoltage = 1650;
mesureVoltage -= 1650;
mesureVoltage /= 10;
//if(mesureVoltage < Dumber.BatteryPurcentage)
Dumber.BatteryPurcentage = mesureVoltage;
Dumber.acquisition=FALSE;
if(Dumber.BatteryPurcentage > 50)
{
cptMesureHigh++;
if(cptMesureHigh >= 15)
{
if(Dumber.StateSystem == LOW)
Dumber.StateSystem = RUN;
Dumber.stateBattery = 2;
cptMesureHigh=0;
cptMesureMedium=0;
cptMesureLow=0;
}
}
else if (Dumber.BatteryPurcentage < 50 && Dumber.BatteryPurcentage > 10)
{
cptMesureMedium++;
if(cptMesureMedium >= 15)
{
if(Dumber.StateSystem == RUN)
Dumber.StateSystem=LOW;
Dumber.stateBattery =1;
cptMesureHigh=0;
cptMesureMedium=0;
cptMesureLow=0;
}
}
else
{
cptMesureLow++;
if(cptMesureLow >=15)
{
Dumber.StateSystem = DISABLE;
cptMesureHigh=0;
cptMesureMedium=0;
cptMesureLow=0;
Dumber.stateBattery= 0;
}
}
}
if(regulation_vitesseD)
{
erreurD = (signed int)G_speedRight - (signed int)tourD;
motD = kp * erreurD +integration1;
integration1 += ki * erreurD;
if (motD>255)
motD=255;
if (motD<0)
motD=0;
motD=(uint16_t)motD;
majVitesseMotorD(motD);
tourD = 0;
regulation_vitesseD=0;
if(G_lapsRight-tourPositionD < 0)
{
cmdRightMotor(BRAKE,255);
}
}
if(regulation_vitesseG)
{
erreurG = (signed int)G_speedLeft - (signed int)tourG;
motG = kp* erreurG + integration2;
integration2 += ki * erreurG;
if(motG>255)
motG=255;
if(motG<0)
motG=0;
motG=(uint16_t)motG;
majVitesseMotorG(motG);
tourG = 0;
regulation_vitesseG=0;
if(G_lapsLeft-tourPositionG < 0)
{
cmdLeftMotor(BRAKE,255);
}
}
if(G_lapsLeft-tourPositionG < 0 && G_lapsRight-tourPositionD < 0 && asservissement ==1)
{
cmdLeftMotor(BRAKE,255);
cmdRightMotor(BRAKE,255);
asservissement = 0;
erreurD=0;
erreurG=0;
integration1=0;
integration2=0;
Dumber.busyState=FALSE;
Dumber.cpt_inactivity = 0;
}
if(Dumber.StateSystem == IDLE)
{
if(etatLED == 1)
{
LEDON = 1;
}
else if (etatLED==2)
LEDON = 0;
}
if(Dumber.StateSystem == DISABLE)
{
if(etatLED %2 == 0)
LEDred();
else
LEDoff();
}
if(Dumber.StateSystem == RUN || Dumber.StateSystem == LOW)
LEDON = 1;
if(LEDON)
{
if(Dumber.stateBattery==1 && Dumber.StateSystem!=DISABLE)
LEDorange();
if(Dumber.stateBattery==2 && Dumber.StateSystem!=DISABLE)
LEDgreen();
}
else
LEDoff();
//__WFI();
}
#pragma diag_suppress 111
return 0;
}