Зарегистрирован: Ср мар 26, 2014 17:33:08 Сообщений: 49
Рейтинг сообщения:0
Доброго дня, коллеги! Подскажите пожалуйста, знающие люди, по поводу внешнего АЦП AD7091R-2. Не подружить мне его через SPI c stm32... Он работает, но только с одним каналом, а мне нужно с двумя. Ну и к самой сути вопроса.
В качестве, основного микроконтроллера, выбрал STM32F3DISCOVERY... Сама stm'ka подключена к АЦП, через SPI изолятор ADUM3154, соответственно плата DISCOVERY питается своим напряжением от USB, а АЦП питается от отдельного источника 5 вольт. Так же у AD7091R-2, предусмотрен вывод CONVST для управления, не относящийся к SPI, что бы и его развязать, пришлось установить оптопару...
result = AD7091_ReadData(0x800); result = AD7091_ReadData(0x1000); result = AD7091_ReadData(0x2000); result = AD7091_ReadData(0x2800); result = AD7091_ReadData(0x3000); result = AD7091_ReadData(0x3800); result = AD7091_ReadData(0x4000); result = AD7091_ReadData(0x4800); }
То есть, для проверки, сначала данные записали, а потом эти же данные и прочитали. Тут уже таится первый подвох, почему то в регистор CH0_HI и CH1_HI записываю значения 0x1FF, а читается 0xFFF... Не знаю почему так... Хотя SPI работает четко, как надо...
Вот, на скине, раньше в регистор CONFIG записал 0xC0, вот он и прочитал 0xC0, то что нужно.
Считываю данные с АЦП вот таким методом:
Код:
uint16_t AD7091_GetData() { uint16_t adc[4]; uint16_t result = 0x00;
adc[0] = AD7091_WtiteData(CONVERT_ON, 0x00);
return result; }
Значения похожи на правду, но это на 0 канале
А дальше трабола, если не трогать регистор Channel, то он всегда автоматом считывает на 0 канале. Мне нужно считать данные сначала на 0 канале, а потом на 1 канале. Делаю все как в даташите указано
Сначала, записываю данные в регистор Channel, про 0 канал, потом про 1 канал и потом на 3 и 4 обмен данными, должны прийти результаты с этих двух каналов...
Код:
uint16_t AD7091_GetData() { uint16_t adc[4]; uint16_t result = 0x00;
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
result = AD7091_ReadData(0x800); result = AD7091_ReadData(0x1000); result = AD7091_ReadData(0x2000); result = AD7091_ReadData(0x2800); result = AD7091_ReadData(0x3000); result = AD7091_ReadData(0x3800); result = AD7091_ReadData(0x4000); result = AD7091_ReadData(0x4800); }
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Зарегистрирован: Ср мар 26, 2014 17:33:08 Сообщений: 49
Рейтинг сообщения:0
Бубоник писал(а):
А какие он данные присылает после команды 0x800?
Для начала, решил никаких данных не писать, а просто прочитать значения регистров. В таблице 10, есть колонка Default, вроде, это значения по дефолту, которые должны быть там... Вот что получилось:
Код:
//Channel result = AD7091_ReadData(0x800); //0
//Configuration result = AD7091_ReadData(0x1000); //192
//Channel 0 low limit result = AD7091_ReadData(0x2000); //0
//Channel 0 high limit result = AD7091_ReadData(0x2800); //4095
//Channel 0 hysteresis result = AD7091_ReadData(0x3000); //511
//Channel 1 low limit result = AD7091_ReadData(0x3800); //0
//Channel 1 high limit result = AD7091_ReadData(0x4000); //4095
//Channel 1 hysteresis result = AD7091_ReadData(0x4800); //511
Все совпадает со значениями по дефолту, кроме двух параметров: Channel 0 high limit и Channel 1 high limit... По дефолту должны быть значение 0x1FF, а он почему то отправляет 0xFFF...
Дальше, записываем данные. По сути, я обновляю значение, только одного регистра, а именно: Configuration. А все остальные значения, дублирую по дефолту...
Хотя с другой стороны посмотреть 4095 это и есть максимальное значение 12 АЦП. Вот он и присылает 0xFFF.
Цитата:
Если я в Configuration записываю значение 0x16C0, то он в ответ на чтение присылает 192
Если я правильно понял документацию флаг soft reset сбрасывается автоматически, вот он и возвращает значение 192. Пробуйте считывать данные, посмотрите что он будет выдавать.
Зарегистрирован: Ср мар 26, 2014 17:33:08 Сообщений: 49
Рейтинг сообщения:0
Бубоник писал(а):
Пробуйте считывать данные, посмотрите что он будет выдавать.
Начал выдавать данные в нужной последовательности, но только почему то отправляет нулевые результаты, как будто напряжение равняется нулю...
И еще один момент, он хоть и отправляет нулевые данные в нужном порядке, но только с третьего раза... То есть, первый раз смотрю в отладчике - результаты везде 0 (во всех 4 значениях), перезапускаю отладку через студию, на второй раз, результат тот же - все по нулям, второй раз перезапускаю отладку - и данные начинают приходить...
Зарегистрирован: Ср мар 26, 2014 17:33:08 Сообщений: 49
Рейтинг сообщения:0
Бубоник писал(а):
Че то он многовато присылает 8192. Spi протокол точно правильно работает?
Вроде все правильно, в первом варианте 0, он и в Африке ноль)))
8192 это в двоичном формате выглядит так: 001 0 000000000000 Первые 12 бит, это собственно результат конвертации 12 бит, это ALERT, он тут не используется 13, 14, 15 биты, это канал на котом происходило измерение
Все правильно, в первом варианте результат равен нулю, так как это 0 канал, а во втором варианте измерение на 1 канале, но результат, тоже равен нулю. Если смотреть по схеме, оба канала соединены вместе...
Но там не может быть нуля, там порядка 3 вольт:
Ну и опорное напряжение для измерения:
PS Прошу прощения за качество фото, не удобно одной рукой держать щуп, а второй рукой фоткать с телефона
result = AD7091_ReadData(0x800); result = AD7091_ReadData(0x1000); result = AD7091_ReadData(0x2000); result = AD7091_ReadData(0x2800); result = AD7091_ReadData(0x3000); result = AD7091_ReadData(0x3800); result = AD7091_ReadData(0x4000); result = AD7091_ReadData(0x4800);
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения