Обсуждаем контроллеры компании Atmel.
Ответить

Re: Как повысить точность вычисления напряжения

Вс сен 16, 2018 17:41:18

Непонятно по какой схеме всё подключено, какие номиналы делителя.
Не врёт ли сам мультиметр?
Да много чего.
Только гадать. Приводи схемы, фотки, код, тогда можно подумать.

И да, вот ты пишешь что тебе нужно повысить ТОЧНОСТЬ измерений, при этом поддаёшься на глупости.
Ну зачем тебе применять сдвиг? Зачем? Куда ты денешь такое количество высвободившегося процессорного времени и памяти?
При этом ты не хочешь понять, что применяя сдвиг ты отбрасываешь остаток. Да, можно сдвинуть в другую сторону и сохранить остаток, но и его придётся делить...
Зачем усложнять? А как ты разберёшься в этом коде через год? Два? Ты вспомнишь зачем ты делал такие хитрые манипуляции?
Что может быть проще? Считывай значение АЦП, умножай на 10(чтобы получить 1 знак после запятой при этом не забираясь во флоат, нужно 2 знака? - умножай на 100). Далее выполняй измерения много раз. Сколько позволяет время. 10 раз, 100, 200. Каждый раз прибавляя значение в переменную. Тут инта не хватит, нужен лонг. Далее дели на это количество раз. И получишь значение в 10(100) раз большее чем реальное. Т.е. последняя цифра это будет десятая или сотая соответственно часть! Подели + получи остаток. В итоге ты повысишь точность измерения.

Re: Как повысить точность вычисления напряжения

Вс сен 16, 2018 20:39:03

Я не могу понять как это будет работать? Я делаю первое измерение, умножаю на 10. Дальше к тому что получится я должен прибавить 100 измерений, и потом все это разделить на 100. И к тому что получилось прибавить остаток от деления. Так получается? Я все правильно понял?

Re: Как повысить точность вычисления напряжения

Вс сен 16, 2018 21:43:43

На диапазон 0 - 4.5В у нас значение АЦП меняется от 0 до 0x3FF. 1024 значений, включая 0. Значит единица АЦП у нас будет примерно равна 4.4мВ. Причем на максимальном напряжении 4.5В мы получим так 4.5012В. То бишь, с таким округлением имеем абсолютную величину ошибки порядка 1мВ.
Теперь, если мы не хотим использовать плавающую запятую, то мы должны учесть, что результат АЦП, умноженный на 44 есть результат в десятых милливольт. А значит, при выводе результата в вольтах мы должны:
1. Вставить десятичную точку перед четвертым десятичным разрядом справа.
2. Убрать младший разряд, так как он совершенно не точный, оставив только три знака после десятичной точки.

После того, как мы сложили в uint16_t 64 взятых подряд значения АЦП и сдвинули результат вправо на 6 бит, мы должны умножить его на 44, вывести это произведение в строку в десятичном виде, дополнить до 5 байт получившуюся строку нулями слева, выбросить младший разряд, получив результат в милливольтах. Дальше - уже смотря куда результат выводите.

Re: Как повысить точность вычисления напряжения

Вс сен 16, 2018 22:51:29

лонг =0 // гарантированно обнуляем
цикл от 1 до 100 включительно // Можно от 0 до 99, кому как нравится. Если надо больше/меньше соответственно меняем количество итераций.
{ лонг = лонг + значение адц * 10} // суммируем 100 измерений
лонг = лонг/100 // получаем среднее значение от 100 измерений(если другое количество то делим на количество итераций цикла)

При этом полученное значение будет в 10 раз больше(чтобы не используя флоат не потерять десятую долю). Последняя цифра собственно это десятая доля.
Допустим получилось 7857. Это значит что среднее значение преобразованного значения равно 785,7 Умножаем на значение шага АЦП в мВ. Если ты привёл делителем из расчёта 5,115В на входе - 2,5В на выходе. Единица будет равна 5,115/1023=0,005мВ. Нам не нужен флоат? Значит множим не на 0,005в, а на 5мВ.
7857*5=39285
Далее запятая перемещается на три позиции для перехода в вольты. Т.е. 39,280. Но так как значения изначально умножали на 10, то смещаем запятую ещё на 1 позицию. Получаем 3,9285В.
Т.е. 39285/10000 будет равно 3.
А остаток от деления 9285
Выводим на дисплей: sprintf(куда,"%i.%i",3,9285)
На дисплее получим: 3.9285

И если хочешь быстрее получить результат, показывай схему с номиналами и приводи код который ты написал.
Коллективным разумом найдём ошибки.

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 07:25:05

Еще вариант - вольтметр на микроконтроллере, отсюда
http://chipenable.ru/index.php/programm ... llere.html
Результат преобразования АЦП накапливается 8 раз в переменной, усредняется и записывается в программный буфер. В исходнике применяется сдвиг на 3.
Как вычисляется напряжение:
Диапазон входных напряжений АЦП определяется источником опорного напряжения (ИОН). В нашем случае используется внутренний ИОН на 2,56 В. Для расширения диапазона измеряемых напряжений я поставил перед АЦП резистивный делитель. Он рассчитан таким образом, чтобы при напряжении в 30 В на входе делителя напряжение на входе АЦП не превышало 2,56 В.

Uadc = Uin*R14/(R14 + R15) = 30В*82 /(82 + 910) = 2,48 В

Чтобы вычислить напряжение на входе вольтметра нужно результат преобразования АЦП пересчитать в напряжение и домножить на коэффициент

(R14 + R15)/R14 = 992/82

Напряжение на входе АЦП - Uadc вычисляется по формуле:

Uadc = value * 2,56/(2^n – 1),

где n – разрядность АЦП, value – цифровое значение напряжения

Отсюда напряжение на входе вольтметра будет равно:

Uin = (value * 2,56 * 992)/(82 * 1023) = (value * 30,96)/1023

Чтобы не связываться с типом float и при этом иметь возможность вычислять напряжение с точностью до 2-ух знаков после запятой, числитель этой формулы я домножил на 100

Uin = (value * 3096)/1023

еще, там же, способы повышения разрешения АЦП:
http://chipenable.ru/index.php/programm ... ation.html
http://chipenable.ru/index.php/programm ... ation.html

з.ы. да раньше на ассемблере вольтметры делали без лонгов хватало вордов - влазило в тини13/15.
Например если Vref=5.00В, формула напряжения:
V=(ADC*500)/1024
можно сократить на 4
V=(ADC*125)/256
сложить 125 раз и сдвинуть на 8...

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 07:53:24

но ведь у топикстартера мега168, все проблемы решаются на ура при помощи float, а по теме избавления от него уже 3 страницы исписано!

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 08:03:11

дык у него в первом посте написано - "Float использовать не буду, он отнимает много ресурсов". Может ресурсы чем то заняты. И опять если вольтметров много надо будет - например раздать друзьям и знакомым - может перейти на мегу48 или тини13.

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 08:13:22

дык что написано - читал. написал человек по неопытности...

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 08:33:23

дык что написано - читал. написал человек по неопытности...

Смысл в использовании чисел с плавающей запятой возникает очень редко. В частных случаях можно обойтись в явном виде целочисленной арифметикой. В общем случае, почти всегда достаточно libfixmath.

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 08:35:48

Не совсем по неопытности,светодиодом я уже умею мигать :) а если серьезно, код пишется на мега 168 потому что она стоит на отладочный плате. Дальше он будет перенесен на тини.Спасибо вам за разъяснения, вечером буду проводить эксперименты. А результат измерения должен по запросу уходить на компьютер
Последний раз редактировалось vovik15 Пн сен 17, 2018 08:40:03, всего редактировалось 1 раз.

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 08:38:55

В нашем случае используется внутренний ИОН на 2,56 В.
при напряжении в 30 В на входе делителя напряжение на входе АЦП не превышало 2,56 В.

