Страница 2 из 4

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

Добавлено: Пт сен 14, 2018 16:43:17
_abk_
[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
Читайте книжки.

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

Добавлено: Пт сен 14, 2018 16:43:30
AndTer
[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]
Чтобы сделать другой шаг АЦП, надо подбирать опорник.

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

Добавлено: Пт сен 14, 2018 16:47:51
ПростоНуб
[uquote="AndTer",url="/forum/viewtopic.php?p=3456908#p3456908"]А тебе что, солить эти ресурсы и время? Пусть тратится, зато просто и доступно любому школьнику. МК в массы![/uquote]
Ага, а потом тригонометрические функции с точностью в четыре десятичных знака не успевают считать в реальном времени. Потому что понятия не имеют, что их можно посчитать очень быстро хоть на ATTiny, используя только операции сложения и сдвига.

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

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

Добавлено: Пт сен 14, 2018 16:50:52
_abk_
[uquote="AndTer",url="/forum/viewtopic.php?p=3456950#p3456950"]А я вот тыкнул и тыкну ещё... интернет безграничен...[/uquote] Совершенно согласен с вами, придурков хватает.

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

Добавлено: Пт сен 14, 2018 16:54:33
oleg110592
компиляторы сейчас умные - деление любимых чисел сдвигом делают:

Код: Выделить всё

    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
AndTer
[uquote="_abk_",url="/forum/viewtopic.php?p=3456956#p3456956"]придурков хватает.[/uquote]
Самокритика? Похвально! Уважать даже чуток начал!

[uquote="oleg110592",url="/forum/viewtopic.php?p=3456958#p3456958"]компиляторы сейчас умные - деление любимых чисел сдвигом делают:[/uquote]
Я ж сразу написал про ассемблер и про устаревшие подходы.
Они ж в сях не пишут и не знают этого...
Мне не хватило терпения продемонстрировать!
Благодарю!

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

Добавлено: Пт сен 14, 2018 18:01:25
ARV
[uquote="vovik15",url="/forum/viewtopic.php?p=3456945#p3456945"]Один сдвиг вправо кратен делению на 8?[/uquote]
Мда... Печально. Один сдвиг вправо эквивалентен делению на 2. Влево - умножению на 2.

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

Добавлено: Пт сен 14, 2018 18:34:09
Ivanoff-iv
[uquote="AndTer",url="/forum/viewtopic.php?p=3456950#p3456950"]Чтобы сделать другой шаг АЦП, надо подбирать опорник.[/uquote] нет, достаточно поправить входной делитель так, чтобы при 5,24в на входе делителя, на его выходе получалось напряжение равное напряжению опорника (2,54в вроде).

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

Добавлено: Пт сен 14, 2018 22:23:07
AndTer
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3457013#p3457013"]достаточно поправить входной делитель
напряжению опорника (2,54в вроде).[/uquote]
Внутренний опорник у них 1,1В. ТС САМ ПИШЕТ что берёт 2,5В от стабилизатора. Хотя это неверно, стабильность там может оказаться совсем хреновая.
Опорники кстати продаются и вполне доступны.

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

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

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

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

Добавлено: Сб сен 15, 2018 03:52:28
Ivanoff-iv
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
akl
По мне, проще заменить деление умножением, т.е. 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
Ivanoff-iv
подстроечник все равно надо (аппаратный или программный)... резисторы, они такие...

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

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

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

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

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

Добавлено: Сб сен 15, 2018 19:17:45
Ivanoff-iv
зачем лонг? АЦП 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
vovik15
Точно,64 измерения в инт влезут

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

Добавлено: Вс сен 16, 2018 04:17:43
solarLight
[uquote="vovik15",url="/forum/viewtopic.php?p=3457492#p3457492"]записать 64 измерения, результат сдвинуть в право 5раз[/uquote]6 раз

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

Добавлено: Вс сен 16, 2018 08:35:47
pasha_zv
если уж нужна точность и маленький размер кода
на ПИКах, например 12f675 я делаю просто:
подаю питание 5.12В, опорное с питания, размерность АЦП 1024.

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

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

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