roboforum.ru

Технический форум по робототехнике.

помогите с АЦП :(

помогите с АЦП :(

lamobot.cpp » 21 сен 2005, 16:57

привет всем!
пытаюсь настроить АЦП на меге16-ничего не выходит :( мне это нужно для снятия показаний с переменного резистора-для пропорционального управления. короче я все делаю по даташиту, а результат преобразования вывожу на 8 светодиодов-короче у меня независимо от каких либо факторов они мигают но на ивенение входного напряжения не реагируют :(

lamobot.cpp » 21 сен 2005, 17:11

вот это глюк так глюк-если оцифровывать сигнал на ноге, к которой подведен подтягивающий  резистор и переменным резистором сводить напряжение на землю, то все работает :( а по правильному-один НЕРЕАЛЬНЕЙШИЙ шум, хотя кое какая стабилизация питания имеется. я так понял такая проблема не только с АЦП, но и с любым портом ввода

-= Александр =- » 21 сен 2005, 18:00

Ну, тогда давай рассказывай:
1) В чем пишешь?
2) Как включено питание? На все ли ноги? Есть там такое AVCC и AREF...
3) Какой кварц?
4) Кусок кода в студию!

А глюков быть не должно, у меня на M8535 все четко работало...

lamobot.cpp » 21 сен 2005, 23:45

AVR GCC компилер
шью понипрогом

питание на VCC и AVCC. AREF висит в воздухе (не подключен никуда)

юзаю встроенный тактовый генератор на 1МГц

//--------------------------------------------------------------------------------
// programmed by me :)
//--------------------------------------------------------------------------------

#include <avr/io.h>

// bit operations

#define SET(x) |=(1<<x)
#define CLR(x) &=~(1<<x)
#define INV(x) ^=(1<<x)

//--------------------------------------------------------------------------------
// timer delays (non interrupt-friendly!)
//--------------------------------------------------------------------------------

void d1ms()
{
for(char w=0;w<4;w++)
{
if(w==4) TCNT0=0x80;

while(bit_is_clear(TIFR,0));

TIFR SET(0);
}
}

void d1s()
{
for(int q=0;q<1000;q++) d1ms();
}

int main()
{
DDRC=0xff;
DDRD=0xff;
DDRB=0xff;

DDRA=0x00;
PORTA SET(0);

TCCR0 SET(0); // timer-prescaler

ADCSRA SET(7); // ADC ON
ADCSRA SET(5); // forever
ADCSRA SET(6); // RUN
ADMUX=0x00;
ADMUX CLR(7);
ADMUX SET(6);
ADMUX SET(5);

while(1)
{
PORTB=ADCH;
}

return 0;
}

//--------------------------------------------------------------------------------
// end
//--------------------------------------------------------------------------------

-= Александр =- » 22 сен 2005, 00:51

Ну так в AVCC и AREF все и дело! Один из них - опорное напряжение АЦП, а второй не помню что, но тоже для АЦП, так что цепляй их на Vcc и не будет никаких шумов!  :wink:

ASin » 22 сен 2005, 03:36

А AREF -- это базовое напряжение для сравнения. Например, если на ноге ADCn будет напряжение >= AREF, то в регистре будет 0x3FF; если ADCn == AREF/2, то в регистре -- 0x1FF и т.д.
Его, вроде, можно программно отключить и сделать базовым Vcc или 2.56 В от внутреннего источника.

-= Александр =- » 22 сен 2005, 04:24

Но проще подключить к Vcc. Или к опорному фильтру. MAXIM какие-то суперточные фильтры делает специально для этого. Если интересно - могу поискать, у меня про это было что-то...

lamobot.cpp » 22 сен 2005, 13:38

Спасибо, попробую AREF подцепить
хотя я вроде программно опорным сделал AVCC

Змей-Горыныч » 27 сен 2005, 06:35

A нога AVCC это питание порта А в целом. Этот порт запитывается отдельно от остальной части микроконтроллера. Вот такая вот хитрость!  :D


Rambler\'s Top100 Mail.ru counter