[uquote="vovik15",url="/forum/viewtopic.php?p=3456929#p3456929"]А поподробнее насчет сдвига можно?[/uquote]В С есть команды сдвига вправо (>>) и влево (<<), что эквивалентно делению и умножению на 2 столько раз, сколько укажете в операторе. Выполняются за 1 такт. Например, чтобы вычислить среднее значение по сумме 32 измерений достаточно эту сумму сдвинуть вправо 5 раз: srednee=summa>>5. А чтобы целое, например, на 31 разделить, тактов 200 понадобится. А вот умножение в ATmega аппаратное, делается в 2 такта. Ниже пример для АЦП.
Спойлер// ============== чтение АЦП ====
unsigned int get_adc(unsigned char samp, unsigned char sdv) // Измерение АЦП с усреднением по samp результатам
// samp - это 2 в степени sdv
{
unsigned char n;
unsigned long int v;
v=0;
for (n=1;n<=samp;n=n+1)
{
delay_us(10);
ADCSRA|=0x40;
while (ADCSRA&0x40){}
v=v+(unsigned long int)ADCH*500/256;
}
v=v>>sdv; // сумму v делим на количество измерений samp, что эквивалентно сдвигу вправо sdv раз
return (unsigned int)v;
}
vovik15 писал(а):Один сдвиг вправо ... делению на 8?
Сдвиг вправо на 1 бит = делению на 2. Чтобы разделить на 8, надо сдвинуть 3 раза. a=b>>3
Читайте книжки.
[uquote="_abk_",url="/forum/viewtopic.php?p=3456921#p3456921"].[/uquote]
А я вот тыкнул и тыкну ещё. В сети нормально тыкать. В сети наоборот, сначало ТЫ, а вот выканье надо заслужить. Если ты профессор, то пусть выкают студенты, я не студент.
Вселенная бесконечна, интернет безграничен, а ты мне рамки какие то ставишь. Тю.
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3456925#p3456925"]нужно изменить границы измерения ( у нас 1024 отсчета, если делать шаг 5мВ, и от 0, то диапазон будет до 5,12В, думаю это не страшно).[/uquote]
Чтобы сделать другой шаг АЦП, надо подбирать опорник.
[uquote="AndTer",url="/forum/viewtopic.php?p=3456908#p3456908"]А тебе что, солить эти ресурсы и время? Пусть тратится, зато просто и доступно любому школьнику. МК в массы![/uquote]
Ага, а потом тригонометрические функции с точностью в четыре десятичных знака не успевают считать в реальном времени. Потому что понятия не имеют, что их можно посчитать очень быстро хоть на ATTiny, используя только операции сложения и сдвига.
Про массы мы все и так знаем. Когда многомегабайтные программы сжирают гигабайты памяти и грузят смартфон до горячего состояния, выполняя в общем-то совершенно примитивные операции. Зато пипл осознает, что процессор у него медленный, флеш переполнен, оперативки не хватает и бежит покупать очередное чудо инженерной мысли на очередные пару лет.
[uquote="AndTer",url="/forum/viewtopic.php?p=3456950#p3456950"]А я вот тыкнул и тыкну ещё... интернет безграничен...[/uquote] Совершенно согласен с вами, придурков хватает.
[uquote="_abk_",url="/forum/viewtopic.php?p=3456956#p3456956"]придурков хватает.[/uquote]
Самокритика? Похвально! Уважать даже чуток начал!
[uquote="oleg110592",url="/forum/viewtopic.php?p=3456958#p3456958"]компиляторы сейчас умные - деление любимых чисел сдвигом делают:[/uquote]
Я ж сразу написал про ассемблер и про устаревшие подходы.
Они ж в сях не пишут и не знают этого...
Мне не хватило терпения продемонстрировать!
Благодарю!
[uquote="vovik15",url="/forum/viewtopic.php?p=3456945#p3456945"]Один сдвиг вправо кратен делению на 8?[/uquote]
Мда... Печально. Один сдвиг вправо эквивалентен делению на 2. Влево - умножению на 2.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
[uquote="AndTer",url="/forum/viewtopic.php?p=3456950#p3456950"]Чтобы сделать другой шаг АЦП, надо подбирать опорник.[/uquote] нет, достаточно поправить входной делитель так, чтобы при 5,24в на входе делителя, на его выходе получалось напряжение равное напряжению опорника (2,54в вроде).
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3457013#p3457013"]достаточно поправить входной делитель
напряжению опорника (2,54в вроде).[/uquote]
Внутренний опорник у них 1,1В. ТС САМ ПИШЕТ что берёт 2,5В от стабилизатора. Хотя это неверно, стабильность там может оказаться совсем хреновая.
Опорники кстати продаются и вполне доступны.
А касаемо делителя... "Семён Семёныч"(с)
А если хорошенько подумать?
Ну уменьшишь ты значение на входе, оно станет соответствовать опорнику. Ну а чтобы получить реальное надо что сделать? Умножить, на то число, на которое стоит делитель! И что в итоге? А в итоге получатся те же некрасивые и некруглые цифры)
Дискретность измерения можно поменять только опорником.
Нет, ну если ТСу не надо выводить цифры, или он может их округлить то никаких проблем. Но если точно... То только другой опорник.
Один сдвиг вправо - деление на 2. Если сдвигать на 1 бит. Но если сделать скажем 16 измерений и все сложить, а потом
V=sum >> 4;
то сдвиг на 4 бита - деление на 16. К слову новые ATTiny 1-series делают сразу от 1 до 64 измерений и автоматически складывают.
AndTer, а если ещё подумать?
допустим, что опорник уже есть и мы его мы не выбираем, ну пускай он будет 1,1в, не важно, а мы, допустим хотим круглых значений. например диапазон от 0 до 1023в - один вольт= один отсчет. когда у нас на выходе АЦП будет 1023? - когда напряжение на входе >= опорному.
т.е. поставив на вход делитель 1023/1,1 мы получим при входном напряжении 1023в, 1,1в на ноге АЦП и у нас получится требуемый вольтметр. ТСу при опоре 2,5в надо ставить делитель 5,115/2,5 - можно собрать примерно 2/1, а по середине поставить подстроечник, для точной подстройки span.
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
По мне, проще заменить деление умножением, т.е. 176/10 заменить 176*256/10~4506. После умножения на такой коэффициент результат будет в двух старших байтах. Значение 7 разряда младшего байта можно использовать для округления. Для примера Спойлер
подстроечник все равно надо (аппаратный или программный)... резисторы, они такие...
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
для ТС - еще "повысить точность" можно как китайцы, поставив внешний АЦП, аппаратный I2C в применяемом МК (mega168) есть. Пример, правда на STM8:
Прецизионный вольтметр 0-33 вольт с разрешением в 4 разряда после точки https://mysku.ru/blog/ebay/50479.html
там в комментариях есть схема и ссылка на реверс-инжиниринг
Если учесть все советы то получается так: 1. Убрать стабилизатор на2.5, и поставить более точный ион. 2. Расчиать делитель напряжения, и добавить к нему подстроечник для корректировки.3 использовать все 10бит ацп.4 выбрать напряжение кратное 5мв. 1024*5 = 5.12в. 5. В переменную Лонг записать 64 измерения, результат сдвинуть в право 5раз. Вроде как то так. Спасибо всем за советы
зачем лонг? АЦП 10бит да 5 бит - на нахождение среднего значения - в инт влезет.
Добавлено after 22 minutes 35 seconds:
на счет сдвига: тут смотря какая точность нужна, если хватит 5 мв то этот хвост - повышение стабильности измерений, если же нужна точность выше, скажпм 1мв, можно попробовать отнестись к этому числу бережней, например сделать 20 (кратное 5) замеров а потом 2 бита (множитель 4) уйдет на повышение стабильности, а множитешь 5 останется в числе, повышая разрешающую способность...
—————
пока интернета нет, продолжу, о стабильности: эти 2 бита дают точность в 0,25в но нам она не нужна, к тому же эти показания весьма нестабильны, по уму, надо бы создать промежуток, в котором эти показания не дергали бы цифры экрана, пример показывает 5мв. пока этот вольтметр не доберется до 6,0мв мы табло на 6 не переключим и при снижении, пока не опустится до.4,0мв не переключим на 4.
(ну или хотябы 5,75 и 4,25 соответственно, но не 5,5 и 4,5 т.к. тут уже не будет перехлёста и если показания будут около 4,5, то у нас будет табло постоянно дергаться показыввя то 4, то 5).
Для тех, кто не учил магию мир полон физики
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Дело дошло до экспериментов, и появилась погрешность. Измеряю мультиметром входное напряжение, подстраиваю делитель под него,все четко. Но когда напряжение меняется на 3 вольта, то результат измерения отличается от показаний мультиметров на 0.3 вольта. с чем это может быть связано?