Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-июл-20 10:03

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-17 17:48 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
Пытаюсь разобраться с ∑ΔАЦП в 1986ВЕ4У. Сразу вопрос почему нет нормального описания на этот АЦП? На 12-битный АЦП последовательного приближения - есть, а на ∑ΔАЦП нет.

Далее. Имеется такой код:

Код:
//-Настройки тактирования----------------------------------------------------------------------------------------
MDR_RST_CLK->HS_CONTROL = RST_CLK_HS_CONTROL_HSE_ON;                 // Включение генератора HSE.
   
while (!(MDR_RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_RDY)); // Пока осциллятор HSE не вышел в рабочий режим, выполнять пустой оператор.

/*...*/

MDR_RST_CLK->ADC_MCO_CLOCK = ((8 << RST_CLK_ADC_MCO_CLOCK_ADCIU_C3_SEL_Pos) | // Частота ADCIU CLK = 4 MHz.
                              (1 << RST_CLK_ADC_MCO_CLOCK_ADCIU_CLK_EN_Pos)); // Разрешение выдачи тактовой частоты ADCIU CLK.

MDR_RST_CLK->PER2_CLOCK |=  RST_CLK_PER2_CLOCK_PCLK_EN_ADCIU;

//-Настройка сигма-дельта АЦП------------------------------------------------------------------------------

MDR_ADCIU->CTRL2   = 0x0;
MDR_ADCIU->DIGGAIN = 0x2A;             // Цифровое усиление каналов 0 дБ.

MDR_ADCIU->INTEN   = ADCIU_INTEN_NSM1;
NVIC_EnableIRQ(ADCIU_CH1_IRQn);

MDR_ADCIU->CTRL1   = ADCIU_CTRL1_ADC1EN; // Разрешение работы соответствующих каналов;
                                         // Выбор источника опорного напряжения – внутренний источник 1,2 В.
//---------------------------------------------------------------------------------------------------------


На вывод INP1 подается +1 В, вывод INN1 соединен с землей. При отладке, после инициализации программа выполняет функцию обработки прерывания NVIC_EnableIRQ, где я читаю значение в регистре отсчета ADC1 F1DAT. После чего программа не выходит из функции обработки прерывания, а начинает исполнять ее заново. При этом меняется значение в регистре отсчета ADC1 F1DAT. Также меняются значения всех остальных регистров отсчета произвольным образом. Сброс флага прерывания не работает (не важно что писать 0 или 1). Сама функция NVIC_EnableIRQ:

Код:
void ADCIU_CH1_IRQHandler ()
{

if(MDR_ADCIU->STAT == ADCIU_STAT_NS1)
  MDR_ADCIU->STAT = ADCIU_STAT_NS1;


Pressure = MDR_ADCIU->F_DAT[1]; // Чтение отсчета ADC1.
   
}


В чем проблема? И где найти описание на этот АЦП?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-18 16:20 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 666
Откуда: г. Санкт-Петербург
Alexey9891 писал(а):
Пытаюсь разобраться с ∑ΔАЦП в 1986ВЕ4У.
...

Pressure = MDR_ADCIU->F_DAT[1]; // Чтение отсчета ADC1.

В чем проблема? И где найти описание на этот АЦП?

По моему Вы читаете не первый канал, а второй.
В вашем случае д.б.
Pressure = MDR_ADCIU->F_DAT[0]; // Чтение отсчета ADC1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-19 08:24 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
Спасибо за ответ. Остается только вопрос почему программа постоянно выполняет функцию обработки прерывания NVIC_EnableIRQ, это АЦП такой быстрый, что прерывания постоянно сыплются? И почему значение в регистре отсчета ADC1 F1DAT при постоянном напряжении на входе АЦП так сильно меняется: 0xACBAAA, 0xACB99A, 0xACBDFE, 0xACBF08 и т.д. Почему если я настроил только один канал АЦП, во всех регистрах отсчета (для всех каналов) меняются значения? Так и должно быть?

А вот эта строчка сбрасывает событие прерывания или нет?:
if(MDR_ADCIU->STAT == ADCIU_STAT_NS1)
MDR_ADCIU->STAT = ADCIU_STAT_NS1;
В отладчике этого не видно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-19 08:27 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
И где почитать описание на этот ∑ΔАЦП? А то работа строится по методу "научного тыка".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-19 08:55 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 666
Откуда: г. Санкт-Петербург
Alexey9891 писал(а):
Спасибо за ответ. Остается только вопрос почему программа постоянно выполняет функцию обработки прерывания NVIC_EnableIRQ...

