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

Переключение каналов АЦП atmega88

01.06.2013, 10:36. Просмотров 9103. Ответов 12
Метки нет (Все метки)

Добрый день. В который раз сталкиваюсь с АЦП на меге и никак не могу понять как правильно перекючать каналы АЦП. Помогите пожалуйста. Ниже выложен код, в файле event-system.с (событийная система) в событии HomdlerIvimtTimer() вызываются две функции (double ADC_Term1 и double ADC_Term2) в которых идет опрос первых двух каналов АЦП и расчет значений. Не могу понять, почему правильно работает только в том случае, если в функциях сменить каналы - для первой выбрать второй и наоборот. Если выборку каналов написать нормально (для ADC_Term1 - ADMUX = 0? а для ADC_Term2 - ADMUX = 0х01) тогда каналы меняются местами.

[5.03 Кб]

[2.17 Кб]
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2013, 10:36
Ответы с готовыми решениями:

AVR АЦП использование нескольких каналов
Кто пробовал использовать несколько каналов АЦП одновременно (ну, почти одновременно) - как это...

Переключение канала АЦП в прерывании
Доброе время суток. АЦП работает в Frii Running Mode. Выставляю первый канал АЦП ADMUX |=...

Расширение АЦП микроконтроллера и подключение к АЦП датчиков
Здравствуйте. У меня встала задача сделать устройство для элеватора, для контроля температуры в 864...

Mega16 и неиспользуемый АЦП (питание ацп?)
Если я не использую АЦП контроллера нужно ли подавать на АЦП питание? Если нет, то просто оставить...

ATmega88
Нужно к 5 портам подключить светодиоды. Код написал, моделирую в SimulIDE. start: ldi r16,...

12
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
01.06.2013, 13:01 2
Цитата Сообщение от OtixRu
Не могу понять, почему правильно работает только в том случае, если в функциях сменить каналы - для первой выбрать второй и наоборот. Если выборку каналов написать нормально (для ADC_Term1 - ADMUX = 0? а для ADC_Term2 - ADMUX = 0х01) тогда каналы меняются местами.
Ничего не понял :-) Какие каналы меняются? Как это они меняются (внутри AVR я точно знаю: каналы АЦП никуда не двигаются, они в кремнии вытравлены). Так что объясните ситуацию более наглядно, оба случая ("хороший" и "плохой").
И проверьте, не напутано ли во внешних соединениях. Например, к какому пину (номер!) AVR у Вас подключено то, что считается первым каналом, и к какому пину - то, что считается вторым каналом.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
01.06.2013, 21:51 3
event-system знакомое название. У Паши взято? :)
0
OtixRu
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 7
01.06.2013, 22:45 4
Цитата Сообщение от OtyxPM
Цитата Сообщение от OtixRu
Так что объясните ситуацию более наглядно, оба случая ("хороший" и "плохой").
И проверьте, не напутано ли во внешних соединениях. Например, к какому пину (номер!) AVR у Вас подключено то, что считается первым каналом, и к какому пину - то, что считается вторым каналом.
Это термоконтроллер с двумя термодатчиками. Висят они соответственно на ADC0 и ADC1. Так вот, когда при обращении к функции ADC_Term1 () (опрос первого датчика - канал ADC0) в самой функции пишу ADMUX = 0x00, а в функции ADC_Term2 () - ADMUX = 0x01 по логике первая должна выдавать данные с нулевого канала, а вторая - с первого. Но реально все с точностью до наоборот. И только если в первой функции (для первого датчика) выбираю канал 1, а во второй функции - канал 0, тогда индикация идет правильно. Каналы не попутаны - схема собрана в железе на плате, плюс в пинбоарде пробовал. Я никак не могу разобраться с правилами переключения. В даташите написано что обновление данных ADMUX в первом такте после установки ADSC. подозрение только на режим сна - возможно при его задействовании ADMUX не обновляется сразу после установки ADSC? но информации не нашел

Цитата Сообщение от dymyurk1978
event-system знакомое название. У Паши взято? :)
Да, у Павла взял.
0
01.06.2013, 22:45
S_Otix
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 537
02.06.2013, 01:16 5
Если по простому, то выполни пустое преобразование, а на втором измерении получишь данные своего канала.
Или читай справку, как и когда выполняестя обновление MUX и срабатывает УВХ.
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
02.06.2013, 02:45 6
Цитата Сообщение от S_Otyx
Если по простому, то выполни пустое преобразование, а на втором измерении получишь данные своего канала.
Или читай справку, как и когда выполняестя обновление MUX и срабатывает УВХ.
Поскольку значение ADMUX всё время меняется, то делать пустое преобразование обязательно (см. datasheet: при смене канала или/и REFS - результат первого преобразования ненадёжен).
Заодно этим снимается описанная в теме проблема, как указал S_Otyx.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
02.06.2013, 14:09 7
Где-то читал, если не путаю, на AVR, при переключении входов АЦП нужно делать 3 пустых преобразования.
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
02.06.2013, 15:01 8
Цитата Сообщение от dymyurk1978
Где-то читал, если не путаю, на AVR, при переключении входов АЦП нужно делать 3 пустых преобразования.
Это уже страсти какие то
2OtixRu Кстати непонятно, если прерывания глобальные запрещаются, как контроллер в итоге просыпается?
Код
cli();
Temp1 = ADC_Term1();
sei();
0
omooro
0 / 0 / 0
Регистрация: 11.06.2010
Сообщений: 351
02.06.2013, 20:42 9
Бит SE в другом регистре, мк не попадает в сон, берутся старые значения из переменной Adc.

