/** ****************************************************************************** * @file main.c * @author Ac6 * @version V1.0 * @date 01-December-2013 * @brief Default main function. ****************************************************************************** */ #include "stm32f4xx.h" #include "stm32f4_discovery.h" int ADC_Result=0; int main(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // zegar dla modułu ADC1 GPIO_InitTypeDef GPIO_InitStructure1; /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */ GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure1.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure1); GPIO_InitTypeDef GPIO_InitStructure; //inicjalizacja wejścia ADC GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_CommonInitTypeDef ADC_CommonInitStructure; // niezależny tryb pracy przetworników ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; // zegar główny podzielony przez 2 ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; // opcja istotna tylko dla trybu multi ADC ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; // czas przerwy pomiędzy kolejnymi konwersjami ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); ADC_InitTypeDef ADC_InitStructure; //ustawienie rozdzielczości przetwornika na maksymalną (12 bitów) ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //wyłączenie trybu skanowania (odczytywać będziemy jedno wejście ADC //w trybie skanowania automatycznie wykonywana jest konwersja na wielu //wejściach/kanałach) ADC_InitStructure.ADC_ScanConvMode = DISABLE; //włączenie ciągłego trybu pracy ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //wyłączenie zewnętrznego wyzwalania //konwersja może być wyzwalana timerem, stanem wejścia itd. (szczegóły w //dokumentacji) ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //wartość binarna wyniku będzie podawana z wyrównaniem do prawej //funkcja do odczytu stanu przetwornika ADC zwraca wartość 16-bitową //dla przykładu, wartość 0xFF wyrównana w prawo to 0x00FF, w lewo 0x0FF0 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //liczba konwersji równa 1, bo 1 kanał ADC_InitStructure.ADC_NbrOfConversion = 1; // zapisz wypełnioną strukturę do rejestrów przetwornika numer 1 ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_84Cycles); ADC_Cmd(ADC1, ENABLE); for(;;) { ADC_SoftwareStartConv(ADC1); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); ADC_Result = ADC_GetConversionValue(ADC1); if(ADC_Result < 1000 && ADC_Result >500 ) { GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15); GPIO_SetBits(GPIOD, GPIO_Pin_13); } else if(ADC_Result < 500 ) { GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15); } else if(ADC_Result < 2000 && ADC_Result >1000 ) { GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15); GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13); } else if(ADC_Result < 3000 && ADC_Result >2000 ) { GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15); GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14); } else if(ADC_Result < 4000 && ADC_Result >3000 ) { GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15); GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15); } } }