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

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

Пт сен 14, 2018 16:43:17

А поподробнее насчет сдвига можно?
В С есть команды сдвига вправо (>>) и влево (<<), что эквивалентно делению и умножению на 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
Читайте книжки.

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

Пт сен 14, 2018 16:43:30

.

А я вот тыкнул и тыкну ещё. В сети нормально тыкать. В сети наоборот, сначало ТЫ, а вот выканье надо заслужить. Если ты профессор, то пусть выкают студенты, я не студент.
Вселенная бесконечна, интернет безграничен, а ты мне рамки какие то ставишь. Тю.

нужно изменить границы измерения ( у нас 1024 отсчета, если делать шаг 5мВ, и от 0, то диапазон будет до 5,12В, думаю это не страшно).

Чтобы сделать другой шаг АЦП, надо подбирать опорник.

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

Пт сен 14, 2018 16:47:51

А тебе что, солить эти ресурсы и время? Пусть тратится, зато просто и доступно любому школьнику. МК в массы!

Ага, а потом тригонометрические функции с точностью в четыре десятичных знака не успевают считать в реальном времени. Потому что понятия не имеют, что их можно посчитать очень быстро хоть на ATTiny, используя только операции сложения и сдвига.

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

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

Пт сен 14, 2018 16:50:52

А я вот тыкнул и тыкну ещё... интернет безграничен...
Совершенно согласен с вами, придурков хватает.

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

Пт сен 14, 2018 16:54:33

компиляторы сейчас умные - деление любимых чисел сдвигом делают:
Код:
    unsigned int sumADC = 0;
    for (i=0; i<32; i++)
    {
        sumADC += readADC(6);
    }
    sumADC /= 32;

листинг:
Код:
sumADC /= 32;
  a4:   89 81          ldd   r24, Y+1   ; 0x01
  a6:   9a 81          ldd   r25, Y+2   ; 0x02
  a8:   25 e0          ldi   r18, 0x05   ; 5
  aa:   96 95          lsr   r25
  ac:   87 95          ror   r24
  ae:   2a 95          dec   r18
  b0:   e1 f7          brne   .-8         ; 0xaa <main+0x24>
  b2:   9a 83          std   Y+2, r25   ; 0x02
  b4:   89 83          std   Y+1, r24   ; 0x01

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

Пт сен 14, 2018 17:13:59

придурков хватает.

Самокритика? Похвально! Уважать даже чуток начал!

компиляторы сейчас умные - деление любимых чисел сдвигом делают:

Я ж сразу написал про ассемблер и про устаревшие подходы.
Они ж в сях не пишут и не знают этого...
Мне не хватило терпения продемонстрировать!
Благодарю!

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

Пт сен 14, 2018 18:01:25

Один сдвиг вправо кратен делению на 8?

Мда... Печально. Один сдвиг вправо эквивалентен делению на 2. Влево - умножению на 2.

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

Пт сен 14, 2018 18:34:09

Чтобы сделать другой шаг АЦП, надо подбирать опорник.
нет, достаточно поправить входной делитель так, чтобы при 5,24в на входе делителя, на его выходе получалось напряжение равное напряжению опорника (2,54в вроде).

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

Пт сен 14, 2018 22:23:07

достаточно поправить входной делитель
напряжению опорника (2,54в вроде).

Внутренний опорник у них 1,1В. ТС САМ ПИШЕТ что берёт 2,5В от стабилизатора. Хотя это неверно, стабильность там может оказаться совсем хреновая.
Опорники кстати продаются и вполне доступны.

А касаемо делителя... "Семён Семёныч"(с) :facepalm:
А если хорошенько подумать?
Ну уменьшишь ты значение на входе, оно станет соответствовать опорнику. Ну а чтобы получить реальное надо что сделать? Умножить, на то число, на которое стоит делитель! И что в итоге? А в итоге получатся те же некрасивые и некруглые цифры)
Дискретность измерения можно поменять только опорником.
Нет, ну если ТСу не надо выводить цифры, или он может их округлить то никаких проблем. Но если точно... То только другой опорник.

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

Сб сен 15, 2018 00:53:25

Один сдвиг вправо - деление на 2. Если сдвигать на 1 бит. Но если сделать скажем 16 измерений и все сложить, а потом
V=sum >> 4;
то сдвиг на 4 бита - деление на 16. К слову новые ATTiny 1-series делают сразу от 1 до 64 измерений и автоматически складывают.

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

Сб сен 15, 2018 03:52:28

