Здравствуйте.Я Начинающий.Цель - изготовить ТермоГигроСтат с десятыми долями на семисегменте с применением датчика SHT21.Собрал схему в протеусе 7.10.Температуру отображает коректно(в некоторых диапазонах погрешность 0.1). Влажность отстает на 1 %... Без десятых долей это еще приемлемо. С десятыми долями это ужасно. На датчике 51.8 на семисегментах 51.1 Затем на датчике 51.9 на семисег сразу 52.6. Сделал ЛСД для отлатки. На нем такой же скачек. В некоторых диапазонах погрещность менше . Как с этим бороться? Искал решение,с бубном плясал. Составлять таблицу Погрешностей ? Может есть другой метод? Спасибо.Код Фото протеуса во вложении . I2cstart I2cwbyte &H80 'адрес микросхемы-датчика SHT21 I2cwbyte &HE5 'выбор измерения влажности в нормальном режиме Waitms 100 'измерение I2cstart I2cwbyte &H81 'чтение результата измерения I2crbyte Data1 , Ack 'прием старшего байта, ждем слудующий байт I2crbyte Data2 , Ack 'прием младшего байта I2crbyte Crc , Nack 'прием байта контрольной суммы (можно на него забить) I2cstop 'конец общения ' C Даташита Dataw = Data1 Shift Dataw , Left , 10 Dataw = Dataw + Data2 H = Dataw * 125 H = H / 65536 H = H - 6
T = T * 10 ' T Single Из Т=36,7ххххххх получаем Т=367,хххххх Cb = Round(t) ' Cb Integer Получаем 367 ровно Cifri(1) = Cb \ 100 ' Выводим на первую цифру (десятки) тройку Cifri(x)integer Cifri(5) = cb mod 10 ' Выводим десятую часть Семерку (после точки) t3 = Cifri(1)* 100 ' t3 integer получаем сотни 300 без 67 cb = cb - t3 ' получаем 67 без 300 Cifri(2) = Cb \ 10 ' Выводим еденици шестерку из 67 ' Т выводит хорошо с Н, ниже проблема H = H * 10 Cb = Round(h) Cifri(3) = Cb \ 100 Cifri(6) = Cb mod 10 h3 = Cifri(3)* 100 cb = cb - h3
Cifri(4) = Cb \ 10 Cls 'LCD Для отладки Locate 1 , 1 Lcd h Wait 1
Доброго времени суток.Думаю, что Bascom при таких вычислениях глючит. Интерпретатор он и в Африке интерпретатор.Придется юзать СИ. Нашел проект с SHT21, часами , датчиком давления и матричным дисплеем. Попробую выдернуть нужные фрагменты кода имея поверхностные знания Си и АСМа. Тяжело будет.Более простого проекта не нашел.
_________________ Господь дает трудный путь тому, кого наделяет талантом.
Честно говоря, ничего не понял. Датчик выдает уже готовый результат по и2ц, какие там погрешности при обработке? Что значит "а датчике 51.8 на семисегментах 51.1 Затем на датчике 51.9 на семисег сразу 52.6" как получено на датчике? Или это обсуждается сферический протеус, а железа нету?
И кстати, типовая погрешность влажности 2% у этого датчика, а может быть и поболее.
Что значит "а датчике 51.8 на семисегментах 51.1 Затем на датчике 51.9 на семисег сразу 52.6" как получено на датчике? Или это обсуждается сферический протеус, а железа нету?
И кстати, типовая погрешность влажности 2% у этого датчика, а может быть и поболее.
Да, Железа нет. На Датчике прибавляешь 0.1 на семисегметах (ЛСД) прибавляется сразу 1.5. Нет значений 51.2, 51.3 , 51.4. итд . Про погрешность знаю. Дело в Выводе скачками.Пусть бы с погрешностью ,но без скачков. Или Это глюк Протеуса? Температуру же Выводит. Спасибо
_________________ Господь дает трудный путь тому, кого наделяет талантом.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
гдето теряешь точность при вычислениях например, при умножении или делении на дробь нужнг сначала умножать, а затем делить (и нужно позаботиться об недопущении переполнения регистров, хранящих промежуточные результаты)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Лонг Выдал ошбку Error : 63 Line : 85 Integer or Long expected for ABS() .Может С какими то переменными не дружит я потом по эксперементирую. Сдвинул на 16 . Dataw = Data1 Shift Dataw , Left ,10' Dataw = Dataw + Data2 H = Dataw * 125 ''''''H = H / 65536 Shift H, right ,16 H = H - 6 Погрешность и скачки увеличились. Двигал на 12 13 14 15 17 на всякий случай Влево двигал То же на всякий случай. Сделать железо, а как потом 0.1 проверить.
_________________ Господь дает трудный путь тому, кого наделяет талантом.
если после сдвига погрешности-скачки изменились - ну, значит тут что-то не так, и скорее всего, в железе будет нормально. влево а так же на разное кол-во двигать не надо... сдвиг вправо - эквивалент делению на 2. соответственно, два сдвига - деление на 4, а 4 - это 2² и т.д. в даташите сказано 2^16, значит сдвиг вправо 16 раз. сдвиг влево - противоположная операция, т.е. умножение. При делении/умножении на степени двойки сдвиг предпочтительнее.
Цитата:
а как потом 0.1 проверить
Очень просто. Вместо опроса по и2ц подставите два байта результата, как будто они пришли по шине. Возможно, это получится сразу в дебаггере
Спасибо за исчерпывающий ответ.С битовой арифметикой в какой то степени я знаком, но придется углубить знания. Что от сдвига меняется я давно заметил(двигал в другом месте) ,только пока знатоки не пнут не решался на железо. Я имел в виду изготовил железо, ""дыхнул"" на датчик, О влажность показывает.Эталон конечно есть (Повереный, Госреестер), но я же не смогу ""дышать "" с шагом 0.1, чтобы проверить скачки. За Вашу Фразу (Очень просто. Вместо опроса по и2ц подставите два байта результата, как будто они пришли по шине. Возможно, это получится сразу в дебаггере) я зацеплюсь и буду изучать. Хотя с Басиком навряд ли это получиться. Басик из за отсутствия времени и если честно не глубоких знаний. Построил Сушилку с регулятором на ДТШ 22 он врет аж на 12%. В общем это другая тема.
_________________ Господь дает трудный путь тому, кого наделяет талантом.
Это получится с любым языком. Разница лишь в сложности отладки, что уже может зависеть от языка/средств. То есть, Вам либо придется делать так: перед Dataw = Data1 Shift Dataw , Left , 10 Dataw = Dataw + Data2
выполнить присвоение Data1 = 12 Data2 = 13 скомпилировать-прошить-посмотреть, затем Data1 = 12 Data2 = 14 (ну или что там, чтоб 0.1 вышло) снова скомпилировать-прошить-посмотреть Это в худшем случае. Либо, в лучшем случае, Вы эти значения поменяете в режиме отладки, на лету, и пошагово просмотрите, где что и как считается.
Доброго времени суток. Пока нет железяк, промниторил в протеусе считывание Младшего и Старшего байтов Влажности. Как видно все дело в них. Дата2 это и есть десятые и никакой последовательности,то 12 прибавляет, то 16, потом переполняется .Как я понимаю при 50.0 Дата 2 должно быть 00000000.
Это все таки (имхо) глюк протеуса или басика. Попробую И2С и сшт21 написать на си и промониторить. Вообще я так и не нашел проекта с данным датчиком ,где отображались бы десятые части.Может производитель и заявляет погрешность 2%.Это погрешность не физическая ,т. е . самого измерительного элемента , А погрешность Цифровая.
_________________ Господь дает трудный путь тому, кого наделяет талантом.
Посмотрите как это сделано в библиотеке там все просто и понятно. Сам ей уже давно пользуюсь, все прекрасно работает. Естественно функции нужно будет переписать под ваше железо. https://github.com/Csatacsibe/Si7021_dr ... ter/driver
Посмотрите как это сделано в библиотеке там все просто и понятно. Сам ей уже давно пользуюсь, все прекрасно работает. Естественно функции нужно будет переписать под ваше железо. https://github.com/Csatacsibe/Si7021_dr ... ter/driver
Спасибо Железа пока все еще нет. Написал ТВИ(И2С) на си. Пока,что Протеус. На шину повесил часы(ds1307) и SHT21.Часы идут,значит протокол работает.SHT21 не считывает данные. Протеус выдает Message ,естественно бесконечно. [SHTX] Command hot implemented or reserved(команда не реализована или зарезервирована)Все вроде по даташиту.
Я где то рядом , а догнать не могу.
Ds1307_Sht21.c while(1) { //DS1307 I2C_StartCondition();//START I2C_SendByte(0b11010000); // Отправим в шину адрес устройства + бит записи 0 I2C_SendByte(0);// Отправим байт данных, где расположен самый первый регистр I2C_StopCondition();//STOP _delay_ms(300); I2C_StartCondition(); //START I2C_SendByte(0b11010001); //Отправим в шину адрес устройства + бит чтения 1 sec = I2C_ReadByte();//ask min = I2C_ReadByte(); hour = I2C_ReadByte(); day = I2C_ReadByte(); date = I2C_ReadByte(); month = I2C_ReadByte(); year = I2C_ReadLastByte();//nask I2C_StopCondition(); //STOP // SHT21 I2C_StartCondition();//START I2C_SendByte(0x80); // Отправим в шину адрес устройства + бит записи 0 I2C_SendByte(0xE3); // выбор измерения T в нормальном режиме _delay_ms (300); I2C_StartCondition();// START I2C_SendByte(0x81); //Отправим в шину адрес устройства + бит чтения 1 _delay_ms(300); Data1 = I2C_ReadByte();//ask Data2 = I2C_ReadByte(); crc = I2C_ReadLastByte();//nask контрольная сумма I2C_StopCondition();//STOP //Вывод LCD sec = RTC_ConvertFromDec(sec); и так далее...
Доброго времени суток. Пока , что опять протеус. Код заработал только в режиме НЕприжатия к земле SCL на время замера.Не в Этом суть.Опять скачками выводится Влажность из за корявого считывания младшего байта датчика(Дата2). ВЫВОД. Язык программирования здесь ни при чем, или протеус или САМ ДАТЧИК. Делаю железо. Попробую гнать по Усарт в комп живую влажность.Повторюсь, не представляю ,как я буду"дышать" на датчик с шагом 0.1. Ведь цель вывести влагу без скачков с шагом 0.1 .Спасибо
_________________ Господь дает трудный путь тому, кого наделяет талантом.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения