Conversion ADC à des moments spécifiés sur STM32

Bonne journée. Dans cet article, j'expliquerai comment j'ai réussi à faire en sorte que le STM32F407VET6 mesure des signaux analogiques à des moments spécifiés en utilisant DMA.





Ma principale raison de mesurer les signaux à l'heure exacte était la nécessité de mesurer les courants circulant dans les shunts du contrôleur de moteur BLDC triphasé.





Pour simplifier et limiter le problème, admettons que





  • nous connaissons les moments exacts dans le temps où il est nécessaire de mesurer le signal;





  • à partir du point précédent, il est également clair combien de mesures doivent être effectuées;





  • la différence de temps entre deux mesures successives peut être quelconque;





  • nous n'avons besoin que d'un seul canal pour mesurer à des intervalles précis.





Nous prenons également en compte les fonctionnalités suivantes de STM32:





  • STM32 a un contrôleur DMA (DMA1) qui peut empêcher la MCU de transférer des données du registre ADC vers la mémoire RAM à la fin de la conversion;





  • La conversion ADC peut être déclenchée par certains événements, notamment: TIMx_UP, TIMx_CCRy.





Ainsi, chaque conversion ultérieure peut être déclenchée lorsqu'un temporisateur qui peut déclencher un ADC déclenche un événement Capture / Compare ou Update. Après la fin de la conversion, DMA1 entre en fonctionnement et transfère la valeur mesurée dans la mémoire 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) :





Jaune - signal du DAC, vert - sortie TIM3_CH1
- DAC, - TIM3_CH1

. , .





ADC , :





Résultat de la mesure, valeurs CCR axe horizontal, valeurs DAC verticalement numérisées
, CCR, DAC

, , , , .





STM32F103C8T6, . CCR, MCU , . - , .





, DMA1, , DMA2 , . , , , .





Mise à jour 1:

lien vers le cas de test sur github.








All Articles