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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 4
Зарегистрирован: Вс дек 09, 2012 18:24:28

Сообщение Vladimir Semenov »

Доброго времени суток, уважаемые форумчане! Опыт работы с микроконтроллерами у меня весьма мал, начал погружаться в эту тему, т.к. по работе нужно. Дошел до изучения работы с АЦП в 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)? Корректна ли такая настройка АЦП без настройки прерываний и т.д.?

За любую помощь буду очень благодарен! Не судите строго - я только начинающий...
Реклама
Открыл глаза
Сообщения: 47
Зарегистрирован: Вт мар 20, 2012 07:16:43

Сообщение стьюдент »

Неправильные утверждения(по моему мнению):
1) частота считывания 750kHz (12MHz/16)
Частота АЦП должна лежать в пределах 50кГц-200кГц.
2) А вектор обработчка прерывания вы настроили? Что будет делать ваша программа, когда АЦП завершит преобразование?
3) ADMUX = 0b01100000; /* источник опорного напряжения - источник питания МК - 5 В
источник опорного напряжения - напряжение которое подано на вход AVcc
Реклама
Родился
Сообщения: 4
Зарегистрирован: Вс дек 09, 2012 18:24:28

Сообщение Vladimir Semenov »

Встроенный в ATMEGA 16 АЦП 10 разрядный, мне необходимы только 8 разрядов, а в книге Евстифеева было написано, что в случае, когда используются 8 битов (а значит теряется точность), то АЦП будет корректно работать и на частотах больших 200kHz вплоть до 1MHz... Вот я исходя из этого и поставил частоту 750kHz.
Вектор обработчика прерывания я не настраивал и не особа сильно представляю как его настраивать для работы с АЦП. Как я понял, если используется непрерывное преобразование, то и прерывания не нужно настраивать (чтото подсказывает мне что я ошибаюсь). Когда АЦП завершит преобразование, полученный от преобразования результат отправляется на порт С, после чего заново начинается преобразование и опять на порт С и т.д. все время работы.
По поводу источника опорного напряжения - переделаю на AVCC.
Открыл глаза
Сообщения: 47
Зарегистрирован: Вт мар 20, 2012 07:16:43

Сообщение стьюдент »

Vladimir Semenov писал(а):Встроенный в ATMEGA 16 АЦП 10 разрядный, мне необходимы только 8 разрядов, а в книге Евстифеева было написано, что в случае, когда используются 8 битов (а значит теряется точность), то АЦП будет корректно работать и на частотах больших 200kHz вплоть до 1MHz... Вот я исходя из этого и поставил частоту 750kHz.
название книги+страница на которой вы это прочитали. Очень хочу посмотреть, возможно чего то недоглядел.
По поводу прерываний, настраивать их надо (могу подсказать на ассемблере)
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

можно и без прерываний, опрашиваем в бесконечном цикле флаг готовности результата, меняем состояние порта, очищаем флаг.Таким образом не производится лишних изменений порта.И точно известно, что результат есть.
Можно, впрочем и просто в прерывании писать в порт.

Вроде еще пропущен первый запуск преобразования не знаю будет ли в вашем режиме без этого работать


PS. Точность не меняется, просто два бита не используются при чтении.
В даташите написано, что при чтении младшего байта аппаратно блокируется запись в регистровую пару результата.таким образом достигается его сохранность, чтобы оба байта принадлежали одному измерению.
Если ориентировать по левой стороне, то можно младшие два бита в младшем байте не читать сразу читать старший при этом аппаратная блокировка снимается и в регистровую пару снова может быть записан новый результат.
Контактная информация:
Реклама
Родился
Сообщения: 4
Зарегистрирован: Вс дек 09, 2012 18:24:28

Сообщение Vladimir Semenov »

стьюдент писал(а):
Vladimir Semenov писал(а):Встроенный в ATMEGA 16 АЦП 10 разрядный, мне необходимы только 8 разрядов, а в книге Евстифеева было написано, что в случае, когда используются 8 битов (а значит теряется точность), то АЦП будет корректно работать и на частотах больших 200kHz вплоть до 1MHz... Вот я исходя из этого и поставил частоту 750kHz.
название книги+страница на которой вы это прочитали. Очень хочу посмотреть, возможно чего то недоглядел.
По поводу прерываний, настраивать их надо (могу подсказать на ассемблере)
Книга: А.В. Евстифеев "Микроконтроллеры AVR семейства Mega. Руководство пользователя" 2007г. страницы 407 и 418)))))
Реклама
Открыл глаза
Сообщения: 47
Зарегистрирован: Вт мар 20, 2012 07:16:43

Сообщение стьюдент »

Посмотрите на странице 418 таблица 9.10 значение абсолютной погрешности при частоте 1 МГц.
Родился
Сообщения: 4
Зарегистрирован: Вс дек 09, 2012 18:24:28

Сообщение Vladimir Semenov »

Согласен... высоковато...
получилось у меня настроить АЦП, надо было проверять флаг готовности нового результата перед тем как считывать...
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

А где мне плюсик?:(( я же про флаг готовности подсказал.
Контактная информация:
Ответить

Вернуться в «AVR»