реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ADC STM32F100C4T6B 7ch, Опрос семи каналов АЦП
Artos5
сообщение Sep 4 2014, 20:21
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613



Доброй ночи уважаемые форумчане! Помогите пожалуйста разобраться.
Хочу опрашивать АЦП (все 7 каналов) за 1-10мс.

Набрел на примеры в интернете , но они только на один канал..
Из доки понял что в инжектированном режиме можно работать сразу с 4 каналами , то есть эти 4 канала будут складывать данные в разные регистры и не затирать другие измеренные каналы АЦП.

Вопрос: какой режим мне лучше использовать? И как настроить чтобы я мог читать данные?

к примеру так:

Код
ch1 = ADC1;
ch2 = ADC2;
ch3 = ADC3;
ch4 = ADC4;
ch5 = ADC5;
ch6 = ADC6;
ch7 = ADC7;



пример нашел такой:

Код
void init_adc()
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// включаем порта А
        RCC_APB2PeriphClockCmd(RCC_APB2ENR_ADC1EN, ENABLE);// включаем модуль АЦП
        ADC1->SMPR2 |= (ADC_SMPR2_SMP1_2 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_0); //Задаем время выборки                                                                                            
        ADC1->CR2 |= ADC_CR2_JEXTSEL; //Преобразование инжектированной группы                                                        
        ADC1->CR2 |= ADC_CR2_JEXTTRIG; //Разрешаем внешний запуск инжектированной группы
        ADC1->CR2 |= ADC_CR2_CONT; //Преобразования запускаются одно за другим
        ADC1->CR1 |= ADC_CR1_JAUTO;
        ADC1->JSQR |= (1<<15); //Задаем номер канала  - ADC1
        ADC1->CR2 |= ADC_CR2_ADON;//Теперь включаем АЦП
        ADC1->CR2 |= ADC_CR2_JSWSTART; //Запуск преобразований
        while (!(ADC1->SR & ADC_SR_JEOC)); //ждем пока первое преобразование завершится
}

int main(void)
{
        init_7leds();
        init_adc();
        while(1)
    {
            adc_res=ADC1->JDR1;
            adc_res = (adc_res * 7300) / 100000;
            set_7led(adc_res);
    }
}

Может кто уже работал в многоканальном режиме, и может тому человеку не жалко будет показать пример кода?
Заранее спасибо за помощь! sm.gif
С уважением Артем.


-----------------------------


Я правильно понимаю?
Что надо прочитать один канал в переменную , потом выключить АЦП , выбрать другой канал АЦП , включить снова преобразование , дождаться завершения преобразования , прочитать содержимое.

Или можно выбирать номер канала не выключая АЦП?
Работал до этого с AVR , поэтому , сейчас неудобно переходить на STM32 ....

Сообщение отредактировал Artos5 - Sep 4 2014, 20:22
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 5 2014, 04:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Artos5 @ Sep 5 2014, 00:21) *
Я правильно понимаю?
Что надо прочитать один канал в переменную , потом выключить АЦП , выбрать другой канал АЦП , включить снова преобразование , дождаться завершения преобразования , прочитать содержимое.
Или можно выбирать номер канала не выключая АЦП?

Можно и нужно сделать так:
Запускаете АЦП на последовательное преобразование N каналов. Настраиваете DMA на кольцевой буфер размером 2*N с генерацией прерываний по заполнению и половинному заполнению. Подбираете тайминги так, чтобы заполнение полукольца происходило за нужные вам 1-10 мс.
Итого: будет вызываться прерывание от DMA, в котором вы сможете получить доступ к массиву данных с АЦП с N каналов. При этом АЦП продолжает молотить во вторую часть кольцевого буфера, т.е. работает непрерывно.
Go to the top of the page
 
+Quote Post
Artos5
сообщение Sep 5 2014, 06:07
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613



Премного вам благодарен за ваш ответ!
Очень непривычно...
А есть у вас практический пример реализации этого?

ПС: По поводу ДМА . Мне надо выделить буфер под массив данных с АЦП 14 слов при использовании 7 входов АЦП. Верно? sm.gif
Получается если я "провтыкаю" , и вовремя не заберу данные , то я или потеряю их или они перемешаются? Верно?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 5 2014, 06:54
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



не верно
у вас АЦП сделат 7 преобразований и положит их в начало буфера (в первую половину), и позовет вас прерыванием, там вы опять запустите преобразование 7 каналов, и начнете забирать первые 7 слов, АЦП тем временем будет фигачить во 2 часть буфера, когда оно их добьет опять будет прерывание, где вы опять запустите АЦП, оно будет заполнять первую половину буфера, а вы забирать вторую...
для того буфер и 2 размера