По моему мнению исходя из описания регистров для сброса прерывания ADCIU_INTEN_NSM1 требуется очистить буфер FIFO F_DAT[0].
Поскольку Вы читаете F_DAT[1] вместо F_DAT[0], прерывание не сбрасыватся .
Команда
MDR_ADCIU->STAT = ADCIU_STAT_NS1;
в описании не предусмотрена, поэтому никакого смысла не имеет.
Следует иметь ввиду, что при работе с отладчиком когда через отладчик идет обращение к регистрам периферии, чтение которых (F_DAT[n]) влияет на сброс флагов (прерываний) ход выполнения программы может отличаться от реального.
В этом случае советую просматривать значения регистров через буферные переменные в ОЗУ.

P.S.
На вывод INP1 подается +1 В, вывод INN1 соединен с землей
Такой режим работы не регламентирован. См. требование к синфазному сигналу на входах АЦП.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-19 09:16 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
vasili писал(а):
Поскольку Вы читаете F_DAT[1] вместо F_DAT[0], прерывание не сбрасыватся .
Команда
MDR_ADCIU->STAT = ADCIU_STAT_NS1;
в описании не предусмотрена, поэтому никакого смысла не имеет.


Я исправил F_DAT[1] на F_DAT[0], но ничего не поменялось. А как должно сбрасываться прерывание, если я использую первый канал (читаю из F_DAT[0])? Так? : MDR_ADCIU->STAT = ADCIU_STAT_NS1;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-19 09:21 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 666
Откуда: г. Санкт-Петербург
Попробуйте такой обработчик:

