Проблема с АЦП

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Проблема с АЦП

Сообщение HarryStar » 29 ноя 2010, 16:47

Новичек. Изучаю контроллеры.
В наличие атмега32. С ней и экспериментирую.
Светодиодами моргать научился, сервами рулить тоже, пищать, кнопки, прерывания, таймеры.

Изучаю АЦП. И тут возникли грабли. курс 123авр читал, задачу 9 и другие тоже. В поиске сижу 2й день, безрезультатно.

Пытаюсь по мотивам сделать простую вещь:
переменный резистор на 10к. середина к PA7, края к +5в и земле.

Прога:
Код: Выделить всё
#include <mega32.h>

int adc_complete;
unsigned char adc_data;

main() {
PORTA=0x00;DDRA=0xFF; // Настройка порта А

// Настройка АЦП
ADMUX = 0b01000111;
ADCSRA=0b10111111;

#asm("sei")
       
while(1)
{
        adc_complete = 0;
        // Старт АЦП
        ADCSRA |= 0x40;               
        // Ждем
        while(adc_complete==0);
}

}

interrupt [ADC_INT] void adc_isr() {
        adc_data = ADCH;
        PORTA = adc_data>>4;
        adc_complete = 1;
}



Алгоритм (желаемый)
1)Настроиваем порт А и АЦП.
2)Запускаем АЦП преобразование.
3)Ждем пока оно отработает в прерывании
4)Повторяем все сначала

Внутри прерывания получаем 8-и битное значение и старшие 4 бита выводим на светодиоды, подключенные к 0-3 битам порта А.

Т.е. крутим резистором, светодиоды показывают уровень сигнала (с точностью 16 градаций)

Прога не работает. Светодиоды всегда выключены. Хотя прерывания обрабатывается. Все как бы работает, но всегда получаем 0 в результате преобразования.
Меня смущает описание битов REFS0,1 региста ADMUX. Я выбрал вариант - AVCC с внешним конденсатором на AREF.
Но к AREF у меня ничего не подключено. Может в этом ошибка? Или неправильно настроен порт А? Возможно бит 7 порта А (к которому подключен резистор) нужно настроить на вход? (я думал он сам перенастраивается в нужный режим при работе АЦП).
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Проблема с АЦП

Сообщение EdGull » 29 ноя 2010, 17:59

для начала подключи и настрой AREF на 5В
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Проблема с АЦП

Сообщение avr123.nm.ru » 29 ноя 2010, 18:16

Он пишет что AREF у него и настроено на AVCC.

Тогда убедится что есть питание на AVCC и замерить напряжение на AREF - оно должно быть как AVCC и на AREF кондерчик всеж повесить по правилам ,01 - 1 мкФ

Проще всего проверить в PROTEUS в чем дело.

Я на взгляд не могу точно сказать правильно ли выбран канал в admux

Строчку PORTA = adc_data>>4;

замени на вывод числа и проверь горит ли эта комбинация на светодиодах.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Проблема с АЦП

Сообщение HarryStar » 29 ноя 2010, 18:47

Светодиоды горят, я уж все перепроверил.
EdGull писал(а):для начала подключи и настрой AREF на 5В

Вот это место мне как раз и непонятно.
AREF у меня висит в воздухе.
AVCC соединена с +5.
Настроить AREF - это что имелось в виду?

Вообще в ДШ написано что конденсатор на AREF ставится для повышения точности (в моем случае использования 4х старших бит должно быть пофигу). И кстати куда этот конденсатор вешается? С ножки AREF на землю? Или на +5? Сколько искал, везде говорят "подключите и все". Куда его подключать... непонятно. Но у народа в примерах и без него все работает.

Канал в ADMUX выбран правильно.
Код: Выделить всё
//        ++ - Эти 2 бита - опорное напряжение берется с AVCC
//        ||   +++ - Эти 3 бита - номер канала на порту А. Т.е. ADC7 - старший бит А
ADMUX = 0b01000111;
//           ++ - Эти 2 бита - Прямое преобразование и нет усиления (в DIP один фиг не поддерживается)
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Проблема с АЦП

Сообщение EdGull » 29 ноя 2010, 18:48

1. Кондер с AREF на землю
2. AREF на 5В
3. AVCC на 5В
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Проблема с АЦП

Сообщение boez » 29 ноя 2010, 18:59

А ADLAR кто ставить будет? Без него старшие 4 бита в ADCH всегда нули...
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Проблема с АЦП

Сообщение avr123.nm.ru » 29 ноя 2010, 19:33

HarryStar писал(а):Сколько искал, везде говорят "подключите и все". Куда его подключать... непонятно.


А вы в даташите посмотрите. Там НАРИСОВАНО !
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Проблема с АЦП

Сообщение Radist » 29 ноя 2010, 21:05

А вы уверены, что читаете из ацп ОБА байта результата? Если прочитать только один - работать не будет.
Ну и ногу AREF соединить не забудьте с питанием. Опорник то берется с нее, но чтобы чтото взять - надо сперва это иметь.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Проблема с АЦП

Сообщение HarryStar » 29 ноя 2010, 22:27