Если я не ошибаюсь, то АЦП отдолбив 7 каналов остановиться, и вы не запустив его заново, следующие 7 слов не получите...
Go to the top of the page
 
+Quote Post
Artos5
сообщение Sep 5 2014, 06:59
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 124
Регистрация: 21-07-13
Из: Украина, Ахтырка
Пользователь №: 77 613



Теперь понял sm.gif
А скажите, есть у вас практический пример подобной реализации?
А то в теории понятно , а практически как реализовать - ничего не понятно... sm.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 5 2014, 07:39
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(adnega @ Sep 5 2014, 07:44) *
Подбираете тайминги так, чтобы заполнение полукольца происходило за нужные вам 1-10 мс.
... При этом АЦП продолжает молотить во вторую часть кольцевого буфера, т.е. работает непрерывно.

Если процессор будет успевать непрерывно обрабатывать данные, поступающие с периодом 1-10 мс, то ПДП - лишнее звено в цепи.
ПДП полезен только при работе с пачками данных.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 5 2014, 07:50
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Golikov A. @ Sep 5 2014, 10:54) *
Если я не ошибаюсь, то АЦП отдолбив 7 каналов остановиться, и вы не запустив его заново, следующие 7 слов не получите...

И да, и нет. В настройках АЦП есть битик, который заставляет АЦП молотить каналы непрерывно.

Цитата(ViKo @ Sep 5 2014, 11:39) *
Если процессор будет успевать непрерывно обрабатывать данные, поступающие с периодом 1-10 мс, то ПДП - лишнее звено в цепи.

)) так много про что можно сказать.
Если реакция на данные с АЦП не требует промедления, то согласен: нужно заводить на прерывание от АЦП.
Если удобнее за раз обработать данные сразу с 7 каналов, но при этом частота выборок должна быть крайне стабильной, то DMA выручает.

Настройка DMA - это 4 строчки. Надеюсь мы не этого боимся?

F100 не такие толстые камушки, и там где можно решить задачу аппаратно - нужно напрягать периферию (АЦП, таймеры, DMA), а не ядро (CPU).

Из практики: я делал образец рефрактометра на F103 с эквивалентной частотой АЦП 96МГц. Только таймеры, DMA и встроенное АЦП.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Sep 5 2014, 08:05
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(ViKo @ Sep 5 2014, 09:39) *
Если процессор будет успевать непрерывно обрабатывать данные, поступающие с периодом 1-10 мс, то ПДП - лишнее звено в цепи.
ПДП полезен только при работе с пачками данных.

В документации прямо написано, что при использовании ADC в режиме сканирования использование DMA неизбежно. Причина: прерывание "завершение преобразования" от ADC вырабатывается не после преобразования каждого канала, а лишь после полного прохода.
Для автора темы: кое-что обсуждалось здесь: я как раз занимался темой многоканального непрерывного циклического преобразования. Там Сергей Борщ и предложил замечательную идею с буфером 2*N и прерыванием от полузаполнения от DMA, о чем упоминает здесь также и adnega.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 5 2014, 09:04
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(adnega @ Sep 5 2014, 10:44) *
Запускаете АЦП на последовательное преобразование N каналов. Настраиваете DMA на кольцевой буфер размером 2*N с генерацией прерываний по заполнению и половинному заполнению. Подбираете тайминги так, чтобы заполнение полукольца происходило за нужные вам 1-10 мс.

Имхо, частоту опроса лучше регулировать не подбором таймингов, а запуском преобразования АЦП по таймеру. Так мы легко получим любую нужную частоту опроса.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 5 2014, 09:25
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(AHTOXA @ Sep 5 2014, 13:04) *
Имхо, частоту опроса лучше регулировать не подбором таймингов, а запуском преобразования АЦП по таймеру. Так мы легко получим любую нужную частоту опроса.

Если частота преобразований низкая, то без таймера никак. Если на пределе возможностей АЦП (например, 1 МГц), то только таймингами в модуле АЦП.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 5 2014, 09:57
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(KnightIgor @ Sep 5 2014, 11:05) *
В документации прямо написано, что при использовании ADC в режиме сканирования использование DMA неизбежно. Причина: прерывание "завершение преобразования" от ADC вырабатывается не после преобразования каждого канала, а лишь после полного прохода.

Да, у F100 так. А вот у F303 не так.
Цитата
EOC: End of conversion flag
This bit is set by hardware at the end of each regular conversion of a channel when a new data is
available in the ADC_DR register.

DMA дает выигрыш в том, что не тратятся такты на вход - выход в прерывание. А только на вход - выход в прерывание после заполнения буфера DMA. На пределе производительности я тоже применял DMA c прерыванием на половине заполнения.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016