/**
******************************************************************************
* @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);
}
}
}