Как повысить точность вычисления напряжения
Re: Как повысить точность вычисления напряжения
Непонятно по какой схеме всё подключено, какие номиналы делителя.
Не врёт ли сам мультиметр?
Да много чего.
Только гадать. Приводи схемы, фотки, код, тогда можно подумать.
И да, вот ты пишешь что тебе нужно повысить ТОЧНОСТЬ измерений, при этом поддаёшься на глупости.
Ну зачем тебе применять сдвиг? Зачем? Куда ты денешь такое количество высвободившегося процессорного времени и памяти?
При этом ты не хочешь понять, что применяя сдвиг ты отбрасываешь остаток. Да, можно сдвинуть в другую сторону и сохранить остаток, но и его придётся делить...
Зачем усложнять? А как ты разберёшься в этом коде через год? Два? Ты вспомнишь зачем ты делал такие хитрые манипуляции?
Что может быть проще? Считывай значение АЦП, умножай на 10(чтобы получить 1 знак после запятой при этом не забираясь во флоат, нужно 2 знака? - умножай на 100). Далее выполняй измерения много раз. Сколько позволяет время. 10 раз, 100, 200. Каждый раз прибавляя значение в переменную. Тут инта не хватит, нужен лонг. Далее дели на это количество раз. И получишь значение в 10(100) раз большее чем реальное. Т.е. последняя цифра это будет десятая или сотая соответственно часть! Подели + получи остаток. В итоге ты повысишь точность измерения.
Не врёт ли сам мультиметр?
Да много чего.
Только гадать. Приводи схемы, фотки, код, тогда можно подумать.
И да, вот ты пишешь что тебе нужно повысить ТОЧНОСТЬ измерений, при этом поддаёшься на глупости.
Ну зачем тебе применять сдвиг? Зачем? Куда ты денешь такое количество высвободившегося процессорного времени и памяти?
При этом ты не хочешь понять, что применяя сдвиг ты отбрасываешь остаток. Да, можно сдвинуть в другую сторону и сохранить остаток, но и его придётся делить...
Зачем усложнять? А как ты разберёшься в этом коде через год? Два? Ты вспомнишь зачем ты делал такие хитрые манипуляции?
Что может быть проще? Считывай значение АЦП, умножай на 10(чтобы получить 1 знак после запятой при этом не забираясь во флоат, нужно 2 знака? - умножай на 100). Далее выполняй измерения много раз. Сколько позволяет время. 10 раз, 100, 200. Каждый раз прибавляя значение в переменную. Тут инта не хватит, нужен лонг. Далее дели на это количество раз. И получишь значение в 10(100) раз большее чем реальное. Т.е. последняя цифра это будет десятая или сотая соответственно часть! Подели + получи остаток. В итоге ты повысишь точность измерения.
Глупый не задает вопросы. Глупый и так все знает.
- Реклама
Re: Как повысить точность вычисления напряжения
Я не могу понять как это будет работать? Я делаю первое измерение, умножаю на 10. Дальше к тому что получится я должен прибавить 100 измерений, и потом все это разделить на 100. И к тому что получилось прибавить остаток от деления. Так получается? Я все правильно понял?
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Как повысить точность вычисления напряжения
На диапазон 0 - 4.5В у нас значение АЦП меняется от 0 до 0x3FF. 1024 значений, включая 0. Значит единица АЦП у нас будет примерно равна 4.4мВ. Причем на максимальном напряжении 4.5В мы получим так 4.5012В. То бишь, с таким округлением имеем абсолютную величину ошибки порядка 1мВ.
Теперь, если мы не хотим использовать плавающую запятую, то мы должны учесть, что результат АЦП, умноженный на 44 есть результат в десятых милливольт. А значит, при выводе результата в вольтах мы должны:
1. Вставить десятичную точку перед четвертым десятичным разрядом справа.
2. Убрать младший разряд, так как он совершенно не точный, оставив только три знака после десятичной точки.
После того, как мы сложили в uint16_t 64 взятых подряд значения АЦП и сдвинули результат вправо на 6 бит, мы должны умножить его на 44, вывести это произведение в строку в десятичном виде, дополнить до 5 байт получившуюся строку нулями слева, выбросить младший разряд, получив результат в милливольтах. Дальше - уже смотря куда результат выводите.
Теперь, если мы не хотим использовать плавающую запятую, то мы должны учесть, что результат АЦП, умноженный на 44 есть результат в десятых милливольт. А значит, при выводе результата в вольтах мы должны:
1. Вставить десятичную точку перед четвертым десятичным разрядом справа.
2. Убрать младший разряд, так как он совершенно не точный, оставив только три знака после десятичной точки.
После того, как мы сложили в uint16_t 64 взятых подряд значения АЦП и сдвинули результат вправо на 6 бит, мы должны умножить его на 44, вывести это произведение в строку в десятичном виде, дополнить до 5 байт получившуюся строку нулями слева, выбросить младший разряд, получив результат в милливольтах. Дальше - уже смотря куда результат выводите.
Re: Как повысить точность вычисления напряжения
лонг =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
И если хочешь быстрее получить результат, показывай схему с номиналами и приводи код который ты написал.
Коллективным разумом найдём ошибки.
цикл от 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
И если хочешь быстрее получить результат, показывай схему с номиналами и приводи код который ты написал.
Коллективным разумом найдём ошибки.
Глупый не задает вопросы. Глупый и так все знает.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как повысить точность вычисления напряжения
Еще вариант - вольтметр на микроконтроллере, отсюда
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...
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...
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Как повысить точность вычисления напряжения
но ведь у топикстартера мега168, все проблемы решаются на ура при помощи float, а по теме избавления от него уже 3 страницы исписано!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как повысить точность вычисления напряжения
дык у него в первом посте написано - "Float использовать не буду, он отнимает много ресурсов". Может ресурсы чем то заняты. И опять если вольтметров много надо будет - например раздать друзьям и знакомым - может перейти на мегу48 или тини13.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Как повысить точность вычисления напряжения
дык что написано - читал. написал человек по неопытности...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Как повысить точность вычисления напряжения
[uquote="ARV",url="/forum/viewtopic.php?p=3458456#p3458456"]дык что написано - читал. написал человек по неопытности...[/uquote]
Смысл в использовании чисел с плавающей запятой возникает очень редко. В частных случаях можно обойтись в явном виде целочисленной арифметикой. В общем случае, почти всегда достаточно libfixmath.
Смысл в использовании чисел с плавающей запятой возникает очень редко. В частных случаях можно обойтись в явном виде целочисленной арифметикой. В общем случае, почти всегда достаточно libfixmath.
Re: Как повысить точность вычисления напряжения
Не совсем по неопытности,светодиодом я уже умею мигать
а если серьезно, код пишется на мега 168 потому что она стоит на отладочный плате. Дальше он будет перенесен на тини.Спасибо вам за разъяснения, вечером буду проводить эксперименты. А результат измерения должен по запросу уходить на компьютер
Последний раз редактировалось vovik15 Пн сен 17, 2018 08:40:03, всего редактировалось 1 раз.
Re: Как повысить точность вычисления напряжения
[uquote="oleg110592",url="/forum/viewtopic.php?p=3458423#p3458423"]В нашем случае используется внутренний ИОН на 2,56 В.
при напряжении в 30 В на входе делителя напряжение на входе АЦП не превышало 2,56 В.[/uquote]
Требования ТС читал? Ты откуда взял эти цифры вообще?
Зачем так много вычислений?
И ты пробовал для своего вычисления принять РЕАЛЬНОЕ напряжение, например взять то же что и у меня в примере?
при напряжении в 30 В на входе делителя напряжение на входе АЦП не превышало 2,56 В.[/uquote]
Требования ТС читал? Ты откуда взял эти цифры вообще?
Зачем так много вычислений?
И ты пробовал для своего вычисления принять РЕАЛЬНОЕ напряжение, например взять то же что и у меня в примере?
Глупый не задает вопросы. Глупый и так все знает.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как повысить точность вычисления напряжения
1) да
2) по ссылке, формулы легко пересчитать под свою задачу
3) формула из даташита такая же, только делят на 1024
4) да (1023 *3096)/1023=30.96 Вольт, что совпадает
по ссылке есть таблица реальных измерений
2) по ссылке, формулы легко пересчитать под свою задачу
3) формула из даташита такая же, только делят на 1024
4) да (1023 *3096)/1023=30.96 Вольт, что совпадает
по ссылке есть таблица реальных измерений
Re: Как повысить точность вычисления напряжения
1) не читал. У него 2,5В ион и 4,5В макс входное.
2) Ты уверен что он способен?
3) При чём тут даташит?
4) При чём тут 30,96?
2) Ты уверен что он способен?
3) При чём тут даташит?
4) При чём тут 30,96?
Глупый не задает вопросы. Глупый и так все знает.
-
solarLight
- Родился
- Сообщения: 3
- Зарегистрирован: Пт сен 22, 2017 05:29:31
Re: Как повысить точность вычисления напряжения
[uquote="AndTer",url="/forum/viewtopic.php?p=3457972#p3457972"]Что может быть проще? Считывай значение АЦП, умножай на 10(чтобы получить 1 знак после запятой при этом не забираясь во флоат, нужно 2 знака? - умножай на 100). Далее выполняй измерения много раз. Сколько позволяет время. 10 раз, 100, 200. Каждый раз прибавляя значение в переменную. Тут инта не хватит, нужен лонг. Далее дели на это количество раз. И получишь значение в 10(100) раз большее чем реальное. Т.е. последняя цифра это будет десятая или сотая соответственно часть! Подели + получи остаток. В итоге ты повысишь точность измерения.[/uquote] Что за бред. Никакую точность таким способом не повысишь. После суммирования 100 измерений, умноженных на 10, сумма будет оканчиваться на три нуля. Нашел среднее (поделил на 100) - в конце полученного числа будет НОЛЬ.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как повысить точность вычисления напряжения
[uquote="oleg110592",url="/forum/viewtopic.php?p=3458512#p3458512"]пересчитать можно легко под свою задачу[/uquote]
Думаю да, потому что если чел задаёт такие вопросы, то наверное пересчитать он врядли сможет.
Откуда у него вылезла ошибка в 0,3В?
Думаю да, потому что если чел задаёт такие вопросы, то наверное пересчитать он врядли сможет.
Откуда у него вылезла ошибка в 0,3В?
Глупый не задает вопросы. Глупый и так все знает.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как повысить точность вычисления напряжения
мой вольтметр на тини13 ошибочность в протеусе 10мВ обеспечивал
:

