Vous êtes sur la page 1sur 6

#include "stm32f10x_lib.h" #include "stm32f10x_conf.h" #include "stdint.

h" ADC_InitTypeDef ADC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; ErrorStatus HSEStartUpStatus; RCC_ClocksTypeDef RCC_ClockFreq; GPIO_InitTypeDef GPIO_InitStructure ; DMA_InitTypeDef DMA_InitStructure; volatile uint16_t ADC1ConvertedValue; volatile uint16_t ADC2ConvertedValue; void void void void void RccInitPeripherals(void); RccInit(void); GPIO_Config(void); ADC_Config(void); PWM_Config(void);

int main(void) { RccInit(); GPIO_Config(); ADC_Config(); PWM_config(); while(1) { if ((ADC2ConvertedValue>=1960)&&(ADC2ConvertedValue<=2120)) { if ((ADC1ConvertedValue>=1960)&&(ADC1ConvertedValue<=2120)) {TIM3->CCR1=0; //roue droite (b5) TIM3->CCR3=0; //roue gauche (a11) // "frein" } else if (ADC1ConvertedValue<1960) {TIM3->CCR1=1960-ADC1ConvertedValue; TIM3->CCR3=1960-ADC1ConvertedValue; GPIO_ResetBits(GPIOB,GPIO_Pin_5); GPIO_ResetBits(GPIOA, GPIO_Pin_11); // "arriere" } else {TIM3->CCR1=2*(ADC1ConvertedValue-2120); TIM3->CCR3=2*(ADC1ConvertedValue-2120); GPIO_SetBits(GPIOB,GPIO_Pin_5); GPIO_SetBits(GPIOA, GPIO_Pin_11); // "avant" } } else if (ADC2ConvertedValue<1960) { if ((ADC1ConvertedValue>=1960)&&(ADC1ConvertedValue<=2120)) {TIM3->CCR1=1960-ADC2ConvertedValue; TIM3->CCR3=1960-ADC2ConvertedValue; GPIO_SetBits(GPIOB,GPIO_Pin_5); GPIO_ResetBits(GPIOA, GPIO_Pin_11); // "pivot gauc he" }

else if (ADC1ConvertedValue<1960) {TIM3->CCR1=4095-ADC1ConvertedValue-ADC2ConvertedValue; TIM3->CCR3=1960-ADC1ConvertedValue; GPIO_ResetBits(GPIOB,GPIO_Pin_5); GPIO_ResetBits(GPIOA, GPIO_Pin_11); // "arriere ga uche" } else {TIM3->CCR1=ADC1ConvertedValue-ADC2ConvertedValue; TIM3->CCR3=ADC1ConvertedValue-2120; GPIO_SetBits(GPIOB,GPIO_Pin_5); GPIO_SetBits(GPIOA, GPIO_Pin_11); // "avant gau che" } } else { if ((ADC1ConvertedValue>=1960)&&(ADC1ConvertedValue<=2120)) {TIM3->CCR1=ADC2ConvertedValue-2120; TIM3->CCR3=ADC2ConvertedValue-2120; GPIO_ResetBits(GPIOB,GPIO_Pin_5); GPIO_SetBits(GPIOA, GPIO_Pin_11); // "pivot droi te" } else if (ADC1ConvertedValue<1960) {TIM3->CCR1=1960-ADC1ConvertedValue; TIM3->CCR3=ADC2ConvertedValue-ADC1ConvertedValue; GPIO_ResetBits(GPIOB,GPIO_Pin_5); GPIO_ResetBits(GPIOA, GPIO_Pin_11); // "arriere d roite" } else {TIM3->CCR1=ADC1ConvertedValue-2120; TIM3->CCR3=ADC1ConvertedValue+ADC2ConvertedValue-4095; GPIO_SetBits(GPIOB,GPIO_Pin_5); GPIO_SetBits(GPIOA, GPIO_Pin_11); // "avant dr oite" } } } } void RccInitPeripherals(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC| RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2, ENABLE);

/* if(HSEStartUpStatus == ERROR) up

// If HSE is not detected at program start // Generate NMI ex

{ NVIC_SetSystemHandlerPendingBit(SystemHandler_NMI); ception } */ }

void RccInit(void) { RCC_DeInit(); // RCC system reset(for debug purpose) RCC_HSEConfig(RCC_HSE_ON); // Enable HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); // Wait till HSE is ready if(HSEStartUpStatus == SUCCESS) { FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Enable Prefetch B uffer FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state RCC_HCLKConfig(RCC_SYSCLK_Div1); // HCLK = SYSCLK RCC_PCLK1Config(RCC_HCLK_Div1); // PCLK2 = HCLK //Clock APB2 RCC_PCLK2Config(RCC_HCLK_Div1); RCC_ADCCLKConfig(RCC_PCLK2_Div8); RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_12); // PLLCLK = 6MHz * 1 2 = 72 MHz RCC_PLLCmd(ENABLE); // Enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) // Wait till PLL is re ady { } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Select PLL as system clock source while(RCC_GetSYSCLKSource() != 0x08) lock source { } // Wait till PLL is used as system c

RCC_GetClocksFreq(&RCC_ClockFreq); // This function fills a RCC_ClocksTyp eDef structure with the current frequencies of different on chip clocks (for deb ug purpose) RCC_ClockSecuritySystemCmd(ENABLE); // Enable Clock Security System(CSS): th is will generate an NMI exception when HSE clock fails RccInitPeripherals(); } } void GPIO_Config(void) { // pins de sortie du signal PWM GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); // pins de commande de sens de rotation GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //pins d'entre ADC GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ; GPIO_Init(GPIOC, &GPIO_InitStructure); } void ADC_Config(void) { //DMA1 channel1 configuration ---------------------------------------------DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC1ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 12; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); // Enable DMA1 channel1 DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel 10 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5); /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1);

/* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); // DMA2 channel1 configuration ---------------------------------------------DMA_DeInit(DMA2_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC2->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC2ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA2_Channel1, &DMA_InitStructure); DMA_Cmd(DMA2_Channel1, ENABLE); /* ADC2 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC2, &ADC_InitStructure); ADC_RegularChannelConfig(ADC2, ADC_Channel_12, 1, ADC_SampleTime_55Cycles5); ADC_DMACmd(ADC2, ENABLE); ADC_Cmd(ADC2, ENABLE); ADC_ResetCalibration(ADC2); while(ADC_GetResetCalibrationStatus(ADC2)); ADC_StartCalibration(ADC2); while(ADC_GetCalibrationStatus(ADC2)); ADC_SoftwareStartConvCmd(ADC2, ENABLE); TIM_DMACmd(TIM3, TIM_DMA_Update, ENABLE); } void PWM_config(void) { TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_Cmd(TIM3, ENABLE); TIM_CtrlPWMOutputs(TIM3, ENABLE); TIM3->CCR1 = 0; TIM3->CCR3 = 0; }

Vous aimerez peut-être aussi