PENNA_B/Exp01/Core/Src/ADC_READ.c
2025-11-19 05:41:34 +01:00

69 lines
2 KiB
C

#include "ADC_READ.h"
#include "adc.h"
#include "dma.h"
#define READ_CH 1
// definisci il vettore per i risultati delle misure
void ADC_calibrate(){
// calibrazione
// ADC3->CR |= ADC_CR_ADCALDIF; // SOLO per misure differenziali (defualt=0)
// esegui anche calibrazione linearità (oltre che offest)
ADC3->CR |= ADC_CR_ADCALLIN;
// inizia la calibrazione
ADC3->CR |= ADC_CR_ADCAL;
}
void DMA_init(){
// DMA per USART (DMA1 stream3)
DMA1_Stream3->M0AR = (uint32_t) &results;
DMA1_Stream3->PAR = (uint32_t) &(USART3->TDR);
DMA1_Stream3->NDTR = (uint16_t) (N_MEAS+1)*2; // send signle bytes
DMA1->LIFCR = 0xffffffff;
DMA1->HIFCR = 0xffffffff;
DMA1_Stream3->CR |= DMA_SxCR_TCIE;
// DMA per ADC (DMA2 stream0)
DMA2_Stream0->M0AR = (uint32_t) &results;
DMA2_Stream0->PAR = (uint32_t) &(ADC3->DR);
DMA2_Stream0->NDTR = (uint16_t) N_MEAS;
DMA2->LIFCR = 0xffffffff;
DMA2->HIFCR = 0xffffffff;
DMA2_Stream0->CR |= DMA_SxCR_TCIE;
}
void ADC_READ_init(){
// TIM6 conf.
TIM6 -> PSC = 6000; // set single timer ticks to 0.25us (240MHz/30 = 4MHz) - 240MHz is APB1 clock freq.
TIM6 -> CNT = 0;
TIM6 -> ARR = 4; // 1/4 us
// configura canali da leggere in modalità sequenziale
ADC3->SQR1 = 0;
ADC3->SQR1 |= (READ_CH << ADC_SQR1_SQ1_Pos);
// imposta una sola misura (lui misura L+1 canali dove L è il valore impostato in questo reg.)
ADC3->SQR1 |= (0 << ADC_SQR1_L_Pos);
// abilita i canali da utilizzare nel multiplexer
ADC3->PCSEL |= ADC_PCSEL_PCSEL_1;
// imposta il tempo di lettura (bigger, better)
ADC3->SMPR1 |= (0 << ADC_SMPR1_SMP1_Pos);
// abilita interrupt per fine misura [e messa in funzione (ADRDY abilitato)]
ADC3->IER |= ADC_IER_EOSIE;
// cont. mode
//ADC3->CFGR |= ADC_CFGR_CONT;
// abilita DMA sull'ADC
ADC3->CFGR |= ADC_CFGR_DMNGT;
// ignora overrun
//ADC3->CFGR |= ADC_CFGR_OVRMOD;
// abilita ADC vera e propria
ADC3->ISR |= ADC_ISR_ADRDY;
ADC3->CR |= ADC_CR_ADEN;
DMA2_Stream0->CR |= DMA_SxCR_EN;
}