Conversi贸n de ADC en momentos espec铆ficos en STM32

Buen d铆a. En esta publicaci贸n, explicar茅 c贸mo logr茅 que el STM32F407VET6 mida se帽ales anal贸gicas en momentos espec铆ficos usando DMA.





Mi principal raz贸n para medir se帽ales en el momento exacto fue la necesidad de medir las corrientes que fluyen en las derivaciones del controlador de motor BLDC trif谩sico.





Para simplificar y limitar el problema, convengamos que





  • conocemos los momentos exactos en el tiempo en que es necesario medir la se帽al;





  • del punto anterior tambi茅n queda claro cu谩ntas mediciones deben realizarse;





  • la diferencia de tiempo entre dos mediciones sucesivas puede ser cualquiera;





  • solo necesitamos un canal para medir a intervalos precisos.





Tambi茅n tenemos en cuenta las siguientes caracter铆sticas de STM32:





  • STM32 tiene un controlador DMA (DMA1) que puede evitar que la MCU transfiera datos desde el registro ADC a la memoria RAM al final de la conversi贸n;





  • La conversi贸n de ADC puede desencadenarse por algunos eventos, incluidos: TIMx_UP, TIMx_CCRy.





Por lo tanto, cada conversi贸n posterior puede activarse cuando un temporizador que puede activar un ADC dispara un evento de Capturar / Comparar o Actualizar. Una vez finalizada la conversi贸n, DMA1 entra en funcionamiento y transfiere el valor medido a la memoria 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) :





Amarillo - se帽al de DAC, verde - salida TIM3_CH1
- DAC, - TIM3_CH1

. , .





ADC , :





Resultado de la medici贸n, valores CCR del eje horizontal, valores DAC digitalizados verticales
, CCR, DAC

, , , , .





STM32F103C8T6, . CCR, MCU , . - , .





, DMA1, , DMA2 , . , , , .





Actualizaci贸n 1:

enlace al caso de prueba en github.








All Articles