Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.98/50: Рейтинг темы: голосов - 50, средняя оценка - 4.98
Doimom78
0 / 0 / 0
Регистрация: 11.08.2011
Сообщений: 466
1

Странная работа АЦП Attiny13A

05.12.2012, 14:31. Просмотров 9101. Ответов 17
Метки нет (Все метки)

Доброе время суток.
Затеял тут один девайсик залудить. Заюзал Attiny13A-PU. PWM, прерывания, все работает нормально, а вот с АЦП непонятки.

Я сейчас код, понадерганный из проги, и относящийся к АЦП приведу а потом расскажу в чем затык.
Для входя АЦП используется ADC1, PB2 (ножка 7).
_sbi/_cbi макрос установки/сброса бита
Тактируется от внутренней RC цепочки на 9600000, (div8 выключено)
Код
//Канал ацп
#define ADC_CH_1_MUX 0x01
// div 128
#define ADC_PRESCALER 0x07
#define ADC_RUNMODE 0x00

DIDR0= 0x04; // Dysable Digital Input
_cbi(ADMUX, REFS0); //VCC used as analog reference
_sbi(ADMUX, ADLAR); //left adjusted
ADMUX |= ADC_CH_1_MUX;

_sbi(ADCSRA,ADIM);
_sbi(ADCSRA,ADIE);

ADCSRA |= ADC_PRESCALER;
ADCSRB |= ADC_RUNMODE;

_sbi(ADCSRA,ADSC); //Запустили

ISR (ADC_vect)
{

//volatile uint8_t tmpADMUX =  ADMUX;

volatile uint8_t tADCH;

tADCH = ADCL;
tADCH = ADCH;
}
Вот, по большому счету и все. Задумка следующая: Восемь раз подряд снимается показание ацп, затем суммируется и делится на 8. Так вот, под отладчиком (AVRDragon), из 8 показаний 6 или 7 обычно нули, а оставшееся одно или два скачет. Сначала думал, что не правильно с АЦП работаю (что вполне может быть), но потом закралась мысль, что проблема может быть глубже и вытекать из схемы девайса. Но пока приводить ее не буду, чтобы не отвлекать читающих. Может ошибка все же в коде?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2012, 14:31
Ответы с готовыми решениями:

AtTiny13A,работа АЦП в режиме auto triggering.
Добрый день товарисчи знатоки. Собстна имеем такой интересный момент: Тини13а. АЦП настроен на...

ATTiny13A загвоздка с АЦП
Добрый день. Думаю нет смысла повторять про "только начал изучать". ATTiny13A, PB0-выход,...

ATTiny13a нет прерывания с АЦП.
Добрый день! Столкнулся с проблемой, на реальном устройстве не генерируется прерывание с АЦП по...

Работа с АЦП
Появилась задача: управлять яркостью горения диода с помощью фоторезистора. Все делается в Atmel...

Работа с АЦП (PIC16F676)
МК pic16f676 Задача: попробовать сделать АЦП. Код программы: #include <htc.h> ...

17
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
05.12.2012, 15:40 2
Код
_sbi(ADCSRA,ADIM);
_sbi(ADCSRA,ADIE);

ADCSRA |= ADC_PRESCALER;
ADCSRB |= ADC_RUNMODE;
Что-то мне это усё не нравится. Сначала вы вкл. АЦП , затем его благополучно откл.
Обычно все пишут сразу и вместе
Код
ADCSRA |= 1<<ADIE|1<<ADIM|1<<ADPS2|1<<ADPS1|1<<ADPS0
_sbi(ADCSRA,ADSC); //Запустили
0
omt
0 / 0 / 0
Регистрация: 02.11.2004
Сообщений: 1,112
05.12.2012, 15:42 3
и где sei() ?
0
Doimom78
0 / 0 / 0
Регистрация: 11.08.2011
Сообщений: 466
05.12.2012, 15:46 4
Цитата Сообщение от YTYOUT
Сначала вы вкл. АЦП , затем его благополучно откл.
Прошу прощения, но ни как не могу понять, где я отключаю АЦП, тыкните меня, пожалуйста, в отключение.

Цитата Сообщение от Omt
и где sei() ?
Есть, честно слово, в основном файле.

Я просто юзаю C++, и чтобы не приводить код всех классов, я выдрал кусок про АЦП, но этот тот код, который я реально трассирую под отладчиком. В большинстве случаев в ADCH чистый ноль.
0
05.12.2012, 15:46
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
05.12.2012, 16:07 5
Здесь работает команда чтение -модификация - запись , установленные биты не трогаются
Код
_sbi(ADCSRA,ADIM); =0x80
_sbi(ADCSRA,ADIE); = 0x88
Здесь , компилятор , помещает число ADC_PRESCALER= 0x07 во временный регистр и пишет всё целиком, не обращая внимание , на предустановки
Код
ADCSRA |= ADC_PRESCALER; = 0x07
В итоге всё откл.
А Ваим надо получить 0x8F
0
Doimom78
0 / 0 / 0
Регистрация: 11.08.2011
Сообщений: 466
05.12.2012, 16:25 6
Цитата Сообщение от YTYOUT
Здесь работает команда чтение -модификация - запись , установленные биты не трогаются
Код:
_sbi(ADCSRA,ADIM); =0x80
_sbi(ADCSRA,ADIE); = 0x88
Здесь , компилятор , помещает число ADC_PRESCALER= 0x07 во временный регистр и пишет всё целиком, не обращая внимание , на предустановки
Код
ADCSRA |= ADC_PRESCALER; = 0x07
В итоге всё откл.
А Ваим надо получить 0x8F