AndTer, а если ещё подумать? :))
допустим, что опорник уже есть и мы его мы не выбираем, ну пускай он будет 1,1в, не важно, а мы, допустим хотим круглых значений. например диапазон от 0 до 1023в - один вольт= один отсчет. когда у нас на выходе АЦП будет 1023? - когда напряжение на входе >= опорному.
т.е. поставив на вход делитель 1023/1,1 мы получим при входном напряжении 1023в, 1,1в на ноге АЦП и у нас получится требуемый вольтметр.
ТСу при опоре 2,5в надо ставить делитель 5,115/2,5 - можно собрать примерно 2/1, а по середине поставить подстроечник, для точной подстройки span.

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

Сб сен 15, 2018 06:59:28

По мне, проще заменить деление умножением, т.е. 176/10 заменить 176*256/10~4506. После умножения на такой коэффициент результат будет в двух старших байтах. Значение 7 разряда младшего байта можно использовать для округления. Для примера

Спойлер
Код:
   .INCLUDE "2313def.inc"

   .CSEG

   START:
      LDI   R31,LOW(RAMEND)
      OUT   SPL,R31

      LDS   R7,$63
      LDS   R8,$64
      LDS   R9,$65      ; Занесение множимого (опция)

      LDS   R17,$72
      LDS   R18,$73
      LDS   R19,$74      ; Занесение множителя (опция)

      RCALL   MULT
      RJMP    START
;************************************************
; Для получения корректного результата сумма разрядов множимого и множителя должна быть меньше 24
; R7...R9-MNOGIMOE,R17...R19-MNOGITEL,R27...R29-RESULT
; ZL(R30)-TEMP
;************************************************
MULT:
   LDI   ZL,24   ; установить счетчик сдвигов
   CLR   ZH
      
   CLR   R27
   CLR   R28
   CLR   R29   ; начальное значение результата
OBRAT:
   LSR   R17
   ROR   R18
   ROR   R19      ; показать значение младшего разряда множителя в С,
   BRCC   NO_SUMMIR   ; С=0 пропустить суммирование
SUMMIR:
               ; С=1 суммировать значение множимого с частичным результатом
   ADD   R29,R9
   ADC   R28,R8
   ADC   R27,R7
NO_SUMMIR:
   LSL   R9
   ROL   R8
   ROL   R7

   DEC   ZL
   BRNE   OBRAT

   LSL   R29
   ADC   R28,ZH
   ADC   R27,ZH
   
      RET
;**********************************************************************

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

Сб сен 15, 2018 07:02:02

подстроечник все равно надо (аппаратный или программный)... резисторы, они такие...

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

Сб сен 15, 2018 07:16:06

для ТС - еще "повысить точность" можно как китайцы, поставив внешний АЦП, аппаратный I2C в применяемом МК (mega168) есть. Пример, правда на STM8:
Прецизионный вольтметр 0-33 вольт с разрешением в 4 разряда после точки
https://mysku.ru/blog/ebay/50479.html
там в комментариях есть схема и ссылка на реверс-инжиниринг

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

Сб сен 15, 2018 18:08:30

Если учесть все советы то получается так: 1. Убрать стабилизатор на2.5, и поставить более точный ион. 2. Расчиать делитель напряжения, и добавить к нему подстроечник для корректировки.3 использовать все 10бит ацп.4 выбрать напряжение кратное 5мв. 1024*5 = 5.12в. 5. В переменную Лонг записать 64 измерения, результат сдвинуть в право 5раз. Вроде как то так. Спасибо всем за советы

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

Сб сен 15, 2018 19:17:45

зачем лонг? АЦП 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).

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

Сб сен 15, 2018 19:40:15

Точно,64 измерения в инт влезут

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

Вс сен 16, 2018 04:17:43

записать 64 измерения, результат сдвинуть в право 5раз
6 раз

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

Вс сен 16, 2018 08:35:47

если уж нужна точность и маленький размер кода
на ПИКах, например 12f675 я делаю просто:
подаю питание 5.12В, опорное с питания, размерность АЦП 1024.

получаем 5.12/1024= 5мВ.
а дальше уже работай с ним как нравится.

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

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

Дело дошло до экспериментов, и появилась погрешность. Измеряю мультиметром входное напряжение, подстраиваю делитель под него,все четко. Но когда напряжение меняется на 3 вольта, то результат измерения отличается от показаний мультиметров на 0.3 вольта. с чем это может быть связано?
Ответить