avr123.nm.ru писал(а):А вы в даташите посмотрите. Там НАРИСОВАНО !

Неправда. Нет там схемы. Там много логических схем "как оно работает". А схемы подключения с конденсатором нету. ДШ у меня открыт постоянно, я уж половину наизусть выучил.
Radist писал(а):А вы уверены, что читаете из ацп ОБА байта результата? Если прочитать только один - работать не будет.

Почему не будет? Там для этого есть выравнивание. И можно брать только 1 байт, с потерей точности до 8 бит. Даже мастер кода КодеВижн генерит такой пример если поставить галочку "8бит".
EdGull писал(а):1. Кондер с AREF на землю
2. AREF на 5В

Во! Спасибо. Завтра на работе попробую первым делом. Видимо это очевидно опытным людям, но впрямую это мало где написано. Я не нашел по крайней мере.
Radist писал(а):Ну и ногу AREF соединить не забудьте с питанием. Опорник то берется с нее, но чтобы чтото взять - надо сперва это иметь.

Я просто выбрал вариант REFS1=0 REFS0=1 - "AVCC with external -||- at AREF pin"
И соотв. думал, что опорное напряжение берется с пина AVCC, а AREF подключать к питанию необязательно.
Чем же тогда это будет отличаться от REFS1=0 REFS0=0 - "AREF, Internal Vref turned off" ? Если в обоих случаях опорное напряжение берется с ножки AREF?

Сорри, что много буков, просто хочется разобраться в неоднозначных вещах.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Проблема с АЦП

Сообщение Radist » 29 ноя 2010, 22:59

И тем не менее, хоть вы и берете только 8 бит и выравниваете по старшему байту - читать надо оба байта результата. Младший можно прочитать и тут же забыть о нем, но процедура чтения из младшего байта ОБЯЗАТЕЛЬНА (хотя в даташите пишут что и не обязательно). Порядок тоже имеет значение - сперва читаем младший байт. Насчет опорника может вы и правы, просто я привык эти биты обнулять, а снаружи пару выводов закоротить и все. Кстати, в даташите разве нет примера работы с ацп на асме и си?
На что еще нужно обратить внимание:
- номер канала, делитель тактовой частоты.
Я бы пока не лез в прерывания, сперва отладил бы преобразование. Вроде все просто: в два регистра записать, один бит проверять, один регистр прочитать. Когда найдете ошибку - будете долго смеяться, потому что ацп этот с программной точки зрения очень простой, работает всегда. Сам сишным кодом поделиться не могу (пишу на асме), поэтому в вашем коде с трудом разбираюсь. Что еще меня смущает: входы ацп вроде на порту А, и светодиоды на порту А. И напоследок вопрос на засыпку: к AVCC вы подключили +5В?
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Проблема с АЦП

Сообщение avr123.nm.ru » 29 ноя 2010, 23:10

HarryStar писал(а):Нет там схемы. Там много логических схем "как оно работает". А схемы подключения с конденсатором нету. ДШ у меня открыт постоянно, я уж половину наизусть выучил.


=
Вложения
adc.png
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Проблема с АЦП

Сообщение Radist » 29 ноя 2010, 23:13

HarryStar писал(а):Во! Спасибо. Завтра на работе попробую первым делом. Видимо это очевидно опытным людям, но впрямую это мало где написано. Я не нашел по крайней мере.


вот же написано
0 1 AVCC with external capacitor at AREF pin

2авр123: Речь шла о конденсаторе на опорнике, в приведенном рисунке его действительно нет.

ЗЫ. Когда проблема будет решена (я в этом уверен) - напишите, пожалуйста, в чем было дело.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Проблема с АЦП

Сообщение avr123.nm.ru » 29 ноя 2010, 23:33

Дак он спрашивает КУДА подключть второй вывод кондера. На рисунке ведь показано куда.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Проблема с АЦП

Сообщение HarryStar » 29 ноя 2010, 23:39

В том и дело, что никакого конденсатора, подключенного к AREF на картинке нет. И вообще AREF там никуда не подключено, как и у меня.
Radist писал(а):читать надо оба байта результата

Ужас. Я вообще думал, что от факта чтения ничего не зависит. Попробую.
Radist писал(а):- номер канала, делитель тактовой частоты.

Вот кстати! На что влияет частота АЦП? На время "усреднения" результата?
Я правильно понимаю, что в случае 500 кГц время преобразования 2 мкс, а в случае скажем 1000Гц время преобразования 1 мс?
Radist писал(а):к AVCC вы подключили +5В?

Да, конечно.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: Проблема с АЦП

Сообщение Radist » 30 ноя 2010, 07:09

Насчет деления частоты. В даташите сказано примерно так: ацп работает по своим тактам (те самые 13 тактов). Их частота должна быть 50-250 кГц. Они получаются из основной частоты делением (на 2, ....64....в даташите написано). То есть в зависимости от вашего кварца нужно делить на определенное число (сейчас у вас делитель максимальный). Для 8 МГц делить нужно на 64. При этом время преобразования составит около 100 мкс.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24