projet_voilier/MyDrivers/ADC.c
2020-11-10 16:47:15 +01:00

53 lines
1,004 B
C

#include "ADC.h"
#include "stm32f1xx_ll_bus.h" // Pour horloge
void ADC_conf(ADC_TypeDef *adc)
{
if (adc == ADC1) {
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
} else if (adc == ADC2) {
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC2);
}
// Division de la frequence
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6;
// Fixe le nombre de conversion à 1
adc->SQR1 &= ADC_SQR1_L;
// Calibration
adc->CR2 |= ADC_CR2_CAL_Msk;
while ((adc->CR2 & ADC_CR2_CAL_Msk));
}
void ADC_start(ADC_TypeDef *adc)
{
adc->CR2 |= ADC_CR2_ADON;
}
uint16_t ADC_readRaw(ADC_TypeDef *adc, int channel)
{
// Indique la voie a convertir
adc->SQR3 = channel;
// Lancement de la conversion
adc->CR2 |= ADC_CR2_ADON;
while(!(ADC1->SR & ADC_SR_EOC)) {}
return ADC1->DR & ADC_DR_DATA_Msk;
}
float ADC_convertToVolt(uint16_t value)
{
return ((double) value) / 4095.0 * 3.3;
}
float ADC_readVolt(ADC_TypeDef *adc, int channel)
{
return ADC_convertToVolt(ADC_readRaw(adc, channel));
}