/*! \file adc.c \author Tomasz Adamczyk \date 2011.12.02 \version 1.0 \brief Obsługa przetwornika analogowo-cyfrowego w STM32. */ #include "hw/gpio.h" #include "adc.h" #include "../error.h" #include "stm32f10x.h" //---------funkcje------------// /*! \brief Funkcja inicjalizuje przetwornik analogowo-cyfrowy. */ void ADC_Initialize(void) { GPIO_InitTypeDef GPIO_Conf; ADC_InitTypeDef ADC_Conf; //zegary RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE); //linie od termistorów - wejścia analogowe GPIO_Conf.GPIO_Pin=TEMP1|TEMP2|TEMP3|TEMP4; GPIO_Conf.GPIO_Mode=GPIO_Mode_AIN; GPIO_Conf.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_Conf); //ustawienia początkowe ADC ADC_Conf.ADC_ContinuousConvMode=DISABLE; ADC_Conf.ADC_DataAlign=ADC_DataAlign_Right; ADC_Conf.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; ADC_Conf.ADC_Mode=ADC_Mode_Independent; ADC_Conf.ADC_NbrOfChannel=1; //1 kanał na raz ADC_Conf.ADC_ScanConvMode=DISABLE; ADC_Init(ADC1,&ADC_Conf); //ADC gotowe do pracy - włącz ADC_Cmd(ADC1,ENABLE); //kalibracja ADC ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1) == SET); } /*! \brief Funkcja wykonuje pomiar wybranego kanału. Nie używam pomiarów grupowych, mierzę 1 kanał na raz. \param channel Kanał przetwornika. \return Wynik pomiaru - liczba 16bit bez znaku. */ uint16_t ADC_Read(uint8_t channel) { //wybierz kanał ADC_RegularChannelConfig(ADC1,channel,1,ADC_SampleTime_239Cycles5); //start ADC1->CR2|=ADC_CR2_ADON; //czekaj na zakońxczenie pomiaru while( !(ADC1->SR&ADC_SR_EOC) ); //zwróć wynik return ADC1->DR; }