Bom Dia. Neste post, vou explicar como consegui fazer com que o STM32F407VET6 medisse sinais analógicos em horários específicos usando DMA.
Meu principal motivo para medir sinais no momento exato foi a necessidade de medir as correntes que fluem nas derivações do controlador de motor BLDC trifásico.
Para simplificar e limitar o problema, vamos concordar que
sabemos os momentos exatos em que é necessário medir o sinal;
do ponto anterior também é claro quantas medições devem ser feitas;
a diferença de tempo entre duas medições sucessivas pode ser qualquer;
precisamos apenas de um canal para medir em intervalos precisos.
Também levamos em consideração os seguintes recursos do STM32:
STM32 tem um controlador DMA (DMA1) que pode salvar o MCU de transferir dados do registro ADC para a memória RAM no final da conversão;
A conversão ADC pode ser acionada por alguns eventos, incluindo: TIMx_UP, TIMx_CCRy.
Assim, cada conversão subsequente pode ser disparada quando um cronômetro que pode disparar um ADC dispara um evento Capture / Compare ou Update. Após o término da conversão, o DMA1 entra em operação e transfere o valor medido para a memória MCU.
, Capture/Compare CCR. ( ) . , . , , , .
CCR
Capture/Compare Register. Update , , . CCR , .
TIMx->CCRy DMA(DMA2), , CCRy ADC CCRy DMA2. ( DMA2, ADC DMA1) CCR, DMA2 TIMx->CCRy. .
, :
ADC CCRy, CCR ;
DMA1 ADC MCU;
DMA2 CCR ADC. DMA2 TIMx->CCRy .
CCR MCU, DMA.
:
, , . , STM32CubeIDE.
1. ADC Scan Conversion Mode, (IN1), DMA1, .
2. . AutoReload Register , .. . , , . TIM3 DMA, - , Increment Address Memory. TIM3 , , CCR DMA. Output Compare CH1 Output Compare No Output CCR CNT MCU.
Toogle on match TIM3 Output Compare Channel 1 CCR ADC. ADC : Trigger detection on both the rising and failling edges ADC .
3. , DAC, , DAC ADC IN1 , .
, .
DAC . , DAC (4095).
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0u);
__HAL_DAC_ENABLE(&hdac, DAC_CHANNEL_1);
CCR , , ARR, . , , .
CCR
uint16_t ccValues[MEASUREMENT_COUNT];
ccValues[0] = 115;
ccValues[1] = 252;
ccValues[2] = 388;
ccValues[3] = 475;
ccValues[4] = 582;
ccValues[5] = 646;
ccValues[6] = 727;
ccValues[7] = 871;
ccValues[8] = 993;
ccValues[9] = 1062;
ccValues[10] = 1211;
ccValues[11] = 1339;
ccValues[12] = 1425;
ccValues[13] = 1466;
ccValues[14] = 1541;
ccValues[15] = 1669;
ccValues[16] = 1818;
ccValues[17] = 1872;
ccValues[18] = 1963;
ccValues[19] = 2000;
CCR1, . CC1 .
htim3.Instance->CCR1 = ccValues[0];
HAL_TIM_Base_Stop(&htim3);
htim3.Instance->CNT = 0;
__HAL_TIM_ENABLE_IT(&htim3, TIM_IT_CC1);
__HAL_DBGMCU_FREEZE_TIM3();
ADC DMA. ADC .
HAL_ADC_Start_DMA(&hadc3, measuredAdcValues, MEASUREMENT_COUNT);
DMA2, , .. CCR1.
HAL_TIM_OC_Start_DMA(&htim3, TIM_CHANNEL_1, &ccValues[1], MEASUREMENT_COUNT - 1u);
.
MCU ( DAC/ADC IN1, TIM3_CH1) :
. , .
ADC , :
, , , , .
STM32F103C8T6, . CCR, MCU , . - , .
, DMA1, , DMA2 , . , , , .
Atualização 1:
link para o caso de teste no github.