Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/52: Рейтинг темы: голосов - 52, средняя оценка - 4.90
Vtodymyr Simimov
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 3
1

Помогите настроить АЦП в ATMEGA16

08.12.2012, 22:01. Просмотров 10072. Ответов 4
Метки нет (Все метки)

Доброго времени суток, уважаемые форумчане! Опыт работы с микроконтроллерами у меня весьма мал, начал погружаться в эту тему, т.к. по работе нужно. Дошел до изучения работы с АЦП в ATMEGA 16. Сейчас у меня стоит задача - нужно сделать так, чтобы АЦП с как можно большей частотой в реальном времени оцифровывал входной сигнал и сразу же передавал его на один из портов (а дальше там уже ЦАП). Получается этакий повторитель - выходной сигнал равен входному.
Программы пишу на Си в CodeVisionAVR. Вот текст программы:

// Программа для работы с встроенным АЦП микроконтроллера ATmega16.
// Микроконтроллер оцифровывает входное напряжение и подает его на выход,
// где подразумевается наличие ЦАП - таким образом реализуется повторение
// входного сигнала на выходе.

// Используемые библиотеки:
#include <mega16.h>

// Начало программы
void main(void)
{
// Настраиваем порты:
DDRA = 0b00000000; // Все выводы порта А настраиваем на входы (0 - вход, 1 - выход)
PORTA = 0b11111111; // Подключаем внутренние подтягивающие резисторы к выводам порта A.

DDRC=0b11111111; // Все выводы порта C настраиваем как выходы (0 - вход, 1 - выход)
PORTC=0b00000000; // Обнуляем порт С до начала выполнения программы (на всякий случай)

// Настраиваем встроенный АЦП:
ADCSRA = 0b11100100; // включить АЦП, запустить преобразование, непрерывный режим работы, частота считывания 750kHz (12MHz/16)
ADMUX = 0b01100000; /* источник опорного напряжения - источник питания МК - 5 В, выравнивание слева (используем
только 8 бит регистра ADCH), входной канал ADC0 */
SFIOR = 0b00000000;

//Основная программа
while(1)
{
PORTC=ADCH; //вывести в порт С значение, полученное в результате считывания

}
}

программа не работает (но компилируется нормально)

Вопросы такие: Правильно ли я настроил АЦП? Нужно ли перед настройкой АЦП настраивать порт А как вход ( т.к. ADC0 соответствует входу PA0)? Корректна ли такая настройка АЦП без настройки прерываний и т.д.?

За любую помощь буду очень благодарен! Не судите строго - я только начинающий...
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2012, 22:01
Ответы с готовыми решениями:

Atmega16 АЦП
Здравствуйте! Пытался запустить АЦП на Atmeag16, с выводом значений на LCD. Что б долго не...

нелинейность АЦП AtMega16?
Пытаюсь использовать AtMiko16 для измерений напряжения. Использую внутренний ИОН(2.56). НО...

Atmega16, АЦП и Протеус [решено]
Блин, второй день мучаюсь. Схема на AtMiko16, меряю АЦП напряжение на аккумуляторе. Очень похожая...

АЦП в Atmega16 не хочет работать.
Здравствуйте. Вчера вот попытался заюзать встроенный АЦП у Atmega16, раскурил Даташит, настроил...

АЦП+ UART на ATmega16: проблемы
Добрый день. Имеются следующие проблемы. 1. При попытке наладить передачу значения АЦП по UART...

4
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
08.12.2012, 23:19 2
подтягивающие резисторы точно не нужны
чтобы считывать без прерывания надо флаг проверять, чтоб знать, что преобразование закончено
http://chipenable.ru/index.php/programm ... ast-1.html
0
Vtodymyr Simimov
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 3
08.12.2012, 23:28 3
Цитата Сообщение от Johmmy0007
подтягивающие резисторы точно не нужны
чтобы считывать без прерывания надо флаг проверять, чтоб знать, что преобразование закончено
http://chipenable.ru/index.php/programm ... ast-1.html
Спасибо огромное!!!!)))) буду пробовать дальше))))
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
09.12.2012, 00:11 4
Подтяжка* входа АЦП "не нужна" мягко сказано - она будет завышать результат. С реальными, а не идеальными источником измеряемого напряжения и проводами.
Но если её забыть отключить - то "вроде и так всё работает, какая разница".

