Настройка АЦП в ATMega32.

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

мда. с ходу и не поправишь.
первое. у вас остались REFSы а единицах. Должны быть в нулях.
И вот это void ADC_Result() где вызывается? Где результат нужен?
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Короче. Давай пока без усреднения, для проверки работоспособности.

В main первыми строками пишешь

Код: Выделить всё

main()//Îñíîâíàÿ ôóíêöèÿ ïðîãðàììû
{
  __enable_interrupt();//Âêëþ÷àåì ãëîáàëüíî ïðåðûâàíèÿ
  adc_init();
  for(;;)
  {
    Start_ADC_Convert();
    --- тут вписать вывод переменной voltage.
  }
// дальще как было...


в прерывании пока так.

Код: Выделить всё

#pragma vector =ADC_vect//Ïðåðûâàíèå ïî çàâåðøåíèþ ïðåîáðàçîâàíèÿ íàïðÿæåíèÿ
__interrupt void ADC_vector(void)
{
 voltage=ADC;//Äëÿ áîëüøåé òî÷íîñòè íàêàïëèâàåì èçìåðåíèÿ
//  count_adc++;//Ñäåëàíî åùå îäíî ïðåîáðàçîâàíèå
}
ADC.h такой
Спойлер

Код: Выделить всё

unsigned short voltage_in=0,voltage=0;
volatile unsigned char count_adc;//Êîëè÷åñòâî îòñ÷åòîâ äëÿ ÀÖÏ

void adc_init()//Ôóíêöèÿ èíèöèàëèçàöèè ÀÖÏ
{
  CB(DDR_ADC,PIN_ADC);
  ADMUX|=(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(0<<MUX4)|(0<<REFS0)|(0<<REFS1)|(0<<ADLAR);
  SFIOR|=(0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0);
  ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADIF)|(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0)|(0<<ADATE);
//  ADCSRA|=(1<<ADSC);//Äåëàåì ïåðâûé îòñ÷åò
}


void Start_ADC_Convert()
{
  ADCSRA|=(1<<ADSC);
}

void ADC_Result()
{
  if(count_adc==5)//Åñëè ñäåëàëè 5 çàìåðîâ íàïðÿæåíèÿ
  {
    voltage_in=voltage;
    count_adc=0;//Îáíóëÿåì êîë-âî çàìåðîâ
    voltage=0;//Îáíóëÿåì ïåðåìåííóþ äëÿ ñóììèðîâàíèÿ
  }
}

всё. теперь у тебя в voltage должно быть значение от 0 до 1023 соответствующие вольтажу от 0 до 5В (если схема на 5В).

потом уже усредняй.
Реклама
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

__Alexander писал(а):
AaNnDdRrEeYy писал(а): нет должно быть так REFS1 =0 REFS0=1
А давайте вы сейчас сделаете снимок страницы из документации, где вы вычитали этот бред.
вторая строчка в таблице.

Изображение
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

AaNnDdRrEeYy писал(а): вторая строчка в таблице.
Изображение
Уже лучше. И что же написано во второй строчке?
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

ADC_Result вызывается в

Код: Выделить всё

void tranceive_array_load()//Функция отправки показаний датчиков и приема команд
{
  ADC_Result();
 Start_ADC_Convert();
бла-бла-бла.
}
REFS в единицы я поставил,чтобы посмотреть,что будет при внутреннем ИОН,ничего не изменилось.
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Реклама
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

__Alexander писал(а):
AaNnDdRrEeYy писал(а): вторая строчка в таблице.
Изображение
Уже лучше. И что же написано во второй строчке?
во второй строчке написано
для того что бы источник опорного напряжения брался с ноги AREF. выстави REFS1 = 0 а REFS0 =1

вот статья обучалка в ней есть код

Код: Выделить всё

//ион - напряжение питания, выравнивание влево, нулевой канал
ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);