void ADCIU_CH1_IRQHandler ()
{
if(MDR_ADCIU->STAT == ADCIU_STAT_NS1)
Pressure = MDR_ADCIU->F_DAT[0]; // Чтение отсчета ADC1.
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-19 11:36 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 666
Откуда: г. Санкт-Петербург
Alexey9891 писал(а):
vasili писал(а):
Поскольку Вы читаете F_DAT[1] вместо F_DAT[0], прерывание не сбрасыватся .
Команда
MDR_ADCIU->STAT = ADCIU_STAT_NS1;
в описании не предусмотрена, поэтому никакого смысла не имеет.


Я исправил F_DAT[1] на F_DAT[0], но ничего не поменялось. А как должно сбрасываться прерывание, если я использую первый канал (читаю из F_DAT[0])? Так? : MDR_ADCIU->STAT = ADCIU_STAT_NS1;

Попробовал ваш код на отладочной плате (добавил в обработчик прерываний изменение на выводе PA11(светодиод))
Осциллографом на PA11 вижу меандр с периодом 128 мкс (период прерываний - 64мкс), что соответствует вашим настройкам.
Наличие (отсутствие) команд
MDR_ADCIU->STAT = ADCIU_STAT_NS1;
Pressure = MDR_ADCIU->F_DAT[0];
в обработчике никак! не сказывается на период формирования прерываний. таким образом можно предположить, что
прерывания сбрасываются автоматически при каждом входе в обработчик.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-19 16:25 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
vasili писал(а):
P.S.
На вывод INP1 подается +1 В, вывод INN1 соединен с землей
Такой режим работы не регламентирован. См. требование к синфазному сигналу на входах АЦП.


Синфазные сигналы — это сигналы, совпадающие друг с другом в каждой своей точке.

Cинфазное напряжение, В: от 0,5×UCCA-0,1 до 0,5×UCCA + 0,1.

Даже если посчитать: от 0,5*3,3-0,1 до 0,5*3,3-0,1 = от 1,55 В до 1,65 В. Что это мне дает? Я на вывод INP1 подаю +1 В, вывод INN1 соединен с землей. Сигналы вообще постоянные. Причем тут это вообще?

Я хочу использовать этот АЦП как НЕдифференциальный. Хочу оцифровать этот +1 В.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-19 17:42 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 666
Откуда: г. Санкт-Петербург
Alexey9891 писал(а):
vasili писал(а):
P.S.
На вывод INP1 подается +1 В, вывод INN1 соединен с землей
Такой режим работы не регламентирован. См. требование к синфазному сигналу на входах АЦП.


Синфазные сигналы — это сигналы, совпадающие друг с другом в каждой своей точке.

Cинфазное напряжение, В: от 0,5×UCCA-0,1 до 0,5×UCCA + 0,1.

Даже если посчитать: от 0,5*3,3-0,1 до 0,5*3,3-0,1 = от 1,55 В до 1,65 В. Что это мне дает? Я на вывод INP1 подаю +1 В, вывод INN1 соединен с землей. Сигналы вообще постоянные. Причем тут это вообще?

Я хочу использовать этот АЦП как НЕдифференциальный. Хочу оцифровать этот +1 В.

Применительно к 1986ве4 синфазное напряжение это (U(INP1) + U(INN1))/2 и должно лежать в диапазоне от 1,55 В до 1,75 В.
В вашем случае синфазное напряжение = 0,5 В, что противоречит документации.
использовать этот АЦП как НЕдифференциальный скорее всего не получится
Все это уже активно обсуждалось на форуме в других темах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-20 08:59 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
Спасибо, разъяснили.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-29 20:13 
Не в сети

Зарегистрирован: 2015-сен-22 15:32
Сообщения: 12
vasili писал(а):
Применительно к 1986ве4 синфазное напряжение это (U(INP1) + U(INN1))/2 и должно лежать в диапазоне от 1,55 В до 1,75 В.
В вашем случае синфазное напряжение = 0,5 В, что противоречит документации.


vasili, Вечер добрый!
Подскажите, пожалуйста, хочу оцифровать, например, 0.7В. Как правильно подать эти 0.7 вольт на вход ∑ΔАЦП ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-ноя-29 22:05 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 666
Откуда: г. Санкт-Петербург
EvgenyK писал(а):
vasili писал(а):
Применительно к 1986ве4 синфазное напряжение это (U(INP1) + U(INN1))/2 и должно лежать в диапазоне от 1,55 В до 1,75 В.
В вашем случае синфазное напряжение = 0,5 В, что противоречит документации.


vasili, Вечер добрый!
Подскажите, пожалуйста, хочу оцифровать, например, 0.7В. Как правильно подать эти 0.7 вольт на вход ∑ΔАЦП ?

на вход U(INP1) подать 2.0 В, на вход U(INN1)- 1.3 В.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-дек-16 15:01 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
А кто-нибудь сможет объяснить как работает этот ∑ΔАЦП?

К примеру, на вход INP1 подаю напряжение 1,7 В, а на вход INM1 1,6 В. АЦП находит разность (дифференциальное напряжение): 1,7 - 1,6 = 0,1 В. Далее АЦП сравнивает полученные 0,1 В с опорным напряжением 1,2 В.

Т. к. напряжение на INP1 больше чем на INМ1, то 24-й бит (бит определяющий знак числа) в регистре F1DAT станет равным 0. Остальные 23 бита регистра F1DAT будут содержать код соответствующий напряжению 0,1 В при опорном напряжении 1,2 В.

Если на вход INP1 подаю напряжение 1,6 В, а на вход INM1 1,7 В. АЦП находит разность (дифференциальное напряжение): 1,6 - 1,7 = -0,1 В. Т. к. напряжение на INP1 меньше чем на INМ1, то 24-й бит (бит определяющий знак числа) в регистре F1DAT станет равным 1. Остальные 23 бита регистра F1DAT будут содержать ДОПОЛНИТЕЛЬНЫЙ код соответствующий напряжению -0,1 В при опорном напряжении 1,2 В. Т.е. когда INP1 < INM1, то в регистре F1DAT (в 24-х битах) будет находиться отрицательное число в дополнительном коде.

ДОПЛНИТЕЛЬНЫЙ - это вот в этом смысле: https://ru.wikipedia.org/wiki/%D0%94%D0 ... 0%BB%D0%B0)
Правильно ли я рассуждаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ∑ΔАЦП в 1986ВЕ4У
СообщениеДобавлено: 2015-дек-17 10:59 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
vasili писал(а):
EvgenyK писал(а):
vasili писал(а):
Применительно к 1986ве4 синфазное напряжение это (U(INP1) + U(INN1))/2 и должно лежать в диапазоне от 1,55 В до 1,75 В.
В вашем случае синфазное напряжение = 0,5 В, что противоречит документации.


vasili, Вечер добрый!
Подскажите, пожалуйста, хочу оцифровать, например, 0.7В. Как правильно подать эти 0.7 вольт на вход ∑ΔАЦП ?

на вход U(INP1) подать 2.0 В, на вход U(INN1)- 1.3 В.


А почему именно такие значения напряжений? Как вы их рассчитали? Может так:

Питание МК 3,3 В. Необходимо выполнять симметрирование сигналов на входе АЦП относительно половины питания МК, т.е. 1,65 В. Далее, 1,65 + (0,7/2) = 2 В, потом 1,65 - (0,7/2) = 1,3 В.

Мои рассуждения правильные?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB