FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Понедельник, 05.12.2016, 19:36
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 2«12
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » весы hx711 (обмен данными)
весы hx711
krom23 Дата: Среда, 05.10.2016, 22:40 | Сообщение # 16
Майор
Группа: Проверенные
Сообщений: 175
Награды: 1
Репутация: 0
Статус: Offline
Спасибо за объяснение, всё понял. Усреднение это нужная вещь и я не имел его в виду. Есть два похожих блока в программе Scale с линейным преобразованием и полигон, куда можно записать нелинейную функцию состоящую из более двух точек, что в свою очередь позволяет использовать датчики с не линейными свойствами и существенно экономит не математических действиях. Натуральные числа, это беда атмеловских контроллеров и поэтому желательно работать с числами имеющими вид 100500 а не 10,0500, тем более что запятую мы можем поставить принудительно в любом месте при преобразовании в строку, а математика нам не нужна при наличии Scale и полигона.
Если вы напишете такой блок будет здорово, если нет то с удовольствием поэкспериментирую с тем что вы выложили. Ещё раз спасибо за блок.


Сообщение отредактировал krom23 - Среда, 05.10.2016, 22:57
 
arisov77 Дата: Среда, 05.10.2016, 23:56 | Сообщение # 17
Рядовой
Группа: Проверенные
Сообщений: 23
Награды: 4
Репутация: 2
Статус: Offline
Числа на выходе "Out" блока и так будут без запятой, если Вы на входе "Scale" блока не будете задавать числа с запятой. Только единственное, то что формат (тип) числа задан как "float" -> тип входа легко поменять, а выход -> надо немного отредактировать блок. Хорошо, для Вас попозже сделаю блок с названием "HX711_int".
Также можно было бы сделать блок, в котором число опросов АЦП ("N_Read") было бы кратным 2^n, чтобы потом "тяжёлую" операцию деления заменить сдвигами. На ассемблере, при опросе датчиков я всегда так делал. Такой блок был бы немного "шустрее" - но надо ли это?

Хотелось бы, чтобы кто нибудь попробовал блок "в деле", прежде чем его дорабатывать.
Меня беспокоит, как будет блок работать совместно с внешними прерываниями? Есть у меня подозрения, что пока опрашивается вывод "DOUT", микроконтроллер может "проспать" всё остальное...

Также, я продолжу делать другой блок для НХ711. Он будет с двумя выходами от каналов А и В. В моём случае это нужно для обработки Pt100.


Сообщение отредактировал arisov77 - Четверг, 06.10.2016, 08:14
 
krom23 Дата: Четверг, 06.10.2016, 23:40 | Сообщение # 18
Майор
Группа: Проверенные
Сообщений: 175
Награды: 1
Репутация: 0
Статус: Offline
Вот-вот придёт посылочка, так сразу же берусь за эксперименты. 
Цитата arisov77 ()
сделаю блок с названием "HX711_int"
Извините что напряг вас, иногда сначала пишу а потом думаю sad . Нет необходимости что то переделывать.
Цитата arisov77 ()
А и В. В моём случае это нужно для обработки Pt100.
Не поделитесь задумкой, для чего два канала?


Сообщение отредактировал krom23 - Четверг, 06.10.2016, 23:43
 
kot55 Дата: Суббота, 08.10.2016, 17:20 | Сообщение # 19
Рядовой
Группа: Проверенные
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
Добрый вечер. Раньше не получилось зайти. Пробовал проверить или я чего то не понимаю..... Тензодатчики не как не реагируют на вес. В сом порту плывет 1 0.000 кг. А при копировании скетча в ардуино 1.6.11 возникает ошибка                          

Arduino: 1.6.11 (Windows 7), Плата:"Arduino/Genuino Uno"

C:\Users\Vasilij\Desktop\Проэкты\pr2\pr7\pr7.ino: In function 'void loop()':

pr7:121: error: '_floatToStringWitRaz' was not declared in this scope

pr7:126: error: '_isTimer' was not declared in this scope

exit status 1
'_floatToStringWitRaz' was not declared in this scope

{_swi1=((( _floatToStringWitRaz(Out,3))) + (String("  kg")));} эта строка подчеркнута красным
 
arisov77 Дата: Воскресенье, 23.10.2016, 05:26 | Сообщение # 20
Рядовой
Группа: Проверенные
Сообщений: 23
Награды: 4
Репутация: 2
Статус: Offline
Цитата krom23 ()
Не поделитесь задумкой, для чего два канала?

Я ссылку уже давал, повторю её http://forum.easyelectronics.ru/viewtop....p321030 , процитирую оттуда сообщение:

Все можно сделать несколько проще, если не пытаться возбуждать точным значением тока. Достаточно просто взять более или менее стабильный источник напряжения (например опорник через повторитель), и запитать им связку из RTD и референсного резистора. Двумя каналами АЦП измеряем падение там и там, и строим простое отношение, из которого, зная точное сопротивление референсного резистора, получаем точное значение сопротивления датчика.

Плюсы - не надо париться напряжением возбуждения, строго говоря оно вообще может быть любым. Желательно подобрать такое, чтобы падение на резисторах было как раз в диапазоне АЦП. Убираются ошибки источника тока. Убираются ошибки АЦП, такие как дрифт и нелинейность (если сопротивление датчика и сопротивление референсного резистора одинаковы).

Для простоты можно взять любой достаточно быстрый АЦП с как минимум двумя каналами, лучше дифференциальный. В идеале - два полностью синхронных канала, но если переключение будет достаточно быстрым, то тоже ничего страшного.

Ток в подобной схеме достаточно большой, так что особенно париться с фильтрацией на входе не надо. Однако между дифференциальными входами не мешает поставить по конденсатору нанофарад на десять, и посадить их на землю также через конденсаторы по нанофараду. Частота оцифровки - не менее 500 Гц, после оцифровки фильтр на 50 Гц. Усреднение, и будет вам щасте.


И прилагаю свой вариант схемки подключения Pt100 к HX711.
Тестирование этой схемы ещё не окончено, как закончу – опишу результаты.
Резистор Rref – «опорный», выделяемое на нём напряжение будет измеряться каналом А с усилением х64 (+/-40мВ). Напряжение с Pt100 измеряется каналом В с усилением х32 (+/-80мВ). В FLProg, упрощенно это будет выглядеть так: c пользовательского блока оцифрованные значения с А и В поступят на математический блок деления и значение Pt100 будет равно: Pt100 = B/A, далее калибровка (ноль и диапазон).
Как уже писали http://forum.easyelectronics.ru/viewtop....p321030 в таком включении не надо источника опорного напряжения. И я надеюсь, что не надо будет прецизионных резисторов =10кОм, а будет достаточно использование равных по сопротивлению между собой резисторов -> измерил из одной ленты ЧИП-резисторы, были равны между собою в пределах 1%. Также бывают счетверённые ЧИП резисторы (их много в «материнках»).

------------------------------------------------------------------------------
Цитата kot55 ()
Пробовал проверить или я чего то не понимаю..... Тензодатчики не как не реагируют на вес. В сом порту плывет 1 0.000 кг. А при копировании скетча в ардуино 1.6.11 возникает ошибка
Судя по приведённому коду – ошибка не из моего пользовательского блока, а встроенных блоков для добавления «кг» в строку. У меня в ардуино 1.6.3 - ошибок нет. Попробуйте этот пример – должно быть всё тоже самое, кроме индикации «кг» и аварийных значений. И проверьте, Вы правильно указали в блоке НХ711 выводы Ардуинки, к которым подключен модуль НХ711?

Добавлено (23.10.2016, 05:26)
---------------------------------------------
****************************************************************************************
Почему то не добавляется новое сообщение, а присоединяется...... angry , очень неудобно...
****************************************************************************************
Наконец то, сделал блок с двумя выходами (канал А и канал В). Может кому ни будь и сгодиться…
Судя по буржуйским форумам, некоторые пользователи – подключают по 2 тензодатчика на платку (по одному на каждый канал) и уже отдельные данные с каждого датчика обрабатывают, затем объединяют и выводят на индикацию.
Возможны также варианты, когда используют, например, 6 тензодатчиков и сигнал с них подают на индивидуальный модуль АЦП. Такой вариант удобен при больших расстояниях от тензомоста, в этом случае платку с НХ711 располагают рядом с тензодатчиком и уже «цифровой» сигнал «пускают» на весовой терминал, т.е. такой вариант более помехоустойчив. Для такого варианта (когда используется несколько платок с НХ711 и у них объединены вывода SCK) есть ардуиновская библиотека https://github.com/compugician/HX711-multi .

У НХ711 при переключении каналов обнаружился один существенны недостаток – нужно достаточно долго ждать, пока не появятся «нормальные» данные (параметр из DataSheet "Output settling time" ("Время установления данных") = 400ms, при RATE (pin15) = 0 или равно 50ms, при RATE (pin15) = DVDD).
Поэтому, для уменьшения времени обработки блока в одном цикле программы, я в своём пользовательском блоке (с двумя выходами) реализован следующий алгоритм опроса НХ711:
- в каждом новом цикле опроса блока считывается только один канал и только один раз (расчётное время одного опроса блока (преобразования АЦП) = 100ms, при RATE (pin15) = 0 или 12,5ms при RATE (pin15) = DVDD)
- первые 4 цикла опроса блока - "пустые" считывания канала А
- 5 цикл - считывание канала А с суммированием (если на входе "N_Read" >1)
- 6..9 циклы - "пустые" считывания канала В
- 10 цикл - считывание канала В с суммированием (если на входе "N_Read" >1), масштабирование и вывод результатов измерения на выхода
- далее циклы повторяются сначала

При использовании блоков НХ711 следует учесть, что если в программе, используются критичные по времени выполнения задачи, то могут возникнуть проблемы с этими задачами, т.к. пока происходит ожидание ответа от НХ711 (появление лог. «0» на выходе DOUT, после окончания преобразования), контроллер занят и основной цикл не выполняется. Для уменьшения влияния на ход выполнения других задач, желательно блок включать по таймеру (вход «En»).
Для того, чтобы ещё меньше «зависеть» от НХ711, нужно сделать новые пользовательские блоки, на внешних прерываниях, т.е. при возникновении прерывания от лог. «0» на выходе DOUT. Надеюсь, кто-то возьмётся и продолжит «оцифровку» НХ711, т.к. я наверное, уже не смогу это сделать из-за нехватки времени и из-за того, что я уже получил, что хотел http://flprog.ru/forum/20-1379-1 и результат меня устраивает.
Оба блока выложил здесь http://flprog.ru/load/bloki_polzovatelej/hx711_code/2-1-0-158 .

Прикрепления: 5731690.jpg(50Kb) · HX711_10.2016-2.flp(162Kb)


Сообщение отредактировал arisov77 - Воскресенье, 23.10.2016, 05:25
 
ДедОк Дата: Понедельник, 31.10.2016, 15:11 | Сообщение # 21
Рядовой
Группа: Проверенные
Сообщений: 2
Награды: 1
Репутация: 0
Статус: Offline

Цитата
При использовании блоков НХ711 следует учесть, что если в программе, используются критичные по времени выполнения задачи, то могут возникнуть проблемы с этими задачами, т.к. пока происходит ожидание ответа от НХ711 (появление лог. «0» на выходе DOUT, после окончания преобразования), контроллер занят и основной цикл не выполняется. Для уменьшения влияния на ход выполнения других задач, желательно блок включать по таймеру (вход «En»).
Да, задержка ответа по modbus составляет более 100 ms/цикл. Для моих задач это чрезвычайно много. Есть и другая проблема. Если по какой-то причине плата перестала отвечать - виснет все, а мне на контроллер приходит добрый десяток дискретных и аналоговых сигналов, мне не критично потерять канал, но завесить всю плату - перебор smile Ну и данные мне нужны в  виде Integer, а не Float. Поэтому я чуть подправил код. Теперь данные подаются в виде Long Integer по одному выходу, а в виде Float - по другому. Блок не ждет жестко появления готовности данных, а опрашивает готовность в порядке прохождения программного цикла, обновляя данные по мере готовности. Задержка менее 1 ms/цикл. В проект можно вставить несколько блоков, у меня на плате 2 штуки стоят. ну, и не виснет, если нет связи с АЦП.
Прикрепления: HX711_2-CODE-.ubi(70Kb)


Сообщение отредактировал ДедОк - Понедельник, 31.10.2016, 15:15
 
arisov77 Дата: Пятница, 04.11.2016, 07:24 | Сообщение # 22
Рядовой
Группа: Проверенные
Сообщений: 23
Награды: 4
Репутация: 2
Статус: Offline
Добавлено (03.11.2016, 21:04)
------------------------------------------------------
ДедОк , проверил Ваш блок – всё работает, спасибо за доработку. Блочёк для НХ711 с переключением каналом модернизируете?
Когда я начинал делать блок, опрос готовности НХ711 я также делал через
«if (digitalRead(DOUT) == 0)», но у меня почему то такая конструкция не пошла, получилось только через «while», тем более в оригинале https://github.com/bogde/HX711/blob/master/HX711.cpp наподобие было. Я только начинаю осваивать Си, наверное какие то ещё другие ошибки были, поэтому и не получилось через оператор if.

а мне на контроллер приходит добрый десяток дискретных и аналоговых сигналов,
Кстати у меня тоже на Arduino Nano приходит: 2 x НХ711 (проверял пока только с одной), 16 дискретных входов (2 х 74НС165), 16 выходов (2 х НС595), 1 аналоговый вход, фазовый регулятор – всё это туда-суда передаётся по Модбасу. Сейчас около 10 тегов использую – «на столе» всё пока работает.

Добавлено (04.11.2016, 07:24)
---------------------------------------------
Сегодня ночью эксперементировал со своим контроллером и обратил внимание, что при некоторых положениях задатчика фазового регулятора http://flprog.ru/publ....2-1-0-2 наблюдаются "вплески" сигнала с НХ711. В результате дальнейших эксперементов, пришёл к выводу, что на данные от НХ711 влияют внешнее прерывание (Int0/Int1) и прерывание от Таймера используемые в блоке фазового регулятора.
Добавил пару строчек сюда:
noInterrupts(); // запретить все прерывания
// подать 24 импульса на SCK и считать состояние с OUT
data[2] = shiftIn(DOUT, PD_SCK, MSBFIRST);
data[1] = shiftIn(DOUT, PD_SCK, MSBFIRST);
data[0] = shiftIn(DOUT, PD_SCK, MSBFIRST);
// установить канал и коэф. усиления для следующего опроса АЦП
for (byte i = 0; i < Ch_Gain; i++)
{
digitalWrite(PD_SCK, HIGH);
digitalWrite(PD_SCK, LOW);
}
interrupts(); // разрешить все прерывания
.
Стало значительно лучше, но не 100%.

Буду пробовать делать новый блок на НХ711 на внешнем прерывание с выхода DOUT.


Сообщение отредактировал arisov77 - Пятница, 04.11.2016, 07:26
 
segsm Дата: Воскресенье, 13.11.2016, 16:56 | Сообщение # 23
Рядовой
Группа: Проверенные
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
"Дискретный вход "Sleep" - перевод АЦП в "спящий" режим (режим пониженного энергопотребления).
0 - нормальная работа АЦП, 1 - режим "сна"."
 Все наоборот. Либо "Sleep" надо назвать "RUN", либо исправить описание.
 
arisov77 Дата: Воскресенье, 13.11.2016, 21:31 | Сообщение # 24
Рядовой
Группа: Проверенные
Сообщений: 23
Награды: 4
Репутация: 2
Статус: Offline
Да, в описании есть такая ошибка, спасибо за замечание.

Сейчас, не спеша делаю новый блок на "внешнем прерывании", там этот вход я совсем исключил, т.к. блок из-за такой универсальности получается немного "утяжелённым".
Ведь для того, чтобы блок (или НХ711) корректно работал(а) врежиме Sleep надо после просыпания выждать некоторое время или сделать 3-4 "пустых" считывания АЦП, затем считать "нормальные" данные, после усреднения выдать результат и потом снова "заснуть" (для максимальной экономичности).
Также для экономичности желательно будет добавить в блок дополнительный выход, сигнализирующий о том, что блок "занят" преобразованием в режиме Sleep (или наоборот, что это преобразование законченно) - это нужно будет для того, что была точка отсчёта для старта таймера, по истечении времени которого снова запустить преобразования АЦП. Или надо будет сделать отдельный вход задания времени «пробуждения»НХ711.
Без задания времени «просыпания» АЦП, на мой взгляд, смысла в энергосбережении нет.

Кстати, segsm у Вас блок НХ711 работает?


Сообщение отредактировал arisov77 - Воскресенье, 13.11.2016, 21:35
 
segsm Дата: Понедельник, 14.11.2016, 18:01 | Сообщение # 25
Рядовой
Группа: Проверенные
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
"Кстати, segsm у Вас блок НХ711 работает?"
Пока только  в режиме "RANDOM".
 
arisov77 Дата: Воскресенье, Вчера, 10:35 | Сообщение # 26
Рядовой
Группа: Проверенные
Сообщений: 23
Награды: 4
Репутация: 2
Статус: Offline
Немного изменил «старые» блоки и добавил два новых блока, работающих по внешнему прерыванию (которое возникает по завершению окончания преобразования данных в HX711).
Цитата arisov77 ()
эксперементировал со своим контроллером и обратил внимание, что при некоторых положениях задатчика фазового регулятора http://flprog.ru/publ....2-1-0-2 наблюдаются "вплески" сигнала с НХ711.
Проверил «модернизированные» блоки (без прерываний) в том же контроллере и при тех же условиях, вроде бы «всплесков» не обнаружил, даже при использовании «двухканального» режима НХ711 (у меня один канал (А) измеряет температуру в печи, другой (В) - в блоке управления (с более низкой точностью и с меньшим диапазоном).
Если вдруг, у кого-то проявиться какие-нибудь всплески, то можете самостоятельно попробовать запретить все прерывания во время считывания данных с НХ711. Для этого в режиме редактирования блока в разделе “FunctionSection” надо удалить в начале двух строк «две косых палочки» //
……………….
// noInterrupts(); // запретить все прерывания
………….
// interrupts(); // разрешить все прерывания
………………………..
и сохранить эти изменения (желательно «Обновить только в проекте»).
Прикрепления: HX711_1ch.flp(200Kb) · HX711_2ch_intpt.flp(350Kb) · HX711_v2.ubl(401Kb)
 
segsm Дата: Понедельник, Сегодня, 15:04 | Сообщение # 27
Рядовой
Группа: Проверенные
Сообщений: 3
Награды: 0
Репутация: 0
Статус: Offline
1. Всплески. Причина не в разрешении или запрете прерываний, а в ложных "DOUT". Проверять надо как минимум 3 раза в разных вызовах блока. Для этого организовать счетчик на дополнительной переменной.

2. Мне кажется вот это:
// Construct a 32-bit signed integer
long ReadValue = ( static_cast<unsigned long angry filler) << 24
| static_cast<unsigned long angry HX711_data[2]) << 16
| static_cast<unsigned long angry HX711_data[1]) << 8
| static_cast<unsigned long angry HX711_data[0]) );
должно быть так:
// Construct a 32-bit signed integer
long ReadValue = ( static_cast<unsigned long angry HX711_data[2]) << 24
| static_cast<unsigned long angry HX711_data[1]) << 16
| static_cast<unsigned long angry HX711_data[0]) << 8
| static_cast<unsigned long angry filler) );

3. Усреднять нельзя в переменной одного типа. Переполнится.Можно если предварительно делить на 256(считываем ведь 24 бита) количество слагаемых при это не больше 256 т.е.  байта.

4. Нельзя делить сдвигом без учета знака.
 
Форум » Основной » Спросить у знатоков » весы hx711 (обмен данными)
Страница 2 из 2«12
Поиск:

FLProg © 2016
Яндекс.Метрика