Conversão ADC em horários especificados no STM32

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) :





Amarelo - sinal do DAC, verde - saída TIM3_CH1
- DAC, - TIM3_CH1

. , .





ADC , :





Resultado da medição, valores CCR do eixo horizontal, valores DAC digitalizados verticais
, CCR, DAC

, , , , .





STM32F103C8T6, . CCR, MCU , . - , .





, DMA1, , DMA2 , . , , , .





Atualização 1:

link para o caso de teste no github.








All Articles