Help! Пишу программу для платы АЦП посредством библиотеки bcm2835

Тема в разделе "Raspberry Pi", создана пользователем Просто Вася, 28 ноя 2018.

  1. Здравствуйте. Некоторое время назад приобрел плату расширения для малины High precision AD/DA китайской фирмы Waveshare: https://www.waveshare.com/high-precision-ad-da-board.htm
    К ней же прилагался код на Си, в котором для работы с микросхемой (ADS1256) и основными шинами используются функции библиотеки bcm2835:
    https://www.waveshare.com/wiki/File:High-Precision-AD-DA-Board-Code.7z (китайский кодъ)
    http://www.airspayce.com/mikem/bcm2835/index.html (библиотека)
    http://www.airspayce.com/mikem/bcm2835/spi_8c-example.html (пример кода для приема/передачи по SPI).
    Слегка модернизированным китайским кодом я пользовался довольно долго, но он много жрет ресурсов малины (да и сам по себе довольно запутанный), я решил недавно свой код написать, с помощью той же библиотеки и с опрой на мануал на микросхему: https://www.ti.com/lit/ds/symlink/ads1256.pdf
    И написал. Вроде, получаю какие-то данные по SPI (см. первый рисунок). Но микросхема выдает совсем не те данные, что должна, согласно даташиту! (рисунок 2)
    Кручу, значит, потенциометр, установленный на плате, от 0 до 5 вольт напряжение на нем изменяю. Должны быть значения:
    - от 0x000000 до 0x7FFFFF;
    Я же получаю:
    - на 0В что-то около 0xE1E02C, на 2.5В - ровно 0xFFFFFF, после 2.5В - 0x000000 ... 0x1CDE58 (опять же, примерно). То бишь, примерно 2 млн отсчетов в одну и другую сторону от 2.5В
    Тоже самое и с синусоидой с генератора (+-100 мВ 0.1 Гц - рисунок 3) - в момент перехода в отрицательную область этого самого перехода не происходит. Проверял на двух разных платах АЦП и разных малинах.

    Кто работает с данной платой или с библиотекой bcm2835, может ли кто-нибудь подсказать, что я делаю не так? Буду вам чрезвычайно признателен.
     

    Вложения:

  2. Daniil

    Daniil Гуру

    1. Диапазон входных напряжений не должен выходить за рамки agnd - avdd (более точно надо смотреть в даташит). (это к вопросу о синусоиде).
    2. Схема включения у вас есть? Что подается на Vref+, Vref- и Aincom?
    3. Микросхему нужно конфигурировать. Как по скорости (выше скорость=меньше точность) так и диф. пару. Эта микросхема может мерить напряжение между AINx - AINy и AINx - AINCOM
    4. Так же микросхема имеет нелинейность на крайних значениях, постоянный сдвиг в середине диапазона и встроенную калибровку. (это на будущее).
    5. Могу ошибаться. (не могу подтвердить слова сейчас). Табличка, которую вы выложили написана относительно Vref+, а не нуля вольт. Не думаю, что он может мерить напряжение менее agnd. Про постоянный сдвиг на vref у меня возникает из-за младшего брата ацп - ad7714. Посмотрите главу про одно/двухполярный сигнал. Мне кажется в вашем случае всегда включен режим "двухполярного" сигнала. (относительно vref!)
    6. Потенциометр какого номинала? Буфер включен? Входное сопротивление зависит от буфера, вы можете вторую часть потенциометра просто шунтировать входом ацп - показания искажаются. Для проб последовательно с входом ацп я бы поставил резистор по-больше. Но для точных измерений надо знать что измерять заранее и, соответственно, городить входную цепь. (чем больше сопротивление, тем больше теплового шума).
    7. И надо ждать прежде чем запрашивать данные.
    8. У собрата, которого я привел в пример выше, при переключении мультиплексора приходилось 2 раза запускать процесс отцифровки. Иначе он выдавал новый код со предыдущего канала, хотя ожидалось, что переключение произошло.
     
    Последнее редактирование: 28 ноя 2018
  3. 1. Согласно даташиту, диапазон входных напряжений: - 2Vref / PGA ... + 2Vref / PGA. Честно, не особо вдавался в подробности, как оно работает. Китайскый код, о котором говорил ранее, рабочий, просто там много ненужной мишуры. А так... сигналы любой полярности оцифровывались с его помощью спокойно.
    2. Схема включения есть, даю по ссылке: https://www.waveshare.com/wiki/File:High-Precision-AD-DA-board.pdf
    Плата с микросхемой готовая, мне не пришлось ничего не паять. И да, померил, на Vref+ 2.48B, на Vref- нуль вольт (всё укладывается в пределы даташита), AINCOM нуль, ибо в несимметричных измерениях это земля. Диф. измерения я не выполняю (да и мне и не нужно, на самом деле).
    3. Эт мы в курсе :D (мой код - файл "adc_28_11_18.c". могу в виде цитаты сюда закинуть, если кому интересно его глянуть).
    4. Программно задаю автокалибровку. А вот про постоянный сдвиг на середине диапазона объясните, пожалуйста, не совсем понимаю, о чем речь.
    5. В свое время, помнится, я весь даташит прошерстил, упоминания о нюансах диф. режима там нет. Как я понимаю, за выбор режима отвечает чисто регистр MUX и комбинации, которые в него вводятся (рисунок).
    6. Буфер я программно отключаю. Какого номинала... черт его знает. Я ведь не только с него напряжение пишу, но и с других устройств. И везде оно некорректно.
    7. Да, тайминги из даташита я соблюдаю.
    8. Измерения произвожу чисто с одного канала АЦП.
     

    Вложения:

    • mux.png
      mux.png
      Размер файла:
      77,3 КБ
      Просмотров:
      87
  4. Daniil

    Daniil Гуру

    2. Любопытно, зачем они подключили Vref через резисторы. Даже в дашике такое есть..
    4. Калибровку нужно не только запускать, но и пользоваться. Т.е. надо считать коэффициенты, которые будут получены после калибровки. (см. стр. 23). На данном этапе она только замедляет процесс отцифровки. (стр. 25). Постоянный сдвиг мелочи на данном этапе. Каждый производитель рекламирует свои АЦП как хочет. У аналогдевайсес такие графики есть.
    6. С включённым буфером вход имеет входное сопротивление ~80 МОм на фоне выключенного буфера 150 кОм (PGA=1) (см. стр. 3) - с буфером более точно (стр. 12-13), но потребление растёт (стр. 4). Попробуйте его включить.
    Посмотрел код. Очень приятно читать)

    Сходу ошибок не вижу. Если есть подозрение, что библиотека китайцев косячит, да и в любом случае хотелось бы проверить - считайте 5 конфигурационных байт они совпадут с вашими?
    Как вы получили картинку треш, если выше пишете, что в отрицательной области фигня получается?
     
  5. 4. Как я понял из даташита, если частота оцифровки и т.п. параметры не меняется, то достаточно провести самокалибровку после включения платы. Ииии достаточно для этого послать команды типа SELFOCAL, SYSOCAL и т.п.
    ... Но, пожалуй, перечитаю этот момент еще раз, внимательней :D
    6. Тоже попробуем сделать, но сначала нужно разобраться.

    Вот, по поводу конфигурационных байт. В самом конце делаю запрос на чтение регистров, получаю (см. также рисунок):
    0011 0001 (0x31) -> должно быть в регистре, по битно: id id id id 0 1 0 DRDY (бит DRDY дублирует состояние шины DRDY);
    0000 0001 (0x01) -> должно быть 0000 1000;
    а дальше все вообще по нулям идет, замечательно))

    Дублирую я эту процедуру, поскольку до того, как написать здесь, была еще одна проблема - чередование полезных данных и нулей при использовании функции bcm2835_spi_transfernb() (и буфера, куда на автомате складываются значения с ацп). Уж не знаю, с чем это может быть связано. Но процедуру взятия данных пришлось изменить.

    А картинка потому и треш, что должна быть абсолютно другой. Ибо при переходе в отриц. область значения должны резко уйти в область 0xFFFFFF и плавать где-то там, до перехода снова в положительную область. У меня же в программе так не получается... а вот в китайском коде - получается! Обидно... кажется, мне снова стоит посмотреть его повнимательней.
     

    Вложения:

  6. ... а не получается оно так наверно потому, что... есть какая-то паразитная положительная подставка? Я сначала думал, что эта подставка = 2.5В (ибо, ровно на 2.5 вольтах у меня отсчет 0хFFFFFF, хотя это должно быть первое отрицательное значение с таким нумером). Тогда... на ~5В должен быть номер отсчета, характерный для примерно 2.5В, но так не получается.
     
  7. Daniil

    Daniil Гуру

    Мне кажется проще самому реализовать передачу данных по SPI. Регистры MUX, ADCON и DRATE не меняются в процессе работы АЦП, поэтому вы в любой момент должны мочь считать их и проверить, что они соответствуют последнему записанному в них значению. Попробуйте на них отрабатывать работу SPI.
    А саму библиотечку всковырнуть можно? Может в ней в определённый момент посылается программный сброс настроек или ещё чего-нибудь (в ненужный момент сброс линии CS..)?
     

    Вложения:

    • tst.png
      tst.png
      Размер файла:
      16,6 КБ
      Просмотров:
      144
  8. В данном случае, у меня только один аргумент: но у китайцев же код работает! :D
    Ну что ж... Если выбора иного не останется, то да, придется учиться самому по SPI гонять данные)
    Наверно, отпишусь здесь, если появится что-нибудь новенькое.
     
    Последнее редактирование: 30 ноя 2018