Если задумано иметь результат максимально быстро - тогда более целесообразным представляется пользоваться "аппаратным" прерыванием ADCC, чем "вручную" проверять флаг в цикле.

Если прерывания не используются - желательно (хороший стиль?) запретить их явно, в самом начале программы, сразу после сброса.
Это не обязательно, но стоит ли экономить на одной инструкции cli...
... более общо: желательно вообще все регистры и рам инициализировать явно, не полагаясь на "значения по умолчанию".

* подтяжка на входе включена, если в регистре PORTx соответствующий бит =1.

Write-only style (оно же "magic numbers") => максимально косякоопасно, минимально отлаживаемо, ракообразно редактируемо через месяц или год:
ADCSRA = 0b11100100; // включить АЦП, запустить преобразование, непрерывный режим работы, частота считывания 750kHz (12MHz/16)
ADMUX = 0b01100000; /* источник опорного напряжения - источник питания МК - 5 В, выравнивание слева (используем
только 8 бит регистра ADCH), входной канал ADC0 */
SFIOR = 0b00000000
Сравнивай, мне например лень руками считать "нигические нольодины" в процитированном - проще сразу написать нормально:
Код
ADCSRA = 1<<ADIM | 1<<ADSC | 1<<ADATE | 1<<ADIF | 0<<ADIE | ... ; вкл АЦП, запуск первого измерения, вкл автотриггер, сбросили флаг прерывания (он сбрасывается записью единицы), запретили прерывание, настроили частоту
ADMUX = ...
SFIOR = 0<<ADTS2 |0<<ADTS1 |0<<ADTS0 | ... ; фри руннинг моде
По идее в "фри руннинг моде" в регистрах ADCH:ADCL всегда правильный результат последнего измерения. Но внимательнее на 220 странице:
Цитата Сообщение от Atmel ATmega16 (2466 revision T, updated 7-10).pdf
When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if the result is left adjusted omd no more than 8-bit precision is required, it is sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH
... то есть так на глаз вроде бы всё правильно делается: ADCL не интересует, читается сразу ADCH, должно работать.

И ещё обратить внимание на частоту, в смысле время преобразования. 207 страница. Это не предъява за ошибку в программе - мне просто лень проверять самостоятельно, правильно всё с частотой/временем или нет.

программа не работает
Это как?
Вот например телевизор: экран тёмный, или звук шипит, или изображение по высоте растянуто, или дым идёт... а программа просто "не работает".

PORTC=ADCH
Внимательнее с jtag, для него как раз на порте Ц четыре бита и в новенькой с завода микросхеме оно как раз включено. Выключается соответствующим фусесом.

... онлайн-отладка блин.

В интернетах не принято цитировать полностью отвечаемое сообщение, особенно когда оно расположено сразу перед ответом.
http://www.google.ru/seorsh?q=%D0%BE%D0 ... 0%BD%D0%B3
http://www.google.ru/seorsh?q=mobody+cares
http://www.google.ru/seorsh?q=%D1%83%D0 ... 1%82%D0%B5
0
Vtodymyr Simimov
0 / 0 / 0
Регистрация: 05.12.2012
Сообщений: 3
10.12.2012, 13:51 5
Спасибо огромное за помощь, настроил я все как надо, отключил подтяжку и т.д. и главное - надо было перед считыванием проверять флаг готовности нового результата. И за все замечания спасибо - буду работать дальше в том числе и над стилем написания и читабельностью программ.
0
10.12.2012, 13:51
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2012, 13:51

АЦП+бесконечный поворотный потенциометр (Atmega16)
Приветствую. Имеется контроллер atmega16 и поворотный потенциометр, который может вращаться не...

Вывод значений АЦП на семисегментники (Atmega16)
Помогите, пожалуйста, не могу разобраться с программой, в программировании новичок. Берем...

АЦП+UART+семисегментный индикатор(ATMega16, asm)
Пытаюсь разобраться с АЦП на AVR. Взял за исходник вот эту программу...


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

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

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