68 lines
1.7 KiB
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;
|
|
} |