Еп..., неужели Вы правы?!
Побежал домой проверять.
0
Doimom78
0 / 0 / 0
Регистрация: 11.08.2011
Сообщений: 466
05.12.2012, 19:04 7
Код
ADMUX |= 1<<ADLAR|1<<MUX0;
ADCSRA |= 1<<ADIE|1<<ADIM|1<<ADPS2|1<<ADPS1|1<<ADPS0;
Не помогло, к сожалению.

Видимо ошибка в схеме.
Дело в том, что на ножку подается напряжение с датчика MAX4376, который включен в цепь движка, на который идет ШИМ. Причем с очень маленькой скважностью. Видимо MAX4376 и АЦП попадают как раз на нулевое напряжение.
Подскажите, пожалуйста, как можно тут организовать интегрирующую цепочку, в районе движка, чтобы впаять в уже сделанную плату? Может RC навесить? Но как номиналы прикинуть?
Схему прилагаю. Ногами не бить, не работал в Орле года полтора, не помню как LABEL присваивать.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
05.12.2012, 19:37 8
Подайте на АЦП, хотя бы через переменный резистор или делитель , какое нить напряжение , что бы убедится в его работоспособности. Датчик надо откл.
0
Doimom78
0 / 0 / 0
Регистрация: 11.08.2011
Сообщений: 466
05.12.2012, 19:44 9
Цитата Сообщение от YTYOUT
Подайте на АЦП, хотя бы через переменный резистор или делитель , какое нить напряжение , что бы убедится в его работоспособности. Датчик надо откл.
Отключить не могу, так как впаян в плату, дал максимальную скважность, что соответствует почти 12В, АЦП отлавливает данные без нулей. Видимо все дело в интегрирующей цепочке.
Какую надо соорудить для нагрузки работающей от 5 до 12В на токе от 0.2 до 2А?
Частота ШИМ 36Кгц.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
05.12.2012, 20:21 10
http://vt-tech.eu/ru/articles/calculato ... lters.html
0
Doimom78
0 / 0 / 0
Регистрация: 11.08.2011
Сообщений: 466
05.12.2012, 20:55 11
Цитата Сообщение от YTYOUT
http://vt-tech.eu/ru/articles/calculators/165-symple-rc-filters.html
Огромнейшее спасибо, побрел изучать.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
05.12.2012, 22:00 12
Что-то не давало мне покоя . Теперь понял.
что соответствует почти 12В
Напрямую на ножку контролера, смело. Вот Вам повод переделать всю плату.
0
Doimom78
0 / 0 / 0
Регистрация: 11.08.2011
Сообщений: 466
05.12.2012, 22:04 13
[QUOTE="YTYOUT"]Что-то не давало мне покоя . Теперь понял.
[QUOTE="Цитата:[/QUOTE]
что соответствует почти 12В
Напрямую на ножку контролера, смело. Вот Вам повод переделать всю плату.
Нет, что Вы, 12В не на контроллер а на двигло. На ножку приходит максимум 2В и то в момент пуска, когда идет максимальный ток.
Я схему выше прикрепил, там все видно.

Я решил с Fast PWN пересесть на phase correct.
Подскажите, если МК работает на 9600000, правильно ли я понимаю, что при такой инициализации
Код
   OCR0A = 250;
OCR0B = 20;
TCCR0A = 0<<COM0A1 | 0<<COM0A0 | 1<<COM0B1 | 0<<COM0B0 | 0<<WGM01 | 1<<WGM00; // PWM (Phase Correct) B on
TCCR0B = 0<<FOC0A | 0<<FOC0B | 1<<WGM02 | 1<<CS02 | 0<<CS01 | 1<<CS00; // PWM clock = CK/1024
частота PWM будет 9600000/1024=9375Гц ?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
05.12.2012, 22:17 14
Нет.
В DS есть раздел
11.7.4 Phase Correct PWM Mode и там есть одна единственная формула, которая Вам и нужна
0
Doimom78
0 / 0 / 0
Регистрация: 11.08.2011
Сообщений: 466
05.12.2012, 22:26 15
Цитата Сообщение от YTYOUT
Нет.
В DS есть раздел
11.7.4 Phase Correct PWM Mode и там есть одна единственная формула, которая Вам и нужна
Еще раз большое Вам спасибо.
Блин, я бы и не подумал, что оказывается генерю ШИМ с частотой 18 ГЦ!!!
Осциллографа под рукой нет.

Надо RC считать под другую частоту :(
0
Doimom78
0 / 0 / 0
Регистрация: 11.08.2011
Сообщений: 466
05.12.2012, 22:55 16
Сижу и понимаю, что где то меня дурят.
Если в 8 битном режиме, при Vref = Vcc, 5В соответствует значению 255, то АЦП ни как не может ловить значение 232, так как движок не потребляет при питании ШИМом с минимальной скважностью столько А, чтобы при преобразовании 1:1 дать 232 на входе АЦП. Тем более, что АЦП работает не в момент включения. Мистика какая то.
0
Doimom78
0 / 0 / 0
Регистрация: 11.08.2011
Сообщений: 466
06.12.2012, 00:48 17
Проблема решилась установкой конденсатора между ножкой АЦП и землей.
0
omt
0 / 0 / 0
Регистрация: 02.11.2004
Сообщений: 1,112
07.12.2012, 21:30 18
А на ногах питания контроллера кондёр стоит?
0
07.12.2012, 21:30
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 21:30

Работа с АЦП ADuC842
Всем доброго времени суток, помогите пожалуйста найти решение моей проблемы! Необходимо найти...

ATMega8535. Работа с АЦП
Ребята нужна ваша помощь. Нужно написать программу для измерения переменного напряжения,...

ATMega128. Работа с АЦП
Помогите, пожалуйста, найти информацию по написанию прошивки для контроллера atmega128, при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.