Перейти к содержанию
    

Zhekas

Участник
  • Постов

    15
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Zhekas

  • Звание
    Участник
    Участник

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Получил первые спектры с прибора, занимаюсь теперь оптимизацией. А как можно "растянуть" сигнал с выхода матрицы, чтобы вместо 1,5-3,5 В был 0,0-5,0 В? В статье предлагается использовать ОУ в инверсном включении с изменением напряжения на + выводе ОУ. Я такую же схему подключил, однако не смог ее корректно настроить. Может есть какие-либо другие способы? https://hackaday.io/project/18126-dav5-v301-raman-spectrometer/log/53099-using-an-arduino-r3-to-power-the-tcd1304ap-ccd-chip
  2. Разобрался, наконец, с проблемой несколько дней назад... Оказалось все в транзисторе на выходе матрицы. Когда я делал плату, то не проверил реальную цоколевку транзистора, а посчитал по стандарту бкэ. В результате ничего не работало, и я решил подключить матрицу прямо к АЦП. В этом и была проблема. Вычислил это осциллографом, взяв готовый код и Arduino Mega2560. Подключив с транзисторами и резисторами матрицу к моему контроллеру, все сразу заработало. Единственное, что потребовалось несколько циклов вычитки, чтобы вывести матрицу из режима насыщения. Чтобы не вводить людей в заблуждения, конфигурация порта была следующая: PORTB |= (0 << SH) | (1 << FM) | (1 << ICG);
  3. Пробовал поставить сегодня начальное состояние PORTB |= (0 << SH) | (1 << FM) | (1 << ICG); Результат - нуль. Может быть стоит попробовать новую матрицу подключить, поскольку что я не пытаюсь сделать, результат нулевой. Я в самом начале, как только подключил детектор, то перепутал + и - питания. При этом сработала защита блока питания, а матрица слегка нагрелась. Я поменял питания, и нагрев прекратился, но уже столько мучаюсь и безрезультатно... Может она сгореть в этом случае?
  4. Я использую сигналы, которые в бесконечном цикле давали на входе осциллографа сигнал, изменяющийся при затемнении/освещении матрицы. Они - инверсные сигналы даташита. По умолчанию у меня SH = 1, а ICG = 0 и FM = 0; Промерял время повторного срабатывания АЦП в отладчике - 28,7 - 28,8 мкс.
  5. Время конверсии же определяется частотой работы АЦП. В даташите прописано, что требуется 13,5 тактов, чтобы провести преобразования и указана максимальная частота для наилучшего разрешения - 200 кГц. Соответственно время конверсии при этой частоте составит 67,5 мкс. При частоте 1 МГц - 13,5 мкс. Просто я видел, что люди делают спектрометры даже на Arduino, и в этой ветке форума говорили про ATMega, и что встроенного АЦП достаточно. Попробую завтра еще поработать осциллографом с программой в режиме бесконечного цикла и довешивать код на АЦП. Кроме того посмотрю время повторной готовности результата АЦП в прерывании. А какую комбинацию можно использовать для достижения данного адреса? Пробовал LDI + OUT - тоже не работало.
  6. Поработал сегодня над прибором. Запустил таймеры с задержкой 100 нс с использованием оптимизации (до этого запуск был разнесен по программе), а непосредственно АЦП запустил из прерывания таймера на время повтора импульсов SH и ICG. Проверил время повторного прерывания на запуск АЦП - 28,7 мкс, как и должно быть по расчетам. Период FM составляет 1,2 мкс. По расчетам, сканируя каждый шестой пиксель, время запуска АЦП составит 1,2 мкс * 4 * 6 = 28,8 мкс, тут все верно. Расчетное время преобразования АЦП составляет при частоте 5 МГц (завышена для эксперимента) 2,7 мкс, здесь успеваем. Попробую еще раз проверить осциллографиом пины. Без оптимизации кода задержка при включении таймеров составляет 500 нс. Изначально хотел попробовать использовать ассемблерную вставку типа: asm volatile("SBI %0, 0x02" :: "I"(_SFR_IO_ADDR(PORTB))); Но она почему-то упорно отказывается работать с регистром TCCR0A, может кто с таким сталкивался? Плюс заметил, что при запуске программы несколько раз, значения напряжения сильно отличаются. Например, все цифры АЦП или 95 или 580 независимо от локальности засветки.
  7. Сегодня помучал еще прибор, и есть прогресс! Оказалось, что операции написанные на Cи достаточно медленные. Я засек время выполнения операции выключения порта на 20 МГц и оно оказалось 560 нс! Соответственно, до этого у меня были неверно выставлены тайминги. Я это поправил. Теперь матрица реагирует на свет, и даже иногда нужно несколько циклов вычитывания, чтобы на выходе у нее были темновые значения. Но она все равно выдает постоянное значения вне зависимости от локального освещения. Если освещать только часть матрицы, то на выходе напряжение будет одинаковое. Еще имеется один вопрос по поводу начальных логических состояний пинов ICG, SH и FM (до процесса измерения в режиме ожидания). Просто если их выставить в соответствии с даташитом, то ведь матрица будет постоянно интегрировать падающий световой поток...
  8. Нашел одну ошибку: соотношение времен таймеров должно быть 1 к 8, поскольку таймер изменяет состояние порта, а период - это когда сигнал меняется дважды. Теперь матрица иногда выдает какие-то значения, но каждый раз они меняются, иногда даже для пикселей в середине матрицы. На свет детектор по-прежнему не реагирует.
  9. Там я проверял, все должно быть нормально. Такое впечатление, что просто АЦП не попадает в момент выхода сигнала пиксела из матрицы, посколько они появляются в виде узких линий (по осциллографу). Поэтому я и спрашиваю: частота - это время срабатывания таймера по совпадению или период, т.е. удвоенное время таймера? Просто в первом случае соотношение времен таймеров FM/ADC будет 1 к 4, а в другом 1 к 8. У меня сейчас 1 к 4.
  10. Провел еще ряд экспериментов: увеличил время интегрирования до 20 мс, присваивал значения регистров таймеров через переменную, подключал эмиттерный повторитель к матрице и делал принудительный запуск АЦП для его первоначальной инициализации. В результате нуль - матрица как не считывалась, так и не считывается АЦП при однократном измерении. При этом в бесконечном цикле генерирования тактов осциллограф регистрирует изменяющейся выходной сигнал. АЦП тоже нормально работает (меряет напряжение на батарейке верно), и контроллер пересылает верные значения на ПК. Даже уже и не знаю что делать, все идеи закончились... Единственное, что я программировал таймер, отвечающий за тактирование, на 800 кГц, но ведь реальная частота должна быть 400 кГц, если брать период. В тоже время, запуск считывания я программировал на 200 кГц. Может быть, нужно выставить последнее значение на 100 кГц?
  11. Прочитал статью. Там автор использует для генерации сигналов PWM на ICG и SH, используя для этого отдельные таймеры. Я изначально тоже так хотел сделать, однако в моем контроллере один 16 битный таймер, состоящий из 2 частей с общим количеством тактов. По этой причине тяжело настроить их запуск независимо друг от друга, чтобы сделать задержку между ICG и SH, да и время интегрирования будет меняться дискретно с изменением предделителя частоты счетчика (по переполнению). Поэтому на данный момент я остановился на генерации импульса с помощью delay, а импульсы повторяются по совпадению значения счетчика с последующим его сбросом. Хотя я полностью признаю, что генерация сигнала с помощью delay - плохой метод. По поводу АЦП есть идея. Возможно моя проблема связана с периодом повторения сигнала ICG - 1 мс. При этом предыдущий кадр не успевает полностью выйти из матрицы, как начинается следующий. В результате они накладываются друг на друга, и матрица оказывается все время в насыщении, а АЦП меряет не то что нужно. Попробую выставить данный интервал на 20 мс.
  12. Этот код для однократного интегрирования. А до этого были все биты выставлены в нуль (эта часть кода не приведена). А по поводу АЦП спасибо, буду пробовать разбираться. Как я писал выше, дело именно в фиксации данных с помощью АЦП. А delay сделал для теста. Для точной генерации FM я использую таймер 2 в режиме сброса при совпадении и инвертирования состояния пина FM, а для времени интегрирования-таймер 1А в режиме прерывания и сброса при совпадении. Спасибо, почитаю.
  13. Провел ряд экспериментов. При этом, если гонять программу в бесконечном цикле, а результат ловить осциллографом, то вроде все работает, матрица на свет реагирует. Еще заметил, что выходной сигнал, хоть и меняется, имеет весьма малую амплитуду в несколько сотых милливольт. Также определил, что в даташите приведены сигналы в соответствии с описанной там схемой, т.е. инвертированные. Без инвертора сигналы должны быть перевернутые, иначе матрица на свет не реагирует. При попытке однократного запуска интегрирования и измерения выходного сигнала АЦП, то его значения постоянны и не зависят от засветки матрицы. В этом же режиме все сигналы исправно поступают на входы матрицы. Может быть дело в малой величине выходного сигнала, поскольку я подаю сигнал на АЦП прямо с матрицы? Хотя 0.3-0.5 В должно без проблем детектироваться АЦП с ИОН на 5,046 В на разрядностью 10 бит. P.S. верхняя линия - ICG, нижняя - SH.
  14. Попробую в понедельник глянуть на двухканальном осциллографе и доложу результаты. Матрица вообще не реагировала на освещение. Если честно, почитав кучу информации по матрицам, я так и не совсем понял полностью алгоритм, который нужно применить для интегрирования и считывания, и поэтому у меня есть вопросы: 1)Какую диаграмму нужно использовать: на странице 6 или на странице 8? Или на странице 6 приведен больше, чем 1 период сигналов для матрицы? 2)На диаграммах даны исходные сигналы или инверсные, для даташитовской схемы управления? В моем случае контроллер подключен непосредственно к матрице без инвертора. 3)До этого мне удавалось заставить матрицу работать, но сигнал я генерировал постоянно в бесконечном цикле, а к выходу матрицы подключал осциллограф. Не получается именно задать управляющие сигналы и считать результат АЦП. Такое впечатление, что постоянно упускаю какую-то мелочь... Toshiba_TCD1304AP_CCD_array.pdf
  15. Здравствуйте. Пытаюсь заставить работать линейку TCD1304 с микроконтроллером ATMega328, но она не хочет считываться, и АЦП выдает постоянные значения. Использовал следующий код по алгоритму, описанному в этой ветке, на Си: PORTB |= (0 << SH) | (1 << FM) | (1 << ICG); TCCR2B |= (0 << CS22) | (0 << CS21) | (1 << CS20); PORTB &= ~(1 << ICG); _delay_us(0.5); PORTB |= (1 << SH); _delay_us(1); PORTB &= ~(1 << SH); _delay_us(1); PORTB |= (1 << ICG); TCCR0B |= (0 << CS02) | (1 << CS01) | (0 << CS00); while (*point_number_ptr != pix_count - 1) { if (adc_buffer) { array_data[*point_number_ptr] = adc_buffer; adc_buffer = 0; ++(*point_number_ptr); } } Таймер 2 предварительно настроен на частоту 0.8 МГц в режиме CTC с переключением FM. Таймер 0 предварительно настроен на запуск АЦП с частотой (0.8 / 4 / 6) МГц, поскольку хочу запускать АЦП на измерение каждого 6 пиксела. Может, кто сталкивался с подобной проблемой? Уже кучу времени потратил и не могу все никак решить вопрос...
×
×
  • Создать...