Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/55: Рейтинг темы: голосов - 55, средняя оценка - 4.64
OtixRu
1

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

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

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

[5.03 Кб]

[2.17 Кб]
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.06.2013, 10:36
Ответы с готовыми решениями:

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

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

АЦП несколько каналов
Нужно замерять сигналы с трех выводов АЦП МК, как это сделать грамотно?

Большое количество АЦП каналов
Здравствуйте! Подскажите микроконтроллеры с количеством АЦП 50 или больше каналов. И есть ли...

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

Поскольку значение ADMUX всё время меняется, то делать пустое преобразование обязательно (см. datasheet: при смене канала или/и REFS - результат первого преобразования ненадёжен).
Ненадежен только для дифференциального преобразования. Ну и c запуском по событиям надо аккуратно обновлять ADMUX.
0
OtixRu
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();

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

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

P.S. Ребята, подскажите пожалуйста, при использовании глубокого сна что происходит на ногах контроллера, которые сконфигурированы как входы-выходы портов? Они так и остаются подключенными к портам или последние отключаются от ног? Интерес представляют выходы, которые управляют исполнительным устройством, будет ли оно работать когда контроллер в сон уйдет?
состояние портов не изменяется во время сна. Как они были до сна, так и останутся.
0
OtixRu
05.06.2013, 10:30 13
Спасибо. Тему можно закрывать
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2013, 10:30

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Использование нескольких каналов АЦП
Всем привет. Пишу небольшую прогу для ATmega8, и возник вопрос как считывать данные сразу с двух...

Защита каналов АЦП от импульсных помех
На входы ацп МК подаются сигналы обратной связи с двигателя и необходимо защитить АЦП от импульсных...

Данные с двух каналов АЦП по очередно.[Решено]
Всем привет. Столкнулся с непоняткой, чип stm8s003f на время теста подцепил два переменных...

Опрос нескольких регулярных каналов АЦП STM32F100
Всем привет! Проблема с опросом нескольких регулярных каналов АЦП STM32F100 (Отл плата STM32F100VL...


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

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

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