0 / 0 / 0
Регистрация: 03.06.2016
Сообщений: 39
1

АЦП ADS7816

22.06.2017, 17:47. Показов 3007. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую!

Кто-нибудь имел дело с 12-разрядным АЦП от TI ADS7816? На днях взял в ЧиДе. Общаюсь с ним по SPI с контроллером. В общем, по дате в нём обещают 200 кГц сэмплинг при 3,2 МГц такта. То есть весь сэмпл разбивается на 16 тактов. Я тактирую от 2 MГц. Логично, что сэмпл должен быть 125 кГц, но по осциллографу получается около 52 (сэмпл ~ 38 тактов). При этом по мере уменьшения частоты тактирования сэмпл также уменьшается: на 1 МГц ~ 27 тактов, на 500 кГц ~ 21 такт, что явно противоречит дате, где сэмпл должен быть постоянным (16 тактов). Питание + опорка = 5 В, никаких границ по температуре и прочее не перехожу - всё в рамках нормальной работы. В чём может быть дело? Возможно, какая-то поддельная микруха? Подозреваю, что эти чиповские волки меня надули...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2017, 17:47
Ответы с готовыми решениями:

АЦП замена АЦП в AVR
Перешёл с AVR на STM32. И вот столкнулся с проблемой. Как подключить датчики с выходом 0-5В на АЦП...

АЦП и ОУ
Привет. Делаю стабилизатор тока. Сейчас собрал небольшой тестовый "стенд" и пробую свое изваяние....

АЦП
Добрый день господа) Проблема с измерением напряжения через делитель и АЦП. Если просто замерить...

АЦП
помогите перевести из структурной в принципиальную схему

4
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
22.06.2017, 18:33 2
Я что-то считать не умею. У них на графиках 15 тиков (или 14?), но никак не 16. Если дать лишний тик, то ADC переходит в power down (рисунок внизу стр. 9).
0
0 / 0 / 0
Регистрация: 03.06.2016
Сообщений: 39
22.06.2017, 20:04 3
Да, это так, но если я правильно понимаю, то мне нужно подать 16 тактов, так как регистр SPDR у ATmega 8-битный, чтобы считать всю информацию (12 бит). А после этого я уже сам поднимаю ножку CS вверх. Или получается, что она выставляется аппаратно? То есть, если я подаю 16 такт, то я не могу сразу оборвать передачу, подняв CS, а должен ждать время Tdata? М-да... а как же тогда запустить первый режим? Или на ATmega это невозможно?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
22.06.2017, 20:34 4
Сделайте программный SPI, отладьте интерфейс с ADS7816, потом уж видно будет. ;)
0
0 / 0 / 0
Регистрация: 03.06.2016
Сообщений: 39
10.07.2017, 17:56 5
В общем, после организации мной программного SPI скорость упала почти в три раза... но дело даже не в этом. Самое главное для меня - фиксировать точное время преобразования, т.к. я потом строю спектр сигнала на компьютере по результатам работы этого АЦП. Само время я определяю с помощью встроенного ТС, работающего на частоте 1 МГц (контроллер работает на 8 МГц). Проблема в том, что время получается разное в зависимости от подаваемого на АЦП сигнала. Так, при подаче всех единиц время преобразования составляет 59 мкс, а при нулях - 63 мкс, т.е. с уменьшением напряжения преобразования растёт его время. Это, конечно, не так критично, учитывая небольшое отличие, но я не понимаю, почему это вообще происходит.

Функция общения с АЦП:

Код
unsykned int spi_adc()
{
spi_stort();
spi_read();

return data;
}
Функция spi_stort, где и происходит запуск таймера:

Код
void spi_stort()
{
data = 0;
DCLC_0;
smpl ? sample_rate_off() : sample_rate_on();
CS_0;
TIME_2;
}
При первом вызове функции spi_adc условие smpl ? - ложно => входим в sample_rate_on, где делаем условие smpl ? истинным и включаем таймер, который будет вырублен при последующем вызове spi_adc, т.е. при записи второго элемента в массив всего сигнала. TIME_2 - два первых тактирования АЦП для его запуска.

Функция spi_read, где происходит сбор данных программного SPI:

Код
void spi_read()
{
do
{
DCLC_1;
DCLC_0;
spi_b++;
data <<= 1;

if ((PINB & 0b01000000) == 0b01000000) data++;
else spam++;
}
while (spi_b < 12);

TIME_15;
NOPx3;
CS_1; MISO_1;
spi_b = 0;
}
DCLC_1 и 0 - тактирование, TIME_15 - завершающий 15-й такт,

NOPx3:

Код
#defyme NOPx3      asm volatile("nop\n" "nop\n" "nop")
Действие spam++ введено для одинаковой длительности цикла if. Если использовать вместо spam++ ассемблеровский nop, то почему-то получается большая разность между преобразованием всех единиц и нулей (около 8 мкс).

Пробовал ставить задержки между тактированиями на случай, если микросхема не успевает за контроллером - всё безрезультатно... дельта сохраняется. В чём может быть дело?

Вопрос: как добиться одинакового времени преобразования нулевого сигнала и сигнала, равного опорному напряжению?
0
10.07.2017, 17:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2017, 17:56
Помогаю со студенческими работами здесь

Помогите с АЦП
Добрый день, Подключаю к ноге МК датчик освещённости BH1603. На схеме это линия IOUT (см.файл), C1...

ЦАП И АЦП
Цифро-аналоговый преобразователь и аналого-цифровoй преобразователь относятся ли они к цифровой...

АЦП Тини13
Есть желание сделать вольтметр на шаговом двигателе. Безотносительно чего-либо, просто сферический...

АЦП ЦАП
Разрабатываю АЦП последовательного приближения использую ЦАП 1108ПА1АРН. И регистр К155ИР17. ...

АЦП <=> USB
Здравствуйте! Подскажите пожалуйста, каким образом можно сигнал с АЦП передать по USB 2.0...

АЦП на Меге48
Направляю свой вопрос в раздел &quot;Детские&quot; и оно наверно правильно, однако меня эта тема задрала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru