В настоящий момент остановился на следующем.
Единственная проблема - это жуткие тормоза ( а иногда вообще какая-то билиберда) при использовании обычной кнопки (есть в проекте). Кнопку убираем - всё работает нормально.
После не совсем удачных поисков работающей (действующей) схемы простых весов, решил создать эту тему. Я - начинающий работать с FLPROG, поэтому уместные комментарии и поправки приветсвуются. Планируется совместное с форумчанами построение весов на модуле от AlexCrane. Весы должны измерять вес 1 или 2 кг (такие тензодатчики есть в наличии), иметь функцию самокалибровки с образцовым весом, звуковое сопровождение нажатия кнопок. Кнопок планируется 3 шт. Значение вверх (+)/ОК/Значение вниз (-). Возможны ещё какие-либо доп. функции, которые добавятся по ходу пьесы.
Валентин, спасибо за шикарный проект! Очень интересно!ValentinK писал(а): ↑21.02.2024{, 16:21}Вот, давненько, делал весы. Нужен был семисегментный светодиодный дисплей и передача через RS-485. Но, т.к. контроллер ЕСП32, то попробовал и веб интерфейс.
Там на первой плате условие для считывания параметров весов из EEPROM микроконтроллера при включении. Плата выполняется один раз, т.к. после выполнения в переменную записывается единица, и плата больше не активна.
А сохранение в память делается в плате 6, по условию изменения переменной.
Установка масштаба шкалы выполняется, в плате 9 по кнопке (что-то я там так и не доделал) либо по RS-485.
Могу, но у меня бывает с организацией времени не всё в порядке. По этому по мере возможности.
Первая плата выполняется по условию, что int = 0. Это возможно только при запуске программы (т.к. переменная инициализирована нулём), когда эта плата выполняет свою задачу, int присваивается единица и плата больше не работает.
А вот в натуре проекта больше нет. Задача отменилась, я опытный образец весовой платформы разобрал.
Ясно. В принципе вопросов нет.ValentinK писал(а): ↑24.02.2024{, 17:14}
Первая плата выполняется по условию, что int = 0. Это возможно только при запуске программы (т.к. переменная инициализирована нулём), когда эта плата выполняет свою задачу, int присваивается единица и плата больше не работает.
А задача первой платы только считать коэффициенты для блока HX711 из памяти (Scale - масштаб для HX711, а Zero - тара). После восстановления питания значение тары должно восстанавливаться, т.к. ёмкости с гранулами стоят на весах постоянно.
Скажите, откуда берётся (как вычисляется) переменная Scale?
Подытожу.
Плата работать будет и без Int. Но в таком случае в каждом цикле выполнения программы ядро контроллера будет обращаться к ППЗУ (EEPROM) для считывания переменных в ОЗУ. А каждый раз читать одни и те-же данные из постоянной памяти в оперативную смысла нет - только потеря процессорного времени (как, если-бы одни и те-же данные на компьютере каждый раз загружались с жёсткого диска в оперативную память).
Это верно.
Плата четыре служит для сброса тары в ноль.
- Это верно.
Вот это зависит от задачи.
Супер! Это уже тонкости! Я бы не додумался.....ValentinK писал(а): ↑26.02.2024{, 16:53}
Плата работать будет и без Int. Но в таком случае в каждом цикле выполнения программы ядро контроллера будет обращаться к ППЗУ (EEPROM) для считывания переменных в ОЗУ. А каждый раз читать одни и те-же данные из постоянной памяти в оперативную смысла нет - только потеря процессорного времени (как, если-бы одни и те-же данные на компьютере каждый раз загружались с жёсткого диска в оперативную память).
Вот для однократного считывания коэффициентов из ППЗУ в ОЗУ и сделано однократное выполнение первой платы по условию Int = 0.
По сути дела, перемножением вы возвращаете значение, выдаваемое АЦП, в исходный вид. А Zero как раз представлено в формате АЦП.ValentinK писал(а): ↑26.02.2024{, 16:53}
Плата четыре служит для сброса тары в ноль.
Перемножаются здесь, т.к внутри блока внутренние данные с АЦП микросхемы делятся на Scale для выдачи значения массы на выход. А значение нуля тары хранится в единицах АЦП, а не единицах массы (хотя логичнее и проще было-бы наоборот). Вот для получения значения нуля (тары) в единицах АЦП и приходится делать расчёт.
И плата выполняется по Set_Zero один раз (эта переменная позже сбрасывается).
Scale - масштаб изначально вычисляется по инструкции из блока (автор блока HX711 оставил внутри описание с подробной инструкцией). Вот оттуда выдержка:
"Вход "Zero" - задание нуля или установка тары.
На выходе сигнал Out = Out - Zero.
Тип входа - Long Integer. Можно задавать значения от -2147483648 до 2147483647.
-----------------------------------------------------------------------------------------------------------------------------------------------
Вход "Scale" - задание диапазона измерений или задание коэффициента пропорциональности.
Данные с АЦП делятся на коэффициент Scale, т.е. преобразуются в "удобный вид".
Out = Out / Scale.
Тип входа - Unsigned Long Integer. Можно задавать значения от 0 до: 4294967295"
-----------------------------------------------------------------------------------------------------------------------------------------------
Рекомендуется следующий порядок настройки:
1 - установить следующие параметры: "N_Read_n2" = 1; "Zero" = 0; "Scale" = 1
2 - установкой значения "N_Read_n2" подобрать стабильность показаний и нужную скорость
изменения данных. Лучше ориентироваться на приемлемую скорость изменения, исходя из
того, что чем медленнее - тем стабильней будут показания (после дальнейших преобразований)
3 - установить значение нуля или тары (при ненагруженном тензодатчике) на входе "Zero"
Zero = Out
4 - положить известный груз на тензодатчик и вычислить коэффициент преобразования по формуле:
Scale = Out / m
где:
Scale - коэффициент пропорциональности
Out - показания на выходе блока
m - масса известного груза на тензодатчике
Подождите! А как же Scale? Если первую плату уберём, то вместе с ней и Scale.....ValentinK писал(а): ↑26.02.2024{, 16:53}
В моём случае сбросив тару при включении, ладно снять ящик с сухим льдом, но опустошить бочку с жидким азотом или аргоном для обнуления тары было-бы достаточно проблематично.
Поэтому я сделал сохранение тары в память, что-бы не потерять его при перебоях с электричеством.
А вот если вам не надо хранить значение тары, то можно его обнулять при включении и не сохранять его в EEPROM. Тогда не нужна будет первая плата для считывания и не нужны будут участки с записью в ППЗУ.
Честно говоря, не пойму, как это всё работает.... В смысле где-то в глубине души что-то есть... но где-то глубоко, глубоко. По-моему в школе этот материал проходили, но очень давно...
Здесь вообще тёмный лес. Что я понял...
А эта переменная станет постоянной и будет инициализирована при компиляции.
Так и есть.
Представление отрицательных чисел в Компьютере и микроконтроллере одинаковое первый слева бит (или 31, если по компьютерному считать) равен единице. Вот блок BitR и проверяет является-ли число отрицательным и переключает Switch. Но здесь надо обязательно знать какого типа переменная: целая беззнаковая или со знаком. HX711_Out - переменная Long Integer Диапазон -2147483648 до 2147483647.
А вот поставил я тарелку на весы (300 грамм), сбросил тару (0 грамм), и снял тарелку с весов ( 0 - 300 = -300 грамм).
Верно, математика в данном случае подобрана для работы с целыми положительными числами.
Индикатор состоит из восьми сегментов, один забрал на показ минуса при отрицательном значении. На отображение цифр остаётся сем сегментов. Я сделал отображение шести цифр.
Валентин, скажите, нижняя часть схемы эквивалентна верхней части?ValentinK писал(а): ↑27.02.2024{, 17:00}Представление отрицательных чисел в Компьютере и микроконтроллере одинаковое первый слева бит (или 31, если по компьютерному считать) равен единице. Вот блок BitR и проверяет является-ли число отрицательным и переключает Switch. Но здесь надо обязательно знать какого типа переменная: целая беззнаковая или со знаком. HX711_Out - переменная Long Integer Диапазон -2147483648 до 2147483647.
Это пока отложим.... С ModBus ещё не сталкивался и не разбирался с этим....
Должно работать одинаково. Так, даже более понятно.
Плата 8 дисплей для отладки - использовал только для проверки срабатывания отдельных блоков.
Вспомнил эти символы - метки, в какой строке какая переменная (Z - Zero, S - Scale).
Верно, они показывают, что соответствующие переменные стали единицами.