Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

ADC при ATMEGA16
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=5640
Страница 1 от 2

Автор:  tiger [ Сря Мар 26, 2008 10:48 pm ]
Заглавие:  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

Автор:  Nikola Kirov [ Чет Мар 27, 2008 12:06 am ]
Заглавие: 

Примерно
AVCC -> VCC
AGND -> GND
AREF -> със 100n към маса

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

Автор:  vankata [ Чет Мар 27, 2008 12:36 am ]
Заглавие: 

На схемата, която си дал, в три от вариантите на регистъра ще имаш резултати от АЦП-то. Верно различни показания, но ще има поне някакъв резултат.Ако не ти тръгва АЦП-то вероятно имаш проблем в останалият софтуер.Регистъра ти указва само сорса от който ще се задава опорното напрежение.В твоя случай имаш външен делител за първия случай, а с другите варианти все ще се получава пак някакво напрежение сумирано с това на делителя. С примера дето ти дава Никола, твърдо можеш да провериш дали ти е там проблема. Ако пак нямаш показания при неговите входни данни значи проблема ти е другаде.

Автор:  tiger [ Чет Мар 27, 2008 7:21 pm ]
Заглавие: 

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 | Прегледано 3101 пъти ]

Автор:  Nikola Kirov [ Чет Мар 27, 2008 7:49 pm ]
Заглавие: 

А ти колко варианта може да измислиш като ти се каже "със 100n към маса"?

Автор:  tiger [ Чет Мар 27, 2008 8:10 pm ]
Заглавие: 

Nikola Kirov написа:
А ти колко варианта може да измислиш като ти се каже "със 100n към маса"?

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

Автор:  tiger [ Пет Мар 28, 2008 12:28 pm ]
Заглавие: 

Свързах го така, но:
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);
}

Автор:  Реконструктор [ Вто Апр 01, 2008 12:31 am ]
Заглавие: 

0 0 AREF, Internal Vref turned off

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

Автор:  tiger [ Вто Апр 01, 2008 9:43 am ]
Заглавие: 

Реконструктор написа:
0 0 AREF, Internal Vref turned off

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

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

Автор:  VSU [ Вто Апр 01, 2008 9:51 am ]
Заглавие: 

5-10k не 5M

Автор:  tiger [ Вто Апр 01, 2008 10:04 am ]
Заглавие: 

VSU написа:
5-10k не 5M

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

Автор:  VSU [ Вто Апр 01, 2008 10:19 am ]
Заглавие: 

напиши си програмата така че половината функции не ти работят нито инит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();
}

Автор:  stanleyhacker [ Вто Апр 01, 2008 12:00 pm ]
Заглавие: 

Без истински референс източник, резултатът рядко ще е един и същ, да не говорим че АЦП на контролер е съвсем непретенциозна машинка. Сещам се че иамше един режим за power saving дето спираше някакъв клок , за да може измерването да се влияе по-малко от цифровите схеми в контролера. Пробвай него, когато тръгне всичко останало.

Автор:  Nikola Kirov [ Вто Апр 01, 2008 12:40 pm ]
Заглавие: 

Я не бъркай човека с глупости. Той и без това си е замотан :)

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

Автор:  tiger [ Чет Апр 03, 2008 9:57 pm ]
Заглавие: 

VSU написа:
5-10k не 5M

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

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/