Поскольку значение ADMUX всё время меняется, то делать пустое преобразование обязательно (см. datasheet: при смене канала или/и REFS - результат первого преобразования ненадёжен).
Ненадежен только для дифференциального преобразования. Ну и c запуском по событиям надо аккуратно обновлять ADMUX.
0
OtixRu
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 7
03.06.2013, 02:10 10
Цитата Сообщение от OtyxPM
Цитата Сообщение от S_Otyx
Если по простому, то выполни пустое преобразование, а на втором измерении получишь данные своего канала.
Или читай справку, как и когда выполняестя обновление MUX и срабатывает УВХ.
Поскольку значение ADMUX всё время меняется, то делать пустое преобразование обязательно (см. datasheet: при смене канала или/и REFS - результат первого преобразования ненадёжен).
Заодно этим снимается описанная в теме проблема, как указал S_Otyx.

Суть в том что про пустое преобразование в даташите сказано только для диф канала. Для одиночного запуска первое преобразование при включение АЦП само по себе холостое, дальше про смену каналов толком ничего не сказано, кроме того условия что должно быть сброшено ADIM или ADSC. Тем более что у меня в цикле делается 16 преобразований после смены канала и никакого переключения не наблюдается. Пробовал ставить до цикла пустое преобразование - результат тот же, каналы не переключаются.

Цитата Сообщение от itysiy
2OtixRu Кстати непонятно, если прерывания глобальные запрещаются, как контроллер в итоге просыпается?
Код:
cli();
Temp1 = ADC_Term1();
sei();

Это во время экспериментов поставил и сам удивился не меньше. Явного разрешения глобальных больше нигде нету, но в тоже время, с учетом того, что результат в прерывании сохраняю, он просыпается. Еще не дошел до пошагового, надо будет просмотреть...Как говорится все последовательно. Сейчас интересует именно ситуация с переключением каналов. В другом своем проекте переключал каналы в прерывании, там по логике должно было быть: если работал нулевой, то выбираем первый и наоборот. Все работало. Но там каждый канал делал одно преобразование и переключался и не надо было городить в прерывании тучу условий. А вот переключение в основном коде перед запуском не срабатывает...
0
OtixRu
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 7
03.06.2013, 02:12 11
Цитата Сообщение от omooro
Бит SE в другом регистре, мк не попадает в сон, берутся старые значения из переменной Adc.
Спасибо, проглядел. Привык к 8-ой меге. Это сразу решило проблему с переключением каналов. Как ни стараешься быть повнимательней, а все равно грабли найдутся...Большое спасибо.

P.S. Ребята, подскажите пожалуйста, при использовании глубокого сна что происходит на ногах контроллера, которые сконфигурированы как входы-выходы портов? Они так и остаются подключенными к портам или последние отключаются от ног? Интерес представляют выходы, которые управляют исполнительным устройством, будет ли оно работать когда контроллер в сон уйдет?
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
04.06.2013, 11:25 12
Цитата Сообщение от OtixRu
Цитата Сообщение от omooro
Бит SE в другом регистре, мк не попадает в сон, берутся старые значения из переменной Adc.
Спасибо, проглядел. Привык к 8-ой меге. Это сразу решило проблему с переключением каналов. Как ни стараешься быть повнимательней, а все равно грабли найдутся...Большое спасибо.

P.S. Ребята, подскажите пожалуйста, при использовании глубокого сна что происходит на ногах контроллера, которые сконфигурированы как входы-выходы портов? Они так и остаются подключенными к портам или последние отключаются от ног? Интерес представляют выходы, которые управляют исполнительным устройством, будет ли оно работать когда контроллер в сон уйдет?
состояние портов не изменяется во время сна. Как они были до сна, так и останутся.
0
OtixRu
0 / 0 / 0
Регистрация: 07.01.2013
Сообщений: 7
05.06.2013, 10:30 13
Спасибо. Тему можно закрывать
0
05.06.2013, 10:30
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2013, 10:30

ATMega88 - 10 PWM
Доброго времени суток, Уважаемые! Имею задачу сделать 10 ШИМ со следующими характеристиками: —...

Bootloader atmega88
Всем привет. Весь день уже бьюсь над этим загрузчиком. Шью вот это:...

Проблема с UART (ATmega88)
Добрый день! Уже долгое время пытаюсь разобраться с работой uart. Наваял программу, по которой мк...


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

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

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