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

 
 
> 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
 
Start new topic
Ответов
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
ViKo
сообщение Sep 5 2014, 07:39
Сообщение #3


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

Группа: Модераторы
Сообщений: 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
KnightIgor
сообщение Sep 5 2014, 08:05
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 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
ViKo
сообщение Sep 5 2014, 09:57
Сообщение #5


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

Группа: Модераторы
Сообщений: 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 - 02:32
Рейтинг@Mail.ru


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