Управление Платой AD5780 EVAL через микроконтроллер
Хорошо, заранее спасибо, потому что я здесь новичок. Я читаю драйверы AD57XX здесь https://wiki.analog.com/resources/tools-software/uc-drivers/renesas/ad5780 и я изо всех сил пытаюсь понять, как заставить устройство работать и понимать его правильно.
Я использую код здесь https://github.com/maxgerhardt/arduino-ad57xx-driver/blob/master/src/main.cpp для того, чтобы проверить ЦАП. У меня есть несколько вопросов о драйверах и работе в целом. Я перечислю их по пунктам, если это нормально
- Где в драйверах я выполняю выбор ведомого устройства и где я определяю тактовую частоту? Я просмотрел C в библиотеке драйверов, и кажется, что каждая команда, будь то чтение или запись, каждый раз выбирает ведомое/ведущее устройство? Я не вижу никакой ссылки на то, какие контакты на микроконтроллере это ссылка, хотя я не знаю, правильно ли это.
- Зачем мне вообще нужно читать в контрольном регистре или что-то из ЦАПА? Почему это имеет значение? Все что я хочу это вывести напряжение
- Как мне выполнить правильное преобразование в напряжение, которое я хочу? Команда "AD57XX_SetDacValue()" занимает много времени, но я не понимаю, как это связано с плавающим значением напряжения. Скажем, я хочу 2,35 вольта или функцию синуса от -2 до 2 Вольт, как мне сделать это преобразование?
- Я не знаю, как отлаживать систему в целом. Когда я запускаю пример кода, который должен выводить треугольную волновую функцию, я получаю функцию sin, которая кажется просто шумом.
@Andrew Hardy, 👍-1
Обсуждение1 ответ
Где в драйверах я выполняю Выбор ведомого устройства и где я определяю тактовую частоту? Я просмотрел C в библиотеке драйверов, и кажется, что каждая команда, будь то чтение или запись, каждый раз выбирает ведомое/ведущее устройство? Я не вижу ссылки на то, какие контакты на микроконтроллере являются ссылочными, поэтому я не знаю, правильно ли что-либо из этого.
Выбор подчиненного устройства управляется функцией SPI_Write()
. Он использует функцию PinMgt_PinWrite()
для управления выбором подчиненного устройства, которое, в свою очередь, выбирает контакт из таблицы поиска pinMapping []
.
Тактовая частота установлена в AD5780_Init()
.
Зачем мне вообще нужно считывать данные в Контрольном регистре или что-либо из ЦАП? Почему это имеет значение? Все, что я хочу, - это вывести напряжение
А ты-нет. Код предназначен только для демонстрационных целей. Это показывает вам, как вы могли бы запросить эти регистры. Если тебе это не нужно, тогда не делай этого.
Как мне выполнить правильное преобразование в нужное мне напряжение? Команда "AD57XX_SetDacValue()" занимает много времени, но я не понимаю, как это связано с плавающим значением напряжения. Допустим, мне нужно 2,35 Вольта или функция синуса от -2 до 2 Вольт, как мне выполнить это преобразование?
Это значение является исходным значением для установки ЦАП. Вы обращаетесь к таблице данных DAC, чтобы узнать, к чему приравнивается это значение. В этом случае диапазон составляет от \$V_{REFN}\$ до \$V_{REFP}\$. Разделите этот диапазон на 218, и у вас будет напряжение на бит.
Я не знаю, как отлаживать систему в целом. Когда я запускаю пример кода, который должен выводить волновую функцию треугольника, я получаю функцию sin, которая кажется просто шумом.
Вам нужны некоторые инструменты отладки. Такие вещи, как логический анализатор, позволяющий быстро видеть, что делают выводы ввода-вывода вашего микроконтроллера. Осциллограф можно использовать для определения наличия сигнала, но чтобы увидеть все сигналы SPI вместе, вам действительно нужен логический анализатор.
Спасибо вам за ответ. Я понимаю уравнение для исходной стоимости. Я понимаю, что если я отправлю 0x3FFFF (18 1, я получу максимальное значение). Чего я не понимаю, так это того, что команда AD57XX_SetRegisterValue и AD57XX_SetDacValue оба используют "длинные строки без знака", но вместо этого код просто хранит двоичный код внутри этих длинных строк? Когда я адаптирую этот код, чтобы просто отправить значение AD57XX_SetDacValue(0x3FFFF), я не получу 10 вольт, @Andrew Hardy
Я читал таблицу снова и снова, я не хочу показаться ленивым, но, похоже, это мне не помогает, @Andrew Hardy
"но тогда код просто хранит двоичный код внутри этих лонгов вместо этого?"...Что это должно означать?, @Majenko
Также в pinMapping[] нет MOSI, МИСО или SCK, как это должно работать?, @Andrew Hardy
MOSI, MISO и SCK-это аппаратные контакты SPI. Вы не имеете над ними никакого контроля. Аппаратное обеспечение SPI управляет ими., @Majenko
Разве длина не является целочисленным значением? Почему он отправляет 0x3FFFF ? Я знаю, что должен отправлять 18 бит, но я не понимаю, почему команда запрашивает долгое, @Andrew Hardy
Long-это 4-байтовая область памяти для хранения информации. Мы выбираем использовать базу 10 для представления значения, хранящегося в этой памяти. Вы могли бы с таким же успехом использовать (как и там) базу 16. В любом случае, все это просто база 2 (двоичная) в памяти., @Majenko
Могу ли я следовать какому-то учебнику или другому репозиторию github или чему-то еще для этого? Без какого-либо формального опыта EE я довольно растерян и не знаю, как что-то делать на самом деле., @Andrew Hardy
- Есть ли способ воспроизводить звуки с Arduino без использования звукового экрана?
- Как отправлять данные через I2C без проводной библиотеки?
- Arduino с 12-битным ЦАП (MCP4725) не работает
- ШИМ на выводах не ШИМ
- AnalogWrite(DAC0, X), Аналоговое напряжение на выводе DAC0 выше при меньшем значении X - это нормально?
- Как сканировать сигнал HIGH на digitalRead во время основного цикла, одновременно выполняя другие задачи?
- Использование аналогового компаратора на ATmega32u4
- Как правильно читать АЦП на ATtiny85?
По моему опыту, программное обеспечение analog devices eval board-это дерьмо, у меня было несколько, которые я даже не мог работать с их программным обеспечением. В конце концов я выложил свою собственную плату с микропроцессором., @Voltage Spike
@laptop2d Есть ли у вас какие-либо предложения / альтернативы о том, как запустить ЦАП? Я не могу найти правильных githubов этого запуска и я немного запаниковал, @Andrew Hardy
Примечание для читателей, интересующихся этой темой: Тот же вопрос был задан на аналоговых устройствах "EngineerZone".[here](https://ez.analog.com/data_converters/precision_dacs/f/q-a/108916/operating-ad5780-eval-board-via-microcontroller). Поэтому там могут появиться ответы / новая информация / и т. Д., @SamGibson
Я использую AD5780, но с STM32 на моей собственной плате. Что бы я сделал, так это написал свой собственный код для eval board, если вы сможете найти способ его запрограммировать., @Voltage Spike
@laptop2d Есть ли у вас документированный код, который вы используете для STM32? Я понимаю, что будут различия, но любая ссылка для меня полезна? Я недостаточно компетентен, чтобы действительно писать свои собственные драйверы, @Andrew Hardy