Selamat siang. Dalam posting ini, saya akan menjelaskan bagaimana saya berhasil mendapatkan STM32F407VET6 untuk mengukur sinyal analog pada waktu tertentu menggunakan DMA.
Alasan utama saya untuk mengukur sinyal pada waktu yang tepat adalah kebutuhan untuk mengukur arus yang mengalir di shunt pengontrol motor BLDC tiga fase.
Untuk menyederhanakan dan membatasi masalah, mari kita setujui itu
kita tahu saat-saat yang tepat ketika sinyal perlu diukur;
dari poin sebelumnya juga jelas berapa banyak pengukuran yang harus dilakukan;
perbedaan waktu antara dua pengukuran yang berurutan bisa berapa saja;
kita hanya perlu satu saluran untuk mengukur pada interval yang tepat.
Kami juga mempertimbangkan fitur-fitur STM32 berikut:
STM32 memiliki pengontrol DMA (DMA1) yang dapat menyimpan MCU dari mentransfer data dari register ADC ke memori RAM di akhir konversi;
Konversi ADC dapat dipicu oleh beberapa peristiwa termasuk: TIMx_UP, TIMx_CCRy.
Jadi, setiap konversi berikutnya dapat dipicu saat timer yang dapat memicu ADC mengaktifkan peristiwa Tangkap / Bandingkan atau Perbarui. Setelah konversi berakhir, DMA1 mulai beroperasi dan mentransfer nilai terukur ke memori 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 , . , , , .
Pembaruan 1:
Tautan ke kasus uji di github.