Отговори на тема  [ 28 мнения ]  Отиди на страница 1, 2  Следваща
ADC при ATMEGA16 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Мар 04, 2007 10:21 pm
Мнения: 70
Мнение ADC при ATMEGA16
Опитван се да пусна АЦП-то на атмега16, но без успех. Намерих тази схема в нета. Крачета 30, 31 и 32 така ли трябва да се свършат. AGND съм го вързал както е на схемата, AVCC - дирекно на + (без бобината и кондензатора), а AREF го забравих и по-късно с една жичка го дадох на късо с AVCC, но пак не работеше. Та както е на схемата ли да ги свърша или AVCC и AREF да ги вържа на + без нищо друго?

А как трябва да настроя REFS1:0?
Код:
REFS1 REFS0 Voltage Reference Selection
0     0      AREF, Internal Vref turned off
0     1      AVCC with external capacitor at AREF pin
1     0      Reserved
1     1      Internal 2.56V Voltage Reference with external capacitor at AREF pin


Сря Мар 26, 2008 10:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Примерно
AVCC -> VCC
AGND -> GND
AREF -> със 100n към маса

1 1 Internal 2.56V Voltage Reference with external capacitor at AREF


Чет Мар 27, 2008 12:06 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Юли 13, 2007 10:19 am
Мнения: 52
Местоположение: Хасково
Мнение 
На схемата, която си дал, в три от вариантите на регистъра ще имаш резултати от АЦП-то. Верно различни показания, но ще има поне някакъв резултат.Ако не ти тръгва АЦП-то вероятно имаш проблем в останалият софтуер.Регистъра ти указва само сорса от който ще се задава опорното напрежение.В твоя случай имаш външен делител за първия случай, а с другите варианти все ще се получава пак някакво напрежение сумирано с това на делителя. С примера дето ти дава Никола, твърдо можеш да провериш дали ти е там проблема. Ако пак нямаш показания при неговите входни данни значи проблема ти е другаде.


Чет Мар 27, 2008 12:36 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Мар 04, 2007 10:21 pm
Мнения: 70
Мнение 
Nikola Kirov написа:
Примерно
AVCC -> VCC
AGND -> GND
AREF -> със 100n към маса

1 1 Internal 2.56V Voltage Reference with external capacitor at AREF

За AREF така ли трябва да се свърже?

vankata, резултат ми изкарва от АЦП-то, но когато променям напрежението, което трябва да отчита резултата не се променя, а влиза в прекъсването за това, че е готово. Резултата се променя при рестартиране на микроконтролера


Прикачени файлове:
aref.PNG
aref.PNG [ 2.21 KiB | Прегледано 3096 пъти ]
Чет Мар 27, 2008 7:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
А ти колко варианта може да измислиш като ти се каже "със 100n към маса"?


Чет Мар 27, 2008 7:49 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Мар 04, 2007 10:21 pm
Мнения: 70
Мнение 
Nikola Kirov написа:
А ти колко варианта може да измислиш като ти се каже "със 100n към маса"?

Малко съм скаран с хардуера. Пък както казват "от питане глава не боли"


Чет Мар 27, 2008 8:10 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Мар 04, 2007 10:21 pm
Мнения: 70
Мнение 
Свързах го така, но:
1. Ако на входа на ADC0 има 0 V диодите не светят (диодите ми показват двоичната стойност на ADCL)
2. Ако има от около 2 до 5 V - всички светят
3. Ако има между 0 и 2 V светят някои, след като рестартирам контролера светват по друг начин, това става без да променям напрежението ADC0!
4. Ако променям напрежението на ADC0, светенето на диодите не се променя. А влиза в прекъсване за завършено преобразуване
Ето кода:
Код:
#include <avr/io.h>
#include <avr/interrupt.h>

void my_delay(void)
{
   unsigned long i = 10000;
   while(i--);
}

ISR(ADC_vect)
{
   unsigned char c;
   static char bin = 0;   

   c = ADCL;
   PORTD = c;
   bin = ~bin;
   PORTD = (PORTD & 0b11111110) | (bin & 00000001);
   my_delay();
   ADCSRA = ADCSRA | 0b01000000;
}

void init_ADC(void)
{
   ADMUX = 0b11000000;
   ADCSRA = 0b10011000;
   SFIOR = 0x00;
   sei();
}

void main(void)
{
   init_ADC();
   
   DDRD = 0xff;

   ADCSRA = ADCSRA | 0b01000000;
   while(1);
}


Пет Мар 28, 2008 12:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
0 0 AREF, Internal Vref turned off

Това е правилната комбинация, ако ползваш AREF (дето си го дал на късо към AVCC)


Вто Апр 01, 2008 12:31 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Мар 04, 2007 10:21 pm
Мнения: 70
Мнение 
Реконструктор написа:
0 0 AREF, Internal Vref turned off

Това е правилната комбинация, ако ползваш AREF (дето си го дал на късо към AVCC)

Всичко комбинации пробвах и когато AREF е към +5V, и когато е през кондензатор към масата и все това прави, което написах в горния пост.
А колко трябва да ми е потенциометъра, с който променям напрежението на входа на АЦП-то? Казаха ми да сложа голям и аз сложих 5М ома и се чудя дали не е прекалено голям


Вто Апр 01, 2008 9:43 am
Профил
Ранг: Напреднал
Ранг: Напреднал

Регистриран на: Нед Авг 14, 2005 1:08 pm
Мнения: 433
Местоположение: Казанлък
Мнение 
5-10k не 5M


Вто Апр 01, 2008 9:51 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Мар 04, 2007 10:21 pm
Мнения: 70
Мнение 
VSU написа:
5-10k не 5M

Може ли от там да идва проблема? Ще го сменя, но в края на седмицата, че сега нямам време


Вто Апр 01, 2008 10:04 am
Профил
Ранг: Напреднал
Ранг: Напреднал

Регистриран на: Нед Авг 14, 2005 1:08 pm
Мнения: 433
Местоположение: Казанлък
Мнение 
напиши си програмата така че половината функции не ти работят нито инитADC нито делай
има дебъгер в AVR Studio ползвай го !!!


#include <avr/io.h>
#include <avr/interrupt.h>

int my_delay();
int init_ADC();

ISR(ADC_vect)
{
unsigned char c;
static char bin = 0;

c = ADCL;
PORTD = c;
bin = ~bin;
PORTD = (PORTD & 0b11111110) | (bin & 00000001); <--- каква е идеята на този ред ???
my_delay();
ADCSRA = ADCSRA | 0b01000000;
}



int main(void)
{
init_ADC();

DDRD = 0xff;

ADCSRA = ADCSRA | 0b01000000;
while(1);
}

int my_delay()
{
unsigned int i;
for(i=0;i<1000;i++);
}

int init_ADC()
{
ADMUX = 0b11000000;
ADCSRA = 0b10011000;
SFIOR = 0x00;
sei();
}


Вто Апр 01, 2008 10:19 am
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Чет Дек 02, 2004 7:22 pm
Мнения: 140
Мнение 
Без истински референс източник, резултатът рядко ще е един и същ, да не говорим че АЦП на контролер е съвсем непретенциозна машинка. Сещам се че иамше един режим за power saving дето спираше някакъв клок , за да може измерването да се влияе по-малко от цифровите схеми в контролера. Пробвай него, когато тръгне всичко останало.


Вто Апр 01, 2008 12:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Я не бъркай човека с глупости. Той и без това си е замотан :)

tiger с гадаене няма да стане работатата. Направи си Jtag и дебъгвай. Можеш да си променяш и стойноста на регистрите докато си откриеш грешката.
А и изобщо развой без хардуерен дебъгер правят вече 2 категории хора,мазохисти и глупаци. :):):):)


Вто Апр 01, 2008 12:40 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Мар 04, 2007 10:21 pm
Мнения: 70
Мнение 
VSU написа:
5-10k не 5M

Сложих 1К (такъв намерих) и сега колкото и рестарт да давам резултата е 1 и същ, но когато въртя потенциометъра диодите не променят светенето си :( , а ако врътна потенциометъра и рестартирам се променя
VSU, благодаря за опита да ми помогнеш, но като начало когато някоя функция е дефинирана като int тя трябва да връща променлива от тип int, а в кода, който предложи не се връща. Все пак го пуснах и даде 22 грешки.
Nikola Kirov, много приличаш на един колега - и по снимка и по начин на писане. А ако се захвана да правя JTAG може би след 9 месеца ще проработи... Иначе знам, че е по лесно


Чет Апр 03, 2008 9:57 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 28 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни