ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
25 марта
1502085
Anvar (28.02.2025 13:03 - 13:27, просмотров: 3885)
Вопрос по АЦП в STM32 в режиме DMA. 

Сделал я опрос трех каналов (токи трех фаз A,B, C) по таймеру 10 кГц с записью в кольцевой буфер DMA , все работало хорошо, но по мере роста общего кода программы возникла проблема

Упрощенно выглядит так

Есть переменные

volatile int16_t DMA_V[3];

int16_t BuffSum[3];

Есть запуск процесса


HAL_ADC_Start_DMA(&ADCCurrenthadc, (uint32_t*)&(DMA_V), 3);

HAL_TIM_Base_Start_IT(&TIMADChtim);

По таймеру запускается последовательное преобразование трех каналов и по окончании вызывается функция (прерывание), где я данные переношу в другой буфер

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    for (uint8_t c1= 0; c1 < 3; c1++) { BuffSum[c1] = DMA_V[c1]; }
}


Соотвественно вначале

DMA_V[0] это фаза A,

DMA_V[1] это фаза B,

DMA_V[2] это фаза C.

Но через некоторое время, пока не понял почему, фазы в DMA буфере "сдвигаются",

в DMA_V[0] фаза C,

в DMA_V[1] фаза A,

воDMA_V[2] фаза B.

Через некоторое время может еще сдвинутся.

Ошибок в HAL_ADC_ErrorCallback не возникает.

Где-то у меня косяк в коде, но не могу понять откуда начать копать