53 lines
1,004 B
C
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));
|
|
}
|