На "казусе" попросили снять протоколы. Снял.
Продублирую здесь высказанное на казусе.
Похоже, мне никогда не удастся понять китайскую логику. Поэтому даже не буду пытаться повторять, а реализую то, что задумал, как и описал темой раньше. Итак, как работает этот вольтметр.
Вывод на дисплей
АЦП
А еще у меня не получилось линейно преобразовать данные в выводимое напряжение, чтобы обоим числам соответствовало то, что показывал дисплей. Варианта два:
UPD:
К сожалению, чип оказался залоченным от чтения. Но и почему-то не получилось ничего вместо существующей прошивки записать. На "казусе" посоветовали на Vcap припаять микрофарадный кондей. Попробую. Но, боюсь, что не поможет: есть подозрение, что китайцы научились делать одноразовые STM8S003.
Продублирую здесь высказанное на казусе.
Похоже, мне никогда не удастся понять китайскую логику. Поэтому даже не буду пытаться повторять, а реализую то, что задумал, как и описал темой раньше. Итак, как работает этот вольтметр.
Вывод на дисплей
- Вывод ведется с фиксированной точкой (в четвертой позиции, т.е. цифра2), поэтому либо 4 цифры отображается, либо все 5. Если отображается только 4, то 1 цикл длится 7.5мс, если же отображается 5 цифр, один цикл составляет около 8.5мс.
- Каждая цифра отображается по 1мс, на чтение уходит около 1.5мс (точнее, там совсем немного уходит на чтение, остальное время МК простаивает).
- Зачем-то китайцы целый такт (1мс) уделили десятичной точке вместо того, чтобы ее вместе со второй цифрой показывать. Ну, как говорится, восток — дело тонкое.
- Число отображается слева-направо (т.е. со старших разрядов к младшим).
АЦП
- Протокол обмена данными с АЦП в точности такой, как и указано в даташите → это точно MCP3421
- Я удивился, но китайцы работают в 16-битном режиме. Поэтому у них и получается квант == 2-3мВ (когда пляшет вывод).
- Судя по тому, что на 12.669В АЦП передал число 11560, а на 5.132В передал 4684, коэффициент K в формуле U=(Data*K)>>15 составляет примерно 35910.
Это значит, что вольтметр калибровали (т.к. "умолчательный" коэффициент равен 35840), а реальный коэффициент ослабления входного напряжения составляет 17.534.
А еще у меня не получилось линейно преобразовать данные в выводимое напряжение, чтобы обоим числам соответствовало то, что показывал дисплей. Варианта два:
- Китайцы делают сложную таблицу калибровки (скажем, через полвольта), внутри каждого интервала свой коэффициент. Но в это верится примерно как в Деда Мороза.
- Китайцы используют float. Это более вероятно. Хотя и противоречит здравому смыслу.
UPD:
К сожалению, чип оказался залоченным от чтения. Но и почему-то не получилось ничего вместо существующей прошивки записать. На "казусе" посоветовали на Vcap припаять микрофарадный кондей. Попробую. Но, боюсь, что не поможет: есть подозрение, что китайцы научились делать одноразовые STM8S003.

no subject
Date: 2015-02-01 04:53 pm (UTC)Хотя в таком простом случае можно обойтись целочисленной арифметикой, в более сложных случаях float гораздо удобнее в практическом смысле.
Вот индикатор на 5 разрядов реально противоречит здравому смыслу, здесь можно оставить и 3 цифры.
no subject
Date: 2015-02-01 05:04 pm (UTC)Ладно еще, пихать float в STM23F4xx, там хоть аппаратная поддержка есть. Но в данном случае это мало того, что оверхед (размер кода несказанно возрастет), так еще и вычисления с плавающей точкой наверняка будут значительно уступать по точности целочисленным вычислениям.
И вообще, float'ы в коде для микроконтроллеров — это отличный индикатор того, что автор что-то делает не так.
Если верить даташиту на АЦП, 3 цифры будет мало. А вот 4 — в самый раз. Пятый разряд — да, он тупо от температуры гулять будет.
А еще зря китайцы выпаяли кондей из входной цепочки. Хотя бы не так сильно скакали показания, что ли.
Похоже, что если они и усредняют входные данные, то очень дохленько...
no subject
Date: 2015-02-01 05:45 pm (UTC)Насчет кода: мне всё равно, насколько возрастает код, если он влезает в память. Точность у плавающей точки достаточно высокая для практически любых задач, решаемых на микроконтроллерах. При этом без float код был бы очень сложным и неподдерживаемым, и очень затратным по времени на написание/отладку.
Например, я совершенно не хочу считать полином функции преобразования термрпары в целых числах (или с фиксированной точкой).
А цифр да, здесь можно было бы сделать 4, но уж никак не 5.
no subject
Date: 2015-02-01 05:46 pm (UTC)Или микроконтроллер сразу же на экранчик отображает температуру?
no subject
Date: 2015-02-01 07:43 pm (UTC)микроконтроллеров — это отличный индикатор
того, что автор что-то делает не так.
вы заблуждаетесь :)
есть множество задач, где float лучше чем городить огороды с целыми.
no subject
Date: 2015-02-01 09:03 pm (UTC)Но у меня нет задач, в которых нужно использовать float на микроконтроллере: нечто вроде этой (амперметр, вольтметр, термометр и т.п. с LED-экранчиком) значительно проще решается целочисленной арифметикой. А в более сложных задачах "голые" данные отправляются на компьютер, а там уже всякие вычисления и проводятся.
Вот, скажем, если бы я писал прошивку для три-, квадро-, пента- и т.п. коптера, то без целочисленной арифметики не обошелся бы никак. Кстати, для меня до сих пор загадка, как стабилизируют полет более чем трех винтов: ведь невозможно однозначно провести плоскость больше, чем через три точки!
no subject
Date: 2015-02-02 12:55 am (UTC)no subject
Date: 2015-02-02 10:12 am (UTC)