по формуле V=(ADC*125)/256, реально точным вольтметром не проверял.
А так в интернете есть поверки китайских копеечных вольтметров на стм, холтек - там ошибочность присутствует, но хоть один из резисторов делителя у них обычно точный. При динамической индикации все шумит, говорили тут - надо бы АЦП-ировать во сне или в промежутках. Там в меге168 еще цифровые каналы от АЦП можно отключать.
по формуле V=(ADC*125)/256, реально точным вольтметром не проверял.
А так в интернете есть поверки китайских копеечных вольтметров на стм, холтек - там ошибочность присутствует, но хоть один из резисторов делителя у них обычно точный. При динамической индикации все шумит, говорили тут - надо бы АЦП-ировать во сне или в промежутках. Там в меге168 еще цифровые каналы от АЦП можно отключать.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Как повысить точность вычисления напряжения
с чего вдруг? на один 0 будет заканчиваться гарантированно, а там - как повезет, может и на 2 и даже 3...solarLight писал(а):После суммирования 100 измерений, умноженных на 10, сумма будет оканчиваться на три нуля.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Как повысить точность вычисления напряжения
[uquote="solarLight",url="/forum/viewtopic.php?p=3458510#p3458510"]Что за бред.
После суммирования 100 измерений, умноженных на 10, сумма будет оканчиваться на три нуля.
Нашел среднее (поделил на 100) - в конце полученного числа будет НОЛЬ.[/uquote]
Действительно, что за бред?
Измерений может быть не 100, а 25, а может 3. Поэтому эти нули считать не надо.
А измерения умноженные на 10/100 помогут не потерять в дальнейшем десятую/сотую часть числа.
Чтобы все умножения и деления делать с одним числом, а только при выводе отделить десятые/сотые доли.
И да, за год 3 сообщения два из которых здесь. Чей клон на раскрутке?
Клон _abk_ уже забаннненого за "срачь" на главной странице. aen
Добавлено after 7 minutes 38 seconds:
[uquote="oleg110592",url="/forum/viewtopic.php?p=3458587#p3458587"]мой вольтметр на тини13 ошибочность в протеусе 10мВ обеспечивал
:[/uquote]
Небольшой офф. А на сколько дешевле и компактней ипользовать тини+регистр вместо мк покрупнее?
Просто интересно.
После суммирования 100 измерений, умноженных на 10, сумма будет оканчиваться на три нуля.
Нашел среднее (поделил на 100) - в конце полученного числа будет НОЛЬ.[/uquote]
Действительно, что за бред?
Измерений может быть не 100, а 25, а может 3. Поэтому эти нули считать не надо.
А измерения умноженные на 10/100 помогут не потерять в дальнейшем десятую/сотую часть числа.
Чтобы все умножения и деления делать с одним числом, а только при выводе отделить десятые/сотые доли.
И да, за год 3 сообщения два из которых здесь. Чей клон на раскрутке?
Клон _abk_ уже забаннненого за "срачь" на главной странице. aen
Добавлено after 7 minutes 38 seconds:
[uquote="oleg110592",url="/forum/viewtopic.php?p=3458587#p3458587"]мой вольтметр на тини13 ошибочность в протеусе 10мВ обеспечивал
Небольшой офф. А на сколько дешевле и компактней ипользовать тини+регистр вместо мк покрупнее?
Просто интересно.
Глупый не задает вопросы. Глупый и так все знает.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25


