Перейти к содержанию
    

stm32f1 adc dma как замерять 10 значений на выводе ацп

У меня такой риторический вопрос как мне произвести 10 замеров ацп?Это мне нужно создавать массив?И при каждом замере выполнив замер отключать бит запуска измерений потом заново включать? Или как правильно ? Подскажите спецы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Берёшь массив из 20 значений. АЦП в кольцевом режиме непрерывно измеряет. Настраиваешь 2 прерывания от АЦП: по половине буфера и по окончании измерений. В итоге каждые 10 замеров получаешь прерывания. В зависимости от того, какое получил, используешь в расчётах  либо первые 10, либо вторую десятку. Ессно, всё через DMA.

Изменено пользователем tonyk_av

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прерывание от DMA?Если я использую DMA.То прерывание от АЦП отключаем.Я таких примеров не видел.Если можно пример.

Изменено пользователем dimir

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 минуты назад, dimir сказал:

Я таких примеров не видел

В Reference manual-е смотрели, аппендикс?

RCC->AHBENR |= RCC_AHBENR_DMA1EN; 					//Включили тактирование ДМА
ADC1->CFGR1 |= ADC_CFGR1_DMACFG; 					//Циклический режим

DMA1_Channel1->CPAR = (uint32_t)&(ADC1->DR); 		//Адрес регистра данных АЦП
DMA1_Channel1->CMAR = (uint32_t)&(buff[0]); 		//Начальный адрес в памяти, результат
DMA1_Channel1->CNDTR = 80; 							//Количество измерений в цикле - по 16 на канал
DMA1_Channel1->CCR |= 10656; 						//разрядность: памяти данных 32 бит; источник 16 бит
DMA1_Channel1->CCR |= DMA_CCR_TCIE;					//вкл прерывание на DMA Channel 1
;
DMA1_Channel1->CCR |= DMA_CCR_EN; 					//включили DMA Channel 1

NVIC_EnableIRQ(DMA1_Channel1_IRQn);					//вкл прерывания канал DMA1
NVIC_SetPriority(DMA1_Channel1_IRQn,0);				//приоритет 0 самый высокий

buff[] - тот самый массив, про который вам говорили

А по сути, вы не определились чего хотите в этой жизни - демократии или осетрины с хреном... Есть алгоритмы, которые используют каждый отсчёт ацп для расчётов. Есть более простые - сложить измерения и поделить на количество. Сколько чего задействовано в мк. Отсюда и конкретная реализация.

Изменено пользователем Vlad_G

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного смущает настройка.2 и 6 строки.У меня этого бита нет.А вот 6 строка мне больше интересует.Контроллер какой?Я имею ввиду как измерить допустим 10 измерений на канал и вывести  среднее значение этого канала.И ещё один вопрос.Устанолвка приоретета по прерыванию обязательна?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, утро раннее, не обратил - F0. У F1 по по продвинутее ацп будет, биты другие, но суть та же.

2 строка - циклический режим работы - дошел до последнего, потом начал с первого канала и так по кругу не выключаясь. А может вам надо один цикл по 10 замеров  .!. знает

6 строка - настройка дма, источники разные бывают: 16 бит, 8 бит ... надо указывать, чтоб дма правильно с памятью работал.

Для 10 замеров указываете массив [10], DMA1_Channel1->CNDTR = 10;  Когда сработало прерывание в [10] ваши отсчёты.

Если у вас одно прерывание, то приоритет можно не указывать, если несколько, то желательно, а то и обязательно, а то тапки достанутся не тому.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, dimir said:

Я имею ввиду как измерить допустим 10 измерений на канал

Уже сказали как и даже показали.

30 minutes ago, dimir said:

вывести  среднее значение этого канала

Для сложить 10 значений и поделить сумму на 10 тоже нужен пример? :)))

31 minutes ago, dimir said:

Контроллер какой?

А какая разница? Принцип показан. Дальше смотри АЦП в своём и МК и DMA.

36 minutes ago, dimir said:

Устанолвка приоретета по прерыванию обязательна?

Может, теорию измерений для начала изучить?

Кстати, в примере не показана настройка таймера для запуска АЦП. Если делать по-умному, то брать отсчёты нужно каждые 2мс, после чего усреднять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 05.10.2022 в 09:42, Vlad_G сказал:

А может вам надо один цикл по 10 замеров  .!. знает

6 строка - настройка дма, источники разные бывают: 16 бит, 8 бит ... надо указывать, чтоб дма правильно с памятью работал.

Для 10 замеров указываете массив [10], DMA1_Channel1->CNDTR = 10;  Когда сработало прерывание в [10] ваши отсчёты.

Если у вас одно прерывание, то приоритет можно не указывать, если несколько, то желательно, а то и обязательно, а то тапки достанутся не тому.

 

Не совсем 4 каналов по 10 замеров? Как это сделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, dimir сказал:

Не совсем 4 каналов по 10 замеров? Как это сделать?

Открываете руководство пользователя (User manual), раздел АЦП (ADC), читаете его несколько раз до просветления. Потом внимательно читаете описание регистров ADC_SQRx, записываете в них нужную вам последовательность каналов и количество каналов в последовательности (4). Переходите к разделу ПДП (DMA), читаете его, настраиваете регистры ПДП на 4*10 = 40 пересылок. Запускаете АЦП, ожидаете готовности ПДП.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сергей Борщ.Это нужно сделать не в основном меню. Так что этот вариант с настройкой DMA не катит.А других вариантов нет?

Изменено пользователем dimir

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

50 минут назад, dimir сказал:

А других вариантов нет?

Нет.

Либо вы каждый раз вручную считываете результат из ацп или, что тоже самое, ставите прерывание на преобразование. Либо поручаете дма всю эту рутину. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 05.10.2022 в 16:59, Vlad_G сказал:

Нет.

Либо вы каждый раз вручную считываете результат из ацп или, что тоже самое, ставите прерывание на преобразование. Либо поручаете дма всю эту рутину. 

А вот этот вариант вручную поподробнее если можно.Если не жалко.С чем и как это проделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, dimir сказал:

Это нужно сделать не в основном меню

Что за меню? Откуда оно появилось? Как работа АЦП, ПДП и, возможно, прерываний связана с каким-то меню?

1 час назад, dimir сказал:

А вот этот вариант вручную поподробнее если можно

Настраиваете в ADC_SQR последовательность из одного канала, настраиваете АЦП на однократное измерение, запускаете АЦП, дожидаетесь окончания измерения, вычитываете результат из регистра данных АЦП, повторяете 4*10=40 раз. Документацию читать придется все равно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужно непрерывное измерение тока 3 фаз .Но настройка должна производится немного по другому.

ADC.h APB.h I2C.h lcd.h main.h rts_chasi.h stroka_u.h timers.h USART.h ADC.c APB.c I2C.c lcd.c main.c rtc_chasi.c stroka_u.c timers.c USART.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...