Guten Tag. In diesem Beitrag werde ich erklären, wie ich es geschafft habe, den STM32F407VET6 dazu zu bringen, analoge Signale zu bestimmten Zeiten mit DMA zu messen.
Mein Hauptgrund für die genaue Messung von Signalen war die Notwendigkeit, die in den Shunts des dreiphasigen BLDC-Motorcontrollers fließenden Ströme zu messen.
Um das Problem zu vereinfachen und zu begrenzen, stimmen wir dem zu
Wir kennen die genauen Zeitpunkte, zu denen das Signal gemessen werden muss.
Aus dem vorherigen Punkt ist auch klar, wie viele Messungen durchgeführt werden sollten.
Der Zeitunterschied zwischen zwei aufeinanderfolgenden Messungen kann beliebig sein.
Wir brauchen nur einen Kanal, um in genauen Intervallen zu messen.
Wir berücksichtigen auch die folgenden Funktionen von STM32:
STM32 verfügt über einen DMA (DMA1) -Controller, der die MCU daran hindern kann, am Ende der Konvertierung Daten aus dem ADC-Register in den RAM-Speicher zu übertragen.
Die ADC-Konvertierung kann durch einige Ereignisse ausgelöst werden, darunter: TIMx_UP, TIMx_CCRy.
Somit kann jede nachfolgende Konvertierung ausgelöst werden, wenn ein Timer, der einen ADC auslösen kann, ein Capture / Compare- oder Update-Ereignis auslöst. Nach dem Ende der Konvertierung wird DMA1 in Betrieb genommen und überträgt den Messwert in den MCU-Speicher.
, 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 , . , , , .
Update 1:
Link zum Testfall auf Github.