Обсуждаем контроллеры компании Atmel.
Пт сен 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
Читайте книжки.
Пт сен 14, 2018 16:43:30
.
А я вот тыкнул и тыкну ещё. В сети нормально тыкать. В сети наоборот, сначало ТЫ, а вот выканье надо заслужить. Если ты профессор, то пусть выкают студенты, я не студент.
Вселенная бесконечна, интернет безграничен, а ты мне рамки какие то ставишь. Тю.
нужно изменить границы измерения ( у нас 1024 отсчета, если делать шаг 5мВ, и от 0, то диапазон будет до 5,12В, думаю это не страшно).
Чтобы сделать другой шаг АЦП, надо подбирать опорник.
Пт сен 14, 2018 16:47:51
А тебе что, солить эти ресурсы и время? Пусть тратится, зато просто и доступно любому школьнику. МК в массы!
Ага, а потом тригонометрические функции с точностью в четыре десятичных знака не успевают считать в реальном времени. Потому что понятия не имеют, что их можно посчитать очень быстро хоть на ATTiny, используя только операции сложения и сдвига.
Про массы мы все и так знаем. Когда многомегабайтные программы сжирают гигабайты памяти и грузят смартфон до горячего состояния, выполняя в общем-то совершенно примитивные операции. Зато пипл осознает, что процессор у него медленный, флеш переполнен, оперативки не хватает и бежит покупать очередное чудо инженерной мысли на очередные пару лет.
Пт сен 14, 2018 16:50:52
А я вот тыкнул и тыкну ещё... интернет безграничен...
Совершенно согласен с вами, придурков хватает.
Пт сен 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
Пт сен 14, 2018 17:13:59
придурков хватает.
Самокритика? Похвально! Уважать даже чуток начал!
компиляторы сейчас умные - деление любимых чисел сдвигом делают:
Я ж сразу написал про ассемблер и про устаревшие подходы.
Они ж в сях не пишут и не знают этого...
Мне не хватило терпения продемонстрировать!
Благодарю!
Пт сен 14, 2018 18:01:25
Один сдвиг вправо кратен делению на 8?
Мда... Печально. Один сдвиг вправо эквивалентен делению на 2. Влево - умножению на 2.
Пт сен 14, 2018 18:34:09
Чтобы сделать другой шаг АЦП, надо подбирать опорник.
нет, достаточно поправить входной делитель так, чтобы при 5,24в на входе делителя, на его выходе получалось напряжение равное напряжению опорника (2,54в вроде).
Пт сен 14, 2018 22:23:07
достаточно поправить входной делитель
напряжению опорника (2,54в вроде).
Внутренний опорник у них 1,1В. ТС САМ ПИШЕТ что берёт 2,5В от стабилизатора. Хотя это неверно, стабильность там может оказаться совсем хреновая.
Опорники кстати продаются и вполне доступны.
А касаемо делителя... "Семён Семёныч"(с)
А если хорошенько подумать?
Ну уменьшишь ты значение на входе, оно станет соответствовать опорнику. Ну а чтобы получить реальное надо что сделать? Умножить, на то число, на которое стоит делитель! И что в итоге? А в итоге получатся те же некрасивые и некруглые цифры)
Дискретность измерения можно поменять только опорником.
Нет, ну если ТСу не надо выводить цифры, или он может их округлить то никаких проблем. Но если точно... То только другой опорник.
Сб сен 15, 2018 00:53:25
Один сдвиг вправо - деление на 2. Если сдвигать на 1 бит. Но если сделать скажем 16 измерений и все сложить, а потом
V=sum >> 4;
то сдвиг на 4 бита - деление на 16. К слову новые ATTiny 1-series делают сразу от 1 до 64 измерений и автоматически складывают.
Сб сен 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.
Сб сен 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
;**********************************************************************
Сб сен 15, 2018 07:02:02
подстроечник все равно надо (аппаратный или программный)... резисторы, они такие...
Сб сен 15, 2018 07:16:06
для ТС - еще "повысить точность" можно как китайцы, поставив внешний АЦП, аппаратный I2C в применяемом МК (mega168) есть. Пример, правда на STM8:
Прецизионный вольтметр 0-33 вольт с разрешением в 4 разряда после точки
https://mysku.ru/blog/ebay/50479.htmlтам в комментариях есть схема и ссылка на реверс-инжиниринг
Сб сен 15, 2018 18:08:30
Если учесть все советы то получается так: 1. Убрать стабилизатор на2.5, и поставить более точный ион. 2. Расчиать делитель напряжения, и добавить к нему подстроечник для корректировки.3 использовать все 10бит ацп.4 выбрать напряжение кратное 5мв. 1024*5 = 5.12в. 5. В переменную Лонг записать 64 измерения, результат сдвинуть в право 5раз. Вроде как то так. Спасибо всем за советы
Сб сен 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).
Сб сен 15, 2018 19:40:15
Точно,64 измерения в инт влезут
Вс сен 16, 2018 04:17:43
записать 64 измерения, результат сдвинуть в право 5раз
6 раз
Вс сен 16, 2018 08:35:47
если уж нужна точность и маленький размер кода
на ПИКах, например 12f675 я делаю просто:
подаю питание 5.12В, опорное с питания, размерность АЦП 1024.
получаем 5.12/1024= 5мВ.
а дальше уже работай с ним как нравится.
Вс сен 16, 2018 15:22:29
Дело дошло до экспериментов, и появилась погрешность. Измеряю мультиметром входное напряжение, подстраиваю делитель под него,все четко. Но когда напряжение меняется на 3 вольта, то результат измерения отличается от показаний мультиметров на 0.3 вольта. с чем это может быть связано?
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.