stm32_freertos_template/hw/adc.c

68 lines
1.7 KiB
C

/*! \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;
}