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

 
 
> stm32 АЦП в инжекторном режиме
anubis
сообщение Oct 25 2013, 13:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 14-01-06
Пользователь №: 13 178



На stm32f107 нужно заюзать второй ADC, первый сейчас используется в регулярном режиме:
В основном коде включаю порт А:
Код
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);


Код
void AdcInit(void)
{
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;    // Разрешить тактирование порта PORT A
  //Конфигурирование PORT PA.3 - аналоговый вход
  GPIOA->CRL   &= ~GPIO_CRL_MODE3;       //Очистить биты MODE
  GPIOA->CRL   &= ~GPIO_CRL_CNF3;        //Очистить биты CNF

  RCC->APB2ENR |=  RCC_APB2ENR_ADC1EN;   //подаем тактирование АЦП
  RCC->CFGR    &= ~RCC_CFGR_ADCPRE;      //входной делитель
  ADC1->CR1     =  0;                    //
  ADC1->SQR1    =  0;                    //
  ADC1->CR2    |=  ADC_CR2_CAL;          //запуск калибровки
  while (!(ADC1->CR2 & ADC_CR2_CAL)){};  //ждем окончания калибровки
  ADC1->CR2     =  ADC_CR2_EXTSEL;       //выбрать источником запуска разряд  SWSTART
  ADC1->CR2    |=  ADC_CR2_EXTTRIG;      //разр. внешний запуск регулярного канала
  ADC1->CR2    |=  ADC_CR2_CONT;         //режим непрерывного преобразования

  /* Задаем длительность выборки */
    ADC1->SMPR2 |= (ADC_SMPR2_SMP4_2 | ADC_SMPR2_SMP4_1 | ADC_SMPR2_SMP4_0);

  ADC1->SQR3    =  3;                    //загрузить номер канала
  ADC1->CR2    |=  ADC_CR2_ADON;         //включить АЦП
  ADC1->CR2    |=  ADC_CR2_SWSTART;      //запустить процес преобразования
}

А вот подключить второй АЦП и заставить его работать в инжекторном режиме не получается.
Нужно считывать периодически 4 канала (на каждый подключено Vcc через кнопки), таким образом с АЦП по каждому каналу нужно проверять есть ли Vcc или нет.
Вот код для инициализации АЦП2:

Код
void AdcInjInit(void)
{
    RCC->APB2ENR |=  RCC_APB2ENR_ADC2EN;   //подаем тактирование АЦП
      RCC->CFGR    &= ~RCC_CFGR_ADCPRE;      //входной делитель
      ADC2->CR1     =  0;                    //предочистка регистра
      ADC2->CR2    |=  ADC_CR2_CAL;          //запуск калибровки
      while (!(ADC2->CR2 & ADC_CR2_CAL)){};  //ждем окончания калибровки
      ADC2->CR2     =  ADC_CR2_JEXTSEL;      //выбрать источником запуска разряд  JSWSTART
      ADC2->CR2    |=  ADC_CR2_JEXTTRIG;     //разр. внешний запуск инжектированной группы
      ADC2->CR2    |=  ADC_CR2_CONT;         //режим непрерывного преобразования
      ADC2->CR1    |=  ADC_CR1_SCAN;         //режим сканирования (т.е. несколько каналов)
      ADC2->CR1    |=  ADC_CR1_JAUTO;  //автомат. запуск инжектированной группы
      ADC2->JSQR    =  (uint32_t)(4-1)<<20;  //задаем количество каналов в инжектированной группе
      ADC2->JSQR   |=  (uint32_t)10<<(5*0);   //номер канала для первого преобразования (10)
      ADC2->JSQR   |=  (uint32_t)11<<(5*1);   //номер канала для второго преобразования (11)
      ADC2->JSQR   |=  (uint32_t)12<<(5*2);   //номер канала для третьего преобразования
      ADC2->JSQR   |=  (uint32_t)13<<(5*3);   //номер канала для четвертого преобразования
      ADC2->CR2    |=  ADC_CR2_ADON;         //включить АЦП
      ADC2->CR2    |=  ADC_CR2_JSWSTART;     //запустить процес преобразования
}


и забираю таким способом:

Код
     short  adc_btn1 = ADC2->JDR1;
     short  adc_btn2 = ADC2->JDR2;
     short  adc_btn3 = ADC2->JDR3;
     short  adc_btn4 = ADC2->JDR4;

Но на выходе почему то всегда значения 25-28 в не зависимости от нажатия кнопок.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
fatlortroll
сообщение Oct 28 2013, 09:33
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934



Цитата
Нужно считывать периодически 4 канала (на каждый подключено Vcc через кнопки), таким образом с АЦП по каждому каналу нужно проверять есть ли Vcc или нет


Я правильно понял, что для определения, единица на входе, или ноль, используется АЦП? Если да, то это уж очень явный overengineering. Не проще ли инициализировать ноги, как входы, с подтяжкой к земле встроенными резисторами (PullDown), и считывать уже их состояние?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 28 2013, 09:52
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(fatlortroll @ Oct 28 2013, 13:33) *
Бывает и такое...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
fatlortroll
сообщение Oct 28 2013, 09:55
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934



Цитата(demiurg_spb @ Oct 28 2013, 13:52) *
Бывает и такое...

Всё же, хотелось бы услышать непосредственно от автора, какую задачу он решает. Может, действительно её возможно реализовать заметно проще.
Go to the top of the page
 
+Quote Post
anubis
сообщение Oct 30 2013, 09:58
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 14-01-06
Пользователь №: 13 178



Цитата(fatlortroll @ Oct 28 2013, 13:55) *
Всё же, хотелось бы услышать непосредственно от автора, какую задачу он решает. Может, действительно её возможно реализовать заметно проще.

Да нужно определять нажата ли кнопка или нет.
Если есть способ более оптимальный буду благодарен за совет
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 31 2013, 05:28
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(anubis @ Oct 30 2013, 13:58) *
Какая схема включения кнопок и сколько их?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 23:32
Рейтинг@Mail.ru


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