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) :
. , .
ADC , :
, , , , .
STM32F103C8T6, . CCR, MCU , . - , .
, DMA1, , DMA2 , . , , , .
Mise à jour 1:
lien vers le cas de test sur github.