Все пучком, работает...
Изменение входного напряжения от 0 до U оп. (3.3в) дает изменение 0x0000...0x03ff на выходе АЦП... типичный униполярный 10 битный АЦП...
Обработчик прерывания выглядит у меня так:
Вроде, уже школьник знает, что никаких cpu_relax в перывании быть не должно... тем более для ожидания медленного устройства, коим является ADC... обработчик прерывания должен пролетать мухой... чего я и добился, изменив логику...
Вот так еще удобно смотреть в реалтайм на работу АЦП:
Опора, если взята с внутреннего LM1086 будет 3.267...3.333 в, т.е. ~3.3 в
p.s. по-хорошему АЦП нужен отдельный прецезионный источник опорного напряжения... иначе несколько бит будут просто недостоверными... как у китайского тестера, последний знак, а иногда и два - нужно заклеить, чтобы не вводили в заблуждение... ...отображаемые там цифры не имеют никакого отношения к реальной измеряемой величине...
Кстати, на AT91SAM7X я несколько по-другому делал чтение с ADC...
АЦП SAM'ов (и 9260 тоже) может работать с автозапуском от таймера, обработчик прерывания упрощается - руками толкать и проверять наличие данных в регистре - уже нет необходимости... первое происходит само, без второго не произойдет прерывание... и "дрожание" момента выборки не происходит, т.к. больше не зависит от выполняемого кода...
А еще можно DMA запустить на ADC... вообще процессор освобождается... вот только, хоть убейте меня, я не понимаю КАК разделить данные разных каналов при DMA ??? Никому такая хитрость не удавалась ?
Опорное на месте - 3.3 В (если идти со стороны красной кнопки на J1- пусто, перемычка х2), вход ацп - PC0 (26 пин на Х1) - ацп не реагирует.
я делаю с дма - систему вообще не грузит, только одни ноли валятся вместо данных :) единственное - я делаю на ядре 2.6.28.1, там есть небольшие изменения по структуре исходников по сравнению с 2.6.24, в драйвере с at91.com я только пути к инклудам поменял... возможно в инклудах гд-то ошибка закралась , но это уже фантастика :) вообще непонятно - на пустом месте споткнулся с этим ацп...
а разве они не друг за другом идут ? 0,1,2,3,0,1,2,3 итд ? да и на нашей плате только два канала физически доступно - 0,1. остальные доступны только в bga корпусе. К тому же канал 1 совпадает с pck0 который у меня используется для аудиокодека - так что мне без вариантов только 1 канал....
Так, метод последовательного приближения... время измерения зависит от измеряемого напряжения... кто из них будет первым - непредсказуемо... а DMA сработает на того, кто первый дернет прерывание... когда один "готов", второй может еще быть "в процессе"...
Взять можно все данные, непонятно где чьи...
Насколько я понял измерения идут последовательно и канал переключается только после окончания измерения предыдущего, хотя опыта у меня с этими процессорами нет - может и ошибаюсь.
Насколько я знаю (поправьте, если я где-то ошибаюсь):
1. Каналы все стартуют хором, руками по ADC_CR/STRT либо сигналом от ADTRG (таймер, внешний вход и т.д.)
2. Преобразование происходит параллельно по всем каналам (??? не уверен.. не стыкуется с блок-схемой, но стыкуется с моими наблюдениями..)
3. Время измерения разное, кто будет первым - случайность ( ??? стыкуется с моими наблюдениями и принципами работы такогго ADC...)
4. Данные выдаются в общий регистр данных ADC_LCDR в порядке поступления, в нем предыдущие не взятые данные затираются текущими... (есть еще и персональные регистры для каждого канала ADC_CDR0..3)
5. DMA работает с ADC_LCDR и поэтому не может знать с какого канала данные.
Если я не прав и удастся гнать через DMA >1 канала... с меня море пива... А если еще и разные каналы с разной частотой дискретизации (мне через 1 канал звук гнать надо ~12 кГц, через остальные ~1..10 Гц)... Будет Даз ист фантастиш !!!
Посмотрим... может и в BGA дальше все будет строится... Хотя мне быстрый только 1 канал нужен, а из второго сделаем хоть 8, хоть ..дцать... аналоговых мультиплексоров кругом в изобилии...
Не могу ничего возразить - я даже один канал не могу запустить с готовым рабочим драйвером :) Но в пользу моей версии говорит прогрммируемый параметр Sample and Hold Clock cycles - какой в нем смысл если все данные будут попадать в LCDR беспорядочно как только в одном из каналов будут готовы данные ?