Требования ТС читал? Ты откуда взял эти цифры вообще?
Зачем так много вычислений?
И ты пробовал для своего вычисления принять РЕАЛЬНОЕ напряжение, например взять то же что и у меня в примере?

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 08:53:24

1) да
2) по ссылке, формулы легко пересчитать под свою задачу
3) формула из даташита такая же, только делят на 1024
4) да (1023 *3096)/1023=30.96 Вольт, что совпадает
по ссылке есть таблица реальных измерений

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 08:58:13

1) не читал. У него 2,5В ион и 4,5В макс входное.
2) Ты уверен что он способен?
3) При чём тут даташит?
4) При чём тут 30,96?

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 09:07:01

Что может быть проще? Считывай значение АЦП, умножай на 10(чтобы получить 1 знак после запятой при этом не забираясь во флоат, нужно 2 знака? - умножай на 100). Далее выполняй измерения много раз. Сколько позволяет время. 10 раз, 100, 200. Каждый раз прибавляя значение в переменную. Тут инта не хватит, нужен лонг. Далее дели на это количество раз. И получишь значение в 10(100) раз большее чем реальное. Т.е. последняя цифра это будет десятая или сотая соответственно часть! Подели + получи остаток. В итоге ты повысишь точность измерения.
Что за бред. Никакую точность таким способом не повысишь. После суммирования 100 измерений, умноженных на 10, сумма будет оканчиваться на три нуля. Нашел среднее (поделил на 100) - в конце полученного числа будет НОЛЬ.

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 09:11:28

...

1) мне пересчитать? ТС не просил.
2) да
3)
Изображение
4) приведен пример (мною) - там это максимальное напряжение, повторюсь - пересчитать можно легко под свою задачу

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 10:01:24

пересчитать можно легко под свою задачу

Думаю да, потому что если чел задаёт такие вопросы, то наверное пересчитать он врядли сможет.
Откуда у него вылезла ошибка в 0,3В?

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 10:26:34

мой вольтметр на тини13 ошибочность в протеусе 10мВ обеспечивал :) :
Изображение
по формуле V=(ADC*125)/256, реально точным вольтметром не проверял.
А так в интернете есть поверки китайских копеечных вольтметров на стм, холтек - там ошибочность присутствует, но хоть один из резисторов делителя у них обычно точный. При динамической индикации все шумит, говорили тут - надо бы АЦП-ировать во сне или в промежутках. Там в меге168 еще цифровые каналы от АЦП можно отключать.

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 10:28:24

solarLight писал(а):После суммирования 100 измерений, умноженных на 10, сумма будет оканчиваться на три нуля.
с чего вдруг? на один 0 будет заканчиваться гарантированно, а там - как повезет, может и на 2 и даже 3...

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 10:44:02

Что за бред.
После суммирования 100 измерений, умноженных на 10, сумма будет оканчиваться на три нуля.
Нашел среднее (поделил на 100) - в конце полученного числа будет НОЛЬ.

Действительно, что за бред?
Измерений может быть не 100, а 25, а может 3. Поэтому эти нули считать не надо.
А измерения умноженные на 10/100 помогут не потерять в дальнейшем десятую/сотую часть числа.
Чтобы все умножения и деления делать с одним числом, а только при выводе отделить десятые/сотые доли.

И да, за год 3 сообщения два из которых здесь. Чей клон на раскрутке?
Клон _abk_ уже забаннненого за "срачь" на главной странице. aen

Добавлено after 7 minutes 38 seconds:
мой вольтметр на тини13 ошибочность в протеусе 10мВ обеспечивал :) :

Небольшой офф. А на сколько дешевле и компактней ипользовать тини+регистр вместо мк покрупнее?
Просто интересно.

Re: Как повысить точность вычисления напряжения

Пн сен 17, 2018 10:56:36

было время на PIC было дешевле (тут термометр, но на базе был и вольтметр):
Изображение
потом на тини13+регистр стало дешевле, потом stm8 tssop-20, теперь сверхдешевый Нувотон N76E003 tssop-20, до вольт пока не дошло, но АЦП там 12-бит
Ответить