zi4rox 0 10 мая, 2009 Опубликовано 10 мая, 2009 · Жалоба Пытаюсь подключить к 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);)) 3. Временные диаграммы Проэмулировал работу прошивки в VMLAB - вроде всё как в даташите: Диаграмма из ДШ: Диаграмма из VMLAB (передача [00000000 01000000]): * насколько я понял чтение данных происходит по спаду. Признаки жизни При передачи 16 бит конфига: [00000000 01000000] - я говорю АЦП что бы использовался канал #0. Тогда напряжение, подаваемое на CH0 отобразится на ноге AIN - т.е на аналоговом входе. Путем изменения номеров каналов, и подачи постоянного напряжения туда - убедился в том что АЦП распознает конфигурационные 16 бит, и правильно выбирает канал для оцифровки. => оно живое, оно работает, просто вредничает и не хочет оцифровывать мой сигнал Перепробывал уже почти всё, на выходе (ADC_SDOUT) всегда 0 оцифрованных данных. Может кто советом поможет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yod 0 10 мая, 2009 Опубликовано 10 мая, 2009 (изменено) · Жалоба 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; } мне кажется или нет? но ты вываливаешь старшим битом байта вперед, а судя по даташиту надо младшим сделай СПИ аппаратным. оно за тем и сделано читоб таких костылей, что выше, небыло Изменено 10 мая, 2009 пользователем yod Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 11 мая, 2009 Опубликовано 11 мая, 2009 · Жалоба мне кажется или нет? но ты вываливаешь старшим битом байта вперед, а судя по даташиту надо младшим По ДШ (по крайней мере на приведенной диаграмме). DI15 -> SCLK1 (старший - первым) DI1 -> SCLK15 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zi4rox 0 11 мая, 2009 Опубликовано 11 мая, 2009 · Жалоба Переделал на аппаратный SPI и оно заработало. Есть кое какие глюки - но пока работаю над этим, если что не получится - обязательно спрошу. Пока такой вопрос: По даташиту написано что ацп - однополярный, что я могу подавать сигнал в пределах от 0V - AVDD (0-5В) Мне нужно оцифровать переменный сигнал (синус) - как быть в этом случае? Т.е я просто подаю на выход как обычно, главное следить чтобы аплитуда была не более 2.5В ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 11 мая, 2009 Опубликовано 11 мая, 2009 · Жалоба ADC_SDIN = adc_conf_hi & 0b10000000; Может, так: ADC_SDIN = (adc_conf_hi & 0b10000000) != 0; Или присвоение единицы в случае не-нуля для битовых полей автоматически в Вашем компиляторе делается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kool 0 11 мая, 2009 Опубликовано 11 мая, 2009 · Жалоба Мне нужно оцифровать переменный сигнал (синус) - как быть в этом случае Смотря что Вы имеете ввиду под словом "переменный". . Если это сигнал переменного тока (т.е. каждых пол-периода меняется направление тока), то нельзя. В этом случае сигнал нужно "поднимать", т.е. вносить в него постоянную составляющую, равную 1/2 от AVDD (2.5В). И следить. чтобы амплитуда входного сигнала (до "поднятия") не превышала 2,5В . Если меняется только амплитуда сигнала (но не направление тока/полярность), т.е. сигнал однополярный, то можно. главное следить чтобы аплитуда была не более 2.5В ? Для однополярного синуса, "прижатого" к 0, амплитуда равна размаху сигнала, поэтому - не более 5В Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться