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

АЦП на ATmega16 помощ (C code)
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=2201
Страница 1 от 1

Автор:  CorosanD [ Сря Апр 12, 2006 3:36 pm ]
Заглавие:  АЦП на ATmega16 помощ (C code)

Значи идеята е следната ! АЦП, пак ATmega 16, канал 0, потенциометър на входа от 0 до Vcc..обаче явно не прочитам конвертираната стойност по правилния начин и немога да индицирам в изхода че има някакво конвертиране въобще... ако някой може да даде идея къде може да е грешката или каде съм изпуснал нещо ще съм благодарен...


Цитат:
#include<avr/io.h>
int main (void)
{
DDRD = 0xFF;

int x = 0;
ADCSRA = (1<<ADEN) | (1<<ADPS2);

while (1)
{

ADMUX = 0;
ADCSRA |= (1<<ADSC);
while (ADCSRA & _BV(ADSC) ) {}
x = ADC;

PORTD = x<<PD4;
}

}

Автор:  TheHungry [ Сря Апр 12, 2006 3:44 pm ]
Заглавие: 

#include <mega16.h>

#define ADC_VREF_TYPE 0x40

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;


// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: Free Running
ADMUX=ADC_VREF_TYPE;
ADCSRA=0xA4;
SFIOR&=0x1F;

while (1)
{
// Place your code here

};
}


Така казва чичо Pavel Haiduc

Автор:  CorosanD [ Сря Апр 12, 2006 4:05 pm ]
Заглавие: 

Ами проблема пак е в тоя регистър ADCW .... принципно такъв в ATMegata поне аз незнам да има ... другия вариант е да се дефинира някаде в Mega16.h файла обаче аз го нямам а и немога да го намеря..ако можеш да ми помогнеш да го намеря него може и да стане далаверата ..

Автор:  Реконструктор [ Сря Апр 12, 2006 5:03 pm ]
Заглавие: 

като начало - какъв резултат ти трябва - 10 или 8 битов?

Автор:  CorosanD [ Сря Апр 12, 2006 5:27 pm ]
Заглавие: 

Ами резултатът на АЦП-то е 10 битов мен ми трябва да го искарам на 8 битовия PORTD...като за начало.. иначе идеята е всички битове да ги изкарам през един извод...Примерно подавам нещо на входа на АЦП-то и на един светодиод получавам конвертирания цифров сигнал като цифрова поредица...

Автор:  CorosanD [ Сря Апр 12, 2006 10:20 pm ]
Заглавие: 

Готово оправих го

Автор:  Реконструктор [ Чет Апр 13, 2006 9:38 am ]
Заглавие: 

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

Автор:  CorosanD [ Пет Апр 14, 2006 3:23 pm ]
Заглавие: 

Има логика. Сега проблема е малко по различен и е от хардуерно естество. Значи подава се аналогов сигнал от микрофон той се усилва и се филтрира следтова от ниско честотен филтър за 3,4kHz ( за отделяне на говора ) след това сигнала се подава на входа на АЦП-то. Феноменът (поне за мен) е следния-> Когато микрофонът и след това фълтъра не са свързани към входа на АЦП-то тогава амплитудата на сигнала в изхода на филтъра е към 1V...проблемът възниква когато изхода на активния филтър го свържа директно към входа на АЦП-то...тогава сигналав изхода на филтъра изчезва 8O . Цялата далавера се оправи като сложих резисторен делител в изхода на филтъра и преди входа на АЦП-то, чрез който да регулирам нивото на сигнала постъпващ на ADC0...проблема ми е че стойностите на тези резистори са нетипични, а не искам да го правя чрез допълнителни тримери и т.н (въпрос на много фактори + място). Просто не разбирам как като не е свързан към контролера, филтъра с микрофона работи а като го вържа към ВХОДА на АЦП-о спира...какъф товар е този вход ?! и защо на него имам напрежение към 1,25V...АЦП-то работи супер но се замислям дали няма вариант чрез програмата да опиша какъв сигнал подавам на АЦП-то - постоянен или променлив ?! при постоянен сигнал от потенциометър между +5V и 0 подаден на АЦП-то сичко бачка супер но при променливия от микрофона с филтъра вече става кофти и сигнала следфилтъра изчезва някаде по входа на контролера 8O ИДЕИ ? :?

Автор:  CorosanD [ Нед Апр 16, 2006 3:41 pm ]
Заглавие: 

Е никой ли не може да помогне ?! Браво

Автор:  setoy [ Пон Апр 17, 2006 9:15 am ]
Заглавие: 

Ми дай да видим схемата де! А както работи с делител, защо не го оставиш така и да ме се занимаваш с глупости??

Че толкова ли е бързо АЦП-то на мегата, че да се справи със сигнал директно от мисрофон :roll: 8O

Автор:  CorosanD [ Пон Апр 17, 2006 11:17 am ]
Заглавие: 

При носеща на аналоговия сигнал 15kHz и тактова на ATMega-та 16Mhz с външен осцилатор дали е бавно ?!

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