вот еще цитата с этого сайта
Регистр ADMUX
Модулю АЦП для работы нужен источник опорного напряжения (ИОН). За выбор ИОНа отвечают биты REFS1, REFS0. В нашем случае опорное напряжение это напряжение питания (именно поэтому мы завели вывод AVcc на +5В) поэтому REFS1 - 0, REFS0 - 1
и там же по ссылки схема подключения
Реклама
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

Pika4u писал(а):ADC_Result вызывается в

Код: Выделить всё

void tranceive_array_load()//Функция отправки показаний датчиков и приема команд
{
  ADC_Result();
 Start_ADC_Convert();
бла-бла-бла.
}
REFS в единицы я поставил,чтобы посмотреть,что будет при внутреннем ИОН,ничего не изменилось.
а чем напряжение меняется на ножке МК? резистор переменный?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

AaNnDdRrEeYy писал(а): во второй строчке написано
для того что бы источник опорного напряжения брался с ноги AREF. выстави REFS1 = 0 а REFS0 =1
Там так не написано. Слово capacitor ниче не говорит? Переведите что-ли гуглом.
AaNnDdRrEeYy писал(а): вот еще цитата с этого сайта
СпойлерРегистр ADMUX
Модулю АЦП для работы нужен источник опорного напряжения (ИОН). За выбор ИОНа отвечают биты REFS1, REFS0. В нашем случае опорное напряжение это напряжение питания (именно поэтому мы завели вывод AVcc на +5В) поэтому REFS1 - 0, REFS0 - 1
и там же по ссылки схема подключения
Тут всё правильно. Но у ТС совершенно не так подключено.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Сообщение Pika4u »

__Alexander писал(а):
AaNnDdRrEeYy писал(а): во второй строчке написано
для того что бы источник опорного напряжения брался с ноги AREF. выстави REFS1 = 0 а REFS0 =1
Там так не написано. Слово capacitor ниче не говорит? Переведите что-ли гуглом.
AaNnDdRrEeYy писал(а): вот еще цитата с этого сайта
СпойлерРегистр ADMUX
Модулю АЦП для работы нужен источник опорного напряжения (ИОН). За выбор ИОНа отвечают биты REFS1, REFS0. В нашем случае опорное напряжение это напряжение питания (именно поэтому мы завели вывод AVcc на +5В) поэтому REFS1 - 0, REFS0 - 1
и там же по ссылки схема подключения
Тут всё правильно. Но у ТС совершенно не так подключено.
У меня AREF и AVCC заведены на +5,конденсатор стоит вплотную к AREF.
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Pika4u писал(а): У меня AREF и AVCC заведены на +5,конденсатор стоит вплотную к AREF.
я знаю. читать тему с первого сообщения не разучился. )
И дал вам правильный рабочий код. Вы его хоть проверили?
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

__Alexander писал(а): Там так не написано. Слово capacitor ниче не говорит? Переведите что-ли гуглом.

Тут всё правильно. Но у ТС совершенно не так подключено.
так мы про биты выясняли а не про то как там ТС спаял. Кстати без конденсатора у меня тоже нормально работает.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

AaNnDdRrEeYy писал(а): так мы про биты выясняли а не про то как там ТС спаял. Кстати без конденсатора у меня тоже нормально работает.
Ну так вы про биты неправильно сказали. А то, что у вас там работает без чего либо... это оставьте себе и не советуйте делать так-же.

Короче, устал, по таблице

REFS1 REFS0
0 0 - ИОН берется с ноги AREF. Внутренний ИОН выключен.
0 1 - ИОН берется с ноги AVCC, с подключенным конденсатором к выводу AREF.
1 0 - нет
1 1 - ИОН внутренний на 2.56 В

Если 5В заведено напрямую на AREF, что надо выставить?
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

соединить вместе AREF AVCC и + 5 вольт. без кондера вообще
в регистр записать 0 1
Ответить

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