eddy_em: (Костерок)
[personal profile] eddy_em
На "казусе" попросили снять протоколы. Снял.
Снимаю данные по I2C
Вот так это происходило



Продублирую здесь высказанное на казусе.
Похоже, мне никогда не удастся понять китайскую логику. Поэтому даже не буду пытаться повторять, а реализую то, что задумал, как и описал темой раньше. Итак, как работает этот вольтметр.
Вывод на дисплей

  1. Вывод ведется с фиксированной точкой (в четвертой позиции, т.е. цифра2), поэтому либо 4 цифры отображается, либо все 5. Если отображается только 4, то 1 цикл длится 7.5мс, если же отображается 5 цифр, один цикл составляет около 8.5мс.

  2. Каждая цифра отображается по 1мс, на чтение уходит около 1.5мс (точнее, там совсем немного уходит на чтение, остальное время МК простаивает).

  3. Зачем-то китайцы целый такт (1мс) уделили десятичной точке вместо того, чтобы ее вместе со второй цифрой показывать. Ну, как говорится, восток — дело тонкое.

  4. Число отображается слева-направо (т.е. со старших разрядов к младшим).

АЦП

  1. Протокол обмена данными с АЦП в точности такой, как и указано в даташите → это точно MCP3421

  2. Я удивился, но китайцы работают в 16-битном режиме. Поэтому у них и получается квант == 2-3мВ (когда пляшет вывод).

  3. Судя по тому, что на 12.669В АЦП передал число 11560, а на 5.132В передал 4684, коэффициент K в формуле U=(Data*K)>>15 составляет примерно 35910.
    Это значит, что вольтметр калибровали (т.к. "умолчательный" коэффициент равен 35840), а реальный коэффициент ослабления входного напряжения составляет 17.534.

А еще у меня не получилось линейно преобразовать данные в выводимое напряжение, чтобы обоим числам соответствовало то, что показывал дисплей. Варианта два:

  1. Китайцы делают сложную таблицу калибровки (скажем, через полвольта), внутри каждого интервала свой коэффициент. Но в это верится примерно как в Деда Мороза.

  2. Китайцы используют float. Это более вероятно. Хотя и противоречит здравому смыслу.




UPD:
К сожалению, чип оказался залоченным от чтения. Но и почему-то не получилось ничего вместо существующей прошивки записать. На "казусе" посоветовали на Vcap припаять микрофарадный кондей. Попробую. Но, боюсь, что не поможет: есть подозрение, что китайцы научились делать одноразовые STM8S003.

Date: 2015-02-01 05:04 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Потому что это восьмибитный микроконтроллер без аппаратной поддержки float!
Ладно еще, пихать float в STM23F4xx, там хоть аппаратная поддержка есть. Но в данном случае это мало того, что оверхед (размер кода несказанно возрастет), так еще и вычисления с плавающей точкой наверняка будут значительно уступать по точности целочисленным вычислениям.
И вообще, float'ы в коде для микроконтроллеров — это отличный индикатор того, что автор что-то делает не так.
Если верить даташиту на АЦП, 3 цифры будет мало. А вот 4 — в самый раз. Пятый разряд — да, он тупо от температуры гулять будет.
А еще зря китайцы выпаяли кондей из входной цепочки. Хотя бы не так сильно скакали показания, что ли.
Похоже, что если они и усредняют входные данные, то очень дохленько...

Date: 2015-02-01 05:45 pm (UTC)
From: [identity profile] 32bit-me.livejournal.com
float, это нормально, и не только в F4. Я отлично использовал float в коде для Cortex M3, без аппаратной поддержки, при этом размер кода и всё прочее было в рамках разумного.
Насчет кода: мне всё равно, насколько возрастает код, если он влезает в память. Точность у плавающей точки достаточно высокая для практически любых задач, решаемых на микроконтроллерах. При этом без float код был бы очень сложным и неподдерживаемым, и очень затратным по времени на написание/отладку.
Например, я совершенно не хочу считать полином функции преобразования термрпары в целых числах (или с фиксированной точкой).
А цифр да, здесь можно было бы сделать 4, но уж никак не 5.

Date: 2015-02-01 05:46 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Зачем считать полином на микроконтроллере, если для этого есть компьютер?
Или микроконтроллер сразу же на экранчик отображает температуру?

Date: 2015-02-02 12:55 am (UTC)
From: [identity profile] 32bit-me.livejournal.com
Да, отображает, и еще много чего другого считает и отображает.

Date: 2015-02-01 07:43 pm (UTC)
From: [identity profile] alex-avr2.livejournal.com
>>И вообще, float'ы в коде для
микроконтроллеров — это отличный индикатор
того, что автор что-то делает не так.

вы заблуждаетесь :)
есть множество задач, где float лучше чем городить огороды с целыми.

Date: 2015-02-01 09:03 pm (UTC)
From: [identity profile] eddy-em.livejournal.com
Возможно.
Но у меня нет задач, в которых нужно использовать float на микроконтроллере: нечто вроде этой (амперметр, вольтметр, термометр и т.п. с LED-экранчиком) значительно проще решается целочисленной арифметикой. А в более сложных задачах "голые" данные отправляются на компьютер, а там уже всякие вычисления и проводятся.

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

Date: 2015-02-02 10:12 am (UTC)
From: [identity profile] alex-avr2.livejournal.com
Ну, то что нет задач - не значит что все остальные использующие float - идиоты :)

October 2025

S M T W T F S
   1234
567 89 1011
121314 15161718
19202122232425
2627 28293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 2nd, 2026 07:14 pm
Powered by Dreamwidth Studios