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

 
 
> [atmega + tlv1570] Помогите подключить, Не получаю отклика от АЦП
zi4rox
сообщение May 10 2009, 15:30
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 4-04-08
Пользователь №: 36 480



Пытаюсь подключить к ATmega16 и заставить работать внешнее АЦП TLV1570 - появились некоторые затруднения, прошу помочь разобраться

Интерфейс соединения с микроконтроллером - SPI вот с этим я и борюсь.

Исходная информация:

1. Схема подключения:

В даташите структурно это выглядит так:


На деле так:


2. Алгоритм работы и прошивка для МК


Работает данное АЦП следующим образом:
а. Передаем 16 конфигурационных бит с настройками.
б. Передаем 16 конфигурационных бит с настройками и читаем 10 бит результата (то что сконфигурировали в пункте а.)
... и т.д.

Т.е на каждую выборку, я должен отсылать конфигурационную последовательность, и получать свой результат.

* Для оцифровки сигнала на канале 0, с внутренней опорой в 2.3В, мне необходима следующая комбинация битов:
[00000000 01000000] или 0x40h

1. Определения
Код
#define ADC_SCLK  PORTA.0
#define ADC_SDIN  PORTA.1
#define ADC_SDOUT PORTA.2
#define ADC_CS    PORTA.3


2. Функция передачи 16 бит на АЦП
Код
void spi_send (void) {
  char  ctr = 8;
  
  ADC_CS = 1;
  ADC_SCLK = 0;
  ADC_CS = 0;
  
  while (ctr) {
        ADC_SDIN = adc_conf_hi & 0b10000000;
        ADC_SCLK = 1;
        adc_conf_hi <<= 1;
        ADC_SCLK = 0;
        ctr--;
test_sdout = test_sdout + ADC_SDOUT;    
  }
  
  ctr = 8;
  
  while (ctr) {
        ADC_SDIN = adc_conf_low & 0b10000000;
        ADC_SCLK = 1;
        adc_conf_low <<= 1;
        ADC_SCLK = 0;
        ctr--;  
  }
  
  ADC_CS = 1;
  }
}


3. Основная процедура
Код
while (1)
      {
      adc_conf_hi = 0x00;
      adc_conf_low = 0x40;
      spi_send();  
      };


* Состояние ноги ADC_SDOUT (т.е. там где должны появлятся оцифрованные данные) - контролирую по УАРТУ (код посылки состояния ноги в ПК не стал приводить, дабы не загромождать(putchar(ADC_SDOUT)wink.gif)

3. Временные диаграммы

Проэмулировал работу прошивки в VMLAB - вроде всё как в даташите:

Диаграмма из ДШ:


Диаграмма из VMLAB (передача [00000000 01000000]):


* насколько я понял чтение данных происходит по спаду.

Признаки жизни
При передачи 16 бит конфига: [00000000 01000000] - я говорю АЦП что бы использовался канал #0. Тогда напряжение, подаваемое на CH0 отобразится на ноге AIN - т.е на аналоговом входе. Путем изменения номеров каналов, и подачи постоянного напряжения туда - убедился в том что АЦП распознает конфигурационные 16 бит, и правильно выбирает канал для оцифровки. => оно живое, оно работает, просто вредничает и не хочет оцифровывать мой сигнал

Перепробывал уже почти всё, на выходе (ADC_SDOUT) всегда 0 оцифрованных данных. Может кто советом поможет?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
yod
сообщение May 10 2009, 17:59
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 20-10-06
Пользователь №: 21 500



while (ctr) {
ADC_SDIN = adc_conf_hi & 0b10000000;
ADC_SCLK = 1;
adc_conf_hi <<= 1;
ADC_SCLK = 0;
ctr--;
test_sdout = test_sdout + ADC_SDOUT;
}


мне кажется или нет? но ты вываливаешь старшим битом байта вперед, а судя по даташиту надо младшим

сделай СПИ аппаратным. оно за тем и сделано читоб таких костылей, что выше, небыло

Сообщение отредактировал yod - May 10 2009, 18:03
Go to the top of the page
 
+Quote Post
defunct
сообщение May 11 2009, 15:07
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(yod @ May 10 2009, 20:59) *
мне кажется или нет? но ты вываливаешь старшим битом байта вперед, а судя по даташиту надо младшим

По ДШ (по крайней мере на приведенной диаграмме).
DI15 -> SCLK1 (старший - первым)
DI1 -> SCLK15
Go to the top of the page
 
+Quote Post
zi4rox
сообщение May 11 2009, 16:31
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 4-04-08
Пользователь №: 36 480



Переделал на аппаратный SPI и оно заработало. Есть кое какие глюки - но пока работаю над этим, если что не получится - обязательно спрошу.

Пока такой вопрос:

По даташиту написано что ацп - однополярный, что я могу подавать сигнал в пределах от 0V - AVDD (0-5В)
Мне нужно оцифровать переменный сигнал (синус) - как быть в этом случае? Т.е я просто подаю на выход как обычно, главное следить чтобы аплитуда была не более 2.5В ?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 11 2009, 18:21
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Код
ADC_SDIN = adc_conf_hi & 0b10000000;


Может, так:

Код
ADC_SDIN = (adc_conf_hi & 0b10000000) != 0;


Или присвоение единицы в случае не-нуля для битовых полей автоматически в Вашем компиляторе делается?
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение May 11 2009, 20:57
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата
Мне нужно оцифровать переменный сигнал (синус) - как быть в этом случае

Смотря что Вы имеете ввиду под словом "переменный".
. Если это сигнал переменного тока (т.е. каждых пол-периода меняется направление тока), то нельзя. В этом случае сигнал нужно "поднимать", т.е. вносить в него постоянную составляющую, равную 1/2 от AVDD (2.5В). И следить. чтобы амплитуда входного сигнала (до "поднятия") не превышала 2,5В
. Если меняется только амплитуда сигнала (но не направление тока/полярность), т.е. сигнал однополярный, то можно.
Цитата
главное следить чтобы аплитуда была не более 2.5В ?

Для однополярного синуса, "прижатого" к 0, амплитуда равна размаху сигнала, поэтому - не более 5В
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 16:08
Рейтинг@Mail.ru


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