81 lines
1.9 KiB
C
81 lines
1.9 KiB
C
/*
|
|
* adc.c
|
|
*
|
|
* Created on: Sep 6, 2017
|
|
* Author: dmitrijs
|
|
*/
|
|
|
|
#include "main.h"
|
|
|
|
void Adc_Init(void) {
|
|
|
|
RCC->APB2ENR |= RCC_APB2ENR_ADCEN;
|
|
ADC1->CFGR2 = (0x00000002 << 30); // pclk/4 -> 12Mhz
|
|
ADC1->SMPR = 0x00000001; // Sample 7.5 adc cycles
|
|
ADC1->CFGR1 = 0;
|
|
/* (1) Ensure that ADEN = 0 */
|
|
/* (2) Clear ADEN by setting ADDIS*/
|
|
/* (3) Clear DMAEN */
|
|
/* (4) Launch the calibration by setting ADCAL */
|
|
/* (5) Wait until ADCAL=0 */
|
|
if ((ADC1->CR & ADC_CR_ADEN) != 0) /* (1) */
|
|
{
|
|
ADC1->CR |= ADC_CR_ADDIS; /* (2) */
|
|
}
|
|
while ((ADC1->CR & ADC_CR_ADEN) != 0) {
|
|
/* For robust implementation, add here time-out management */
|
|
}
|
|
ADC1->CFGR1 &= ~ADC_CFGR1_DMAEN; /* (3) */
|
|
ADC1->CR |= ADC_CR_ADCAL; /* (4) */
|
|
while ((ADC1->CR & ADC_CR_ADCAL) != 0) /* (5) */
|
|
{
|
|
/* For robust implementation, add here time-out management */
|
|
}
|
|
/* (1) Ensure that ADRDY = 0 */
|
|
/* (2) Clear ADRDY */
|
|
/* (3) Enable the ADC */
|
|
/* (4) Wait until ADC ready */
|
|
if ((ADC1->ISR & ADC_ISR_ADRDY) != 0) /* (1) */
|
|
{
|
|
ADC1->ISR |= ADC_ISR_ADRDY; /* (2) */
|
|
}
|
|
ADC1->CR |= ADC_CR_ADEN; /* (3) */
|
|
while ((ADC1->ISR & ADC_ISR_ADRDY) == 0) /* (4) */
|
|
{
|
|
/*TODO For robust implementation, add here time-out management */
|
|
}
|
|
|
|
ADC1->IER = 0;
|
|
//NVIC_EnableIRQ(ADC1_IRQn);
|
|
}
|
|
|
|
unsigned short LPF(unsigned short lpf_c, unsigned short value,
|
|
unsigned short old_value) {
|
|
// Averageing filtering
|
|
|
|
float tmp;
|
|
|
|
tmp = ((float) (value - old_value) * ((float) (lpf_c) / (float) 1000.0)); // filter
|
|
if (tmp > 0)
|
|
tmp += (float) 0.5; // roundup
|
|
else
|
|
tmp -= (float) 0.5;
|
|
|
|
return (unsigned short) ((signed int) old_value + (signed int) tmp);
|
|
|
|
}
|
|
|
|
unsigned short Adc_Read(unsigned char ch) {
|
|
unsigned short tmp;
|
|
if (ADC1->ISR & ADC_ISR_EOC)
|
|
tmp = ADC1->DR; //ADC1->ISR |= ADC_ISR_EOC; // clear EOC flag
|
|
ADC1->CHSELR = (1 << ch); // select channel
|
|
ADC1->CR |= ADC_CR_ADSTART;
|
|
while ((~ADC1->ISR) & ADC_ISR_EOC)
|
|
;
|
|
ADC1->ISR |= ADC_ISR_EOC;
|
|
tmp = ADC1->DR;
|
|
return tmp;
|
|
}
|
|
|