Обсуждаем контроллеры компании Atmel.
Вт янв 29, 2019 16:51:45
Там же в DS
BOTTOM Signalize that TCNTn has reached minimum value (zero).
По коду. Херь какая-то.
Ср янв 30, 2019 18:26:55
Подскажите, как правильно организовать спящий режим во время работы АЦП в ATmega8 и самое главное как из него выйти сразу же после окончания однократного преобразования? Вот фрагмент программы:
main:
/
/ ; выполняется программа
/
/
sleep ; здесь надо заснуть, что-бы работе АЦП ничего не мешало
ldi R16, 0b00000000
out ADMUX, R16
ldi R16, 0b11001100
out ADCSRA, R16
; здесь надо проснуться
in XL, ADCL
in XH, ADCH
mov R17, XL
mov R18, XH
sleep ; здесь надо опять заснуть, что-бы работе АЦП ничего не мешало
m7: ldi R16, 0b00000000
out ADMUX, R16
ldi R16, 0b11001100
out ADCSRA, R16
; здесь надо опять проснуться
in XL, ADCL
in XH, ADCH
cp XL, R17
cpc XH, R18
brne main
cp XL, YL
cpc XH, YH
breq main
brlo m3
rcall vpravo
rjmp main
m3: rcall vlevo
rjmp main
Чт янв 31, 2019 05:31:05
Как вариант
Спойлер
- Код:
;
.include "m8def.inc"
.cseg
.org 0
;ВЕКТОР ПРЕРЫВАНИЙ
RESET:
rjmp initial
.org 0x0E
ADC_COMPLETE:
in XL, ADCL
in XH, ADCH
RET
;*************************************************
initial:
CLI
ldi R16,low(RAMEND)
out SPL,R16
ldi R16,high(RAMEND)
out SPH,R16
GO:
LDI R16,1<<SE|1<<SM2 ; ADC NOISE
OUT MCUCR,R16
ldi R16, 0b00000000
out ADMUX, R16
main:
LDI R16,1<<ADEN|1<<ADSC|1<<ADIE|1<<ADIF|1<<ADPS2 ;/16
OUT ADCSRA, R16
SEI
sleep ; здесь надо заснуть, что-бы работе АЦП ничего не мешало
; NOP
;ldi R16, 0b00000000
;out ADMUX, R16
;ldi R16, 0b11001100
;out ADCSRA, R16
; здесь надо проснуться
; in XL, ADCL
; in XH, ADCH
mov R17, XL
mov R18, XH
SBI ADCSRA,ADSC
SEI
sleep ; здесь надо опять заснуть, что-бы работе АЦП ничего не мешало
; NOP
m7:
; ldi R16, 0b00000000
;out ADMUX, R16
;ldi R16, 0b11001100
;out ADCSRA, R16
; здесь надо опять проснуться
;in XL, ADCL
;in XH, ADCH
cp XL, R17
cpc XH, R18
brne GO
cp XL, YL
cpc XH, YH
breq GO
brlo m3
rcall vpravo
rjmp GO
m3:
rcall vlevo
rjmp GO
VPRAVO:
RET
VLEVO:
RET
.EXIT
Чт янв 31, 2019 07:59:38
интересно, а что может мешать работе АЦП?
Чт янв 31, 2019 18:12:14
У меня в двух младших битах числа нестабильно фиксируются. Прочитал, что это может быть результат помехи от АЛУ и др. периферии
Чт янв 31, 2019 22:08:08
Сначала проверьте качество разводки AGND, фильтрацию AVCC потом уже АЛУ...
Пт фев 01, 2019 05:39:52
Согласен. Я проверяю программу на самодельном отладочном устройстве, где на выводы AVcc и AREF соединены вместе и подключены к +5V через дроссель 10 мкГн. К обоим концам дросселя подпаяны конденсаторы по 0,1 мкФ на общий вывод. А вот печатная плата отладчика односторонняя и дорожки с подводом питания к АЦП относительно длинные. Сейчас делаю печатную плату из двухстороннего фольгированного стеклотекстолита с другой разводкой дорожек (более короткой длиной) Верхний слой фольги печатной платы оставлю в качестве экрана.
Пт фев 01, 2019 07:36:31
Просто соблюдения схемы ещё ндостаточно, нужно соблюсти ещё и топологию на плате. Так чтобы по AGND проводу не шли цифровые токи. На дорожке даже в 1мм шириной миливольты набираются только так!
Пт фев 01, 2019 07:50:27
У меня в двух младших битах числа нестабильно фиксируются...
Из даташита:
±2 LSB Absolute Accuracy
Пт фев 01, 2019 09:29:22
У меня в двух младших битах числа нестабильно фиксируются.
Недавно тоже испытал такое. Помогла установка после некоторых команд небольших (10мсек) задержек или просто nop-ов.
Пт фев 01, 2019 09:54:27
shonty писал(а):Помогла установка после некоторых команд небольших (10мсек) задержек или просто nop-ов
если "мсек" это МИЛЛИсекунды, то 10 - это очень много! это очень большая задержка по МК-шным меркам. и тут явно что-то не так в схемотехнике, раз нестабильность показаний лечится таким способом...
Пт фев 01, 2019 10:13:37
Для повышения стабильности значений АЦП сделан специальный режим сна
ADC Noise Reduction
, когда тактирование ядра, портов ввода-вывода останавливается и обслуживаются только разрешенные прерывания.
Спойлер
- Вложения
-
- ADC_NOISE.PNG
- (66.23 KiB) Скачиваний: 420
Пт фев 01, 2019 10:40:34
...нестабильно фиксируются...
Определиться бы для начала - насколько точные значения нужны? Для чего?
Пт фев 01, 2019 11:11:13
если "мсек" это МИЛЛИсекунды, то 10 - это очень много! это очень большая задержка по МК-шным меркам. .
Извините, 10мксек (код в сети готовый Delay10us).
Экспериментирую с большими tft диплеями, вот если чтото не допишет, а бывает и проглотит, то на дисплее сразу отражается.
Пт фев 01, 2019 18:23:54
Просто соблюдения схемы ещё ндостаточно, нужно соблюсти ещё и топологию на плате. Так чтобы по AGND проводу не шли цифровые токи. На дорожке даже в 1мм шириной миливольты набираются только так!
Наверное стремиться разводить их перпендикулярно друг другу?
Добавлено after 1 minute 20 seconds:...нестабильно фиксируются...
Определиться бы для начала - насколько точные значения нужны? Для чего?
Желательно все 10 бит. Хочу условно разбить угол поворота переменного резистора на 1024 шага (0-300 градусов на 1024 шага)
Пт фев 01, 2019 19:08:52
Переменником ловить треть градуса... Однако... Может проще взять многооборотный? Опять же всё зависит от преследуемой цели.
Пт фев 01, 2019 19:36:30
Из даташита:
±2 LSB Absolute Accuracy
Нет, это совсем не то - это означает что абсолютная точность АЦП имеет велчину не более +-2 единиц младшего разряда. Это характеризует линейность шкалы. т.е. возми любое значение, сравни код выданный АЦП и реальное напряжение на входе оно отличаться будет не более чем на величину +-2м.р.
а 1м.р. = (опорное напряжение/1024)
----------
Да, если вы в процессе работы с АЦП переключаете каналы или источник опорного напряжения то после переключения и перед измерением надо выдержать паузу, иначе будет мусор - например зависимость от напряжения на предыдущем канале!
Пт фев 01, 2019 19:53:33
Что и есть 2 младших разряда. В любом случае рекомендуется два младших разряда отсекать.
И, судя по задаче, они и не нужны. Вполне достаточно 8-ми разрядов.
Короче - "опыт, сын ошибок трудных"(с) или по-русски - нам главное не сделать, нам главное - зае...аться.
Пт фев 01, 2019 20:53:33
нет, +-2 м.р. это когда значение колеблется в диапазоне 500...504 при фактическом 502 а не ДВА БИТА. И вообще абсолютная погрешность не имеет никакого отношения к разрешающей способности.
Желательно все 10 бит. Хочу условно разбить угол поворота переменного резистора на 1024 шага
Если вам надо гарантированные 10 бит, то вам нужен 12-битный АЦП, или вводить некоторую логику, например усреднение выборок по методу подвижного окна. Но в целом значение не будет стоять как вкопаное - будет болтаться туда-сюда.
Недавно делал на ардуине что-то подобное. АЦП работает в потенциометрическом режиме - т.е. потенциометр подключен к выходу опорного напряжения - это гарантирует что АЦП покажет не напряжение на своём входе, а именно положение потенциометра. Так он всеравно мигал младшим разрядом и на светодиодной ленте это было сильно заметно, особенно на малой яркости когда при значении АЦП 8 оно болтается +-1м.р. Так что я сделал ТУПО - если значение АЦП отклоняется от текущего более чем на 4 - перезаписываем текущее, и далее в программе использую эту переменную. Всё. встало как вкопаное. Но появился момент "страгивания" что для обычного потенциометра... боюсь что у него механический момент страгивания и точность позиционирования "с руки" гораздо хуже. Если надо столь точно определять поворот ручки, может стоит использовать инкрементальный энкодер? На базе сенсора от шариковой мышки.
Сб фев 02, 2019 06:40:26
Хорошая идея! Надо попробовать, тогда и АЦП больше не нужен.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.