Sunteți pe pagina 1din 11

#include stm32f4_discovery.

h
//***********************************************
// Configuation gnrale
//***********************************************
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//***********************************************
// Appelle des fontions de configuration
//***********************************************
void GPIO_Config(void);
void PWM_Config(int period);
void TIM_Config(void);
void Delay(__IO uint32_t nCount);
void servo_1(int deg1);
void servo_2(int deg2);
void servo_3(int deg3);
void servo_4(int deg4);
void moteur_PWM(uint16_t mdav,uint16_t mdar, uint16_t mgav, uint16_t mgar);
void configureEncoder(void);
uint32_t offsetencoder=0x7fffffff;
long long encoder1=0;
long long encoder2=0;
/*****************************************/
void encodersReset (void) ;
#define LEFT_COUNT() TIM2->CNT
#define RIGHT_COUNT() TIM5->CNT
volatile int16_t leftCount;
volatile int16_t rightCount;
volatile int16_t fwdCount;
volatile int16_t rotCount;
//distances
volatile int32_t leftTotal;
volatile int32_t rightTotal;
volatile int32_t fwdTotal;
volatile int32_t rotTotal;
// local variables static
volatile int16_t oldLeftEncoder;
static volatile int16_t oldRightEncoder;
static volatile int16_t leftEncoder;
static volatile int16_t rightEncoder;
static volatile int16_t encoderSum;
static volatile int16_t encoderDiff;
/*******************************************/
uint16_t CCR1_Val = 0; //pc6
uint16_t CCR2_Val = 0; //PC7
uint16_t CCR3_Val = 0; //PB0
uint16_t CCR4_Val = 0; //PB1
uint16_t PrescalerValue = 0;
int deg;
//***********************************************
// Programme principale
//***********************************************
int main(void)
{
GPIO_Config();
TIM_Config();
PWM_Config(2000); // Il faut saisir la priode
while (1) //*Equivalent a void(loop) a arduino*//
{ oldLeftEncoder = leftEncoder;
leftEncoder = TIM_GetCounter (TIM2) ;
oldRightEncoder = rightEncoder;
rightEncoder = -TIM_GetCounter (TIM5) ;
leftCount = leftEncoder oldLeftEncoder;
rightCount = rightEncoder oldRightEncoder;
fwdCount = leftCount + rightCount;
rotCount = (leftCount rightCount);
fwdTotal += fwdCount;
rotTotal += rotCount;
leftTotal += leftCount;
rightTotal += rightCount;
}
}
//***********************************************
// Fonction pour configuration GPIO
//***********************************************
void GPIO_Config(void)
{
/* GPIOC and GPIOB clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB|
RCC_AHB1Periph_GPIOD |RCC_AHB1Periph_GPIOA, ENABLE);
/****************TIM3*********************/
/* GPIOC Configuration: TIM3 CH1 (PC6) and TIM3 CH2 (PC7) */ /* ===>Moteur 1 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* GPIOB Configuration: TIM3 CH3 (PB0) and TIM3 CH4 (PB1) */ /* ===>Moteur 2 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/****************TIM4*********************/
/* GPIOB Configuration: TIM4 CH1 (PD12) and TIM4 CH2 (PD13) and TIM4 CH3 (PD14) and TIM4 CH4
(PD15) */ /* ===>ServoMoteur */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/****************TIM2*********************/
/* GPIOB Configuration: TIM2 CH1 (PA15) and TIM2 CH3(PA2) and TIM2 CH4 (PA3)*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2| GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/******encoder 1*********/
/* GPIOB Configuration: TIM2 CH1 (PB3)*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_15;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/****************TIM8*********************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/****************TIM1*********************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/****************TIM5*********************/
/******encoder 2*********/
/* GPIOB Configuration: TIM5*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//***********************************************
// Fonction pour configuration TIMER
//***********************************************
void TIM_Config(void)
{
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* TIM4 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* TIM8 clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
/* TIM1 clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
/* TIM5 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
/* Connect TIM3 pins to AF2 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM3); // Pin Moteur 1 Sens 1
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_TIM3); // Pin Moteur 1 Sens 2
GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM3); // Pin Moteur 2 Sens 1
GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_TIM3); // Pin Moteur 2 Sens 2
/* Connect TIM4 pins to AF2 */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4); //Pin du servo 1
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4); //Pin du servo 2
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_TIM4); //Pin du servo 3
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_TIM4); //Pin du servo 4
/* Connect TIM2 pins to AF2 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_TIM2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_TIM2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_TIM2);
/* Connect TIM8 pins to AF2 */
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM8);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM8);
/* Connect TIM1 pins to AF2 */
GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_TIM1);
/* Connect TIM5 pins to AF2 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM5);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM5);
}
//***********************************************
// Fonction pour configuration PWM
//***********************************************
void PWM_Config(int period)
{
/********************************/
/*******Prametrage du PWM********/
/*******************************/
/* Compute the prescaler value */
PrescalerValue = (uint16_t) ((SystemCoreClock /2) / 16000000) 1;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = period ;
TIM_TimeBaseStructure.TIM_Prescaler = 500;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
/*******Prametrage des Timeurs********/
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/*****************************************************************/
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
/* Configure the timer */
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising,
TIM_ICPolarity_Rising);
TIM_SetAutoreload (TIM2, 0xffff);
TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising,
TIM_ICPolarity_Rising);
TIM_SetAutoreload (TIM5, 0xffff);
/* TIM2 and TIM5 counter enable */
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM5, ENABLE);
encodersReset ();
/*******Prametrage des Chanels********/
/*******TIM3******/
/* PWM1 Mode configuration: Channel1 TIM3*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel2 TIM3*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel3 TIM3*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel4 TIM3*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
/*Actication des TIM*/
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_ARRPreloadConfig(TIM4, ENABLE);
/***********TIM4*********/
/* PWM1 Mode configuration: Channel1 TIM4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel2 TIM4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel3 TIM4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel4 TIM4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
/*Actication des TIM*/
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_ARRPreloadConfig(TIM4, ENABLE);
TIM_ARRPreloadConfig(TIM8, ENABLE);
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM4, ENABLE);
TIM_Cmd(TIM8, ENABLE);
TIM_Cmd(TIM1, ENABLE);
}
//***********************************************
// Fonction pour configuration du delay
//***********************************************
void Delay(__IO uint32_t nCount)
{
while(nCount)
{
}
}
//***********************************************
// Fonction pour controler les servo moteur
//***********************************************
void servo_1(int deg1)
{
TIM4->CCR1 =(uint16_t)(deg1*1000)/180; // Servo pinD12 TIM4
}
void servo_2(int deg2)
{
TIM4->CCR2 =(uint16_t)(deg2*1000)/180; // Servo pinD13 TIM4
}
void servo_3(int deg3)
{
TIM4->CCR1 =(uint16_t)(deg3*1000)/180; // Servo pinD14 TIM4
}
void servo_4(int deg4)
{
TIM4->CCR4 =(uint16_t)(deg4*1000)/180; // Servo pinD15 TIM4
}
//***********************************************
// Fonction pour controler deux moteur
//***********************************************
void moteur_PWM(uint16_t mdav,uint16_t mdar, uint16_t mgav, uint16_t mgar)
{
TIM3->CCR1 =(uint16_t)(mdav); // PA6 TIM3
TIM3->CCR2 =(uint16_t)(mdar); //PA7 TIM3
TIM3->CCR3 = (uint16_t)(mgav); //PB0 TIM3
TIM3->CCR4 = (uint16_t)(mgar); //PB1 TIM3
}
void encodersReset (void) {
oldLeftEncoder = 0;
oldRightEncoder = 0;
leftTotal = 0;
rightTotal = 0;
fwdTotal = 0;
rotTotal = 0;
TIM_SetCounter (TIM2, 0);
TIM_SetCounter (TIM3, 0);
oldLeftEncoder = leftEncoder;
leftEncoder = TIM_GetCounter (TIM2) ;
oldRightEncoder = rightEncoder;
rightEncoder = -TIM_GetCounter (TIM5) ;
leftCount = leftEncoder oldLeftEncoder;
rightCount = rightEncoder oldRightEncoder;
fwdCount = leftCount + rightCount;
rotCount = (leftCount rightCount);
fwdTotal += fwdCount;
rotTotal += rotCount;
leftTotal += leftCount;
rightTotal += rightCount;
}

S-ar putea să vă placă și