Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глюк компаратора при включенном ADC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
fmdost
На компараторе собран узел детектора перехода через 0. При включенном ADC на выходе компаратора начинают проскакивать "лишние" импульсы с явно выраженной периодичностью. При выключенном ADC, работает без помех.

Где накосячил? Спсб.


CODE
void config_sys(void){

//установить направление
DDRB=((0<<DDB0) | (0<<DDB1) | (1<<DDB2) | (0<<DDB3) | (0<<DDB4) | (0<<DDB5));

//установить подкладку
PORTB=((0<<PB0) | (0<<PB1) | (1<<PB2) | (0<<PB3) | (0<<PB4) | (0<<PB5));

//отключить лишнее IO
DIDR0=((1<<ADC0D) | (0<<ADC1D) | (1<<ADC2D) | (1<<ADC3D) | (1<<AIN0D) | (1<<AIN1D));

//отключить WDT!
__watchdog_reset();
MCUSR=0;
WDTCR=((0<<WDTIE)|(0<<WDP3)|(1<<WDCE)|(1<<WDE)|(0<<WDP2)|(0<<WDP1)|(0<<WDP0)); //16ms
WDTCR=((0<<WDTIE)|(0<<WDP3)|(0<<WDCE)|(0<<WDE)|(0<<WDP2)|(0<<WDP1)|(0<<WDP0)); //16ms

GTCCR= ( (1<<TSM) | (1<<PSR10)); //
TCCR0A= ( (0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (0<<WGM00)); //CTC
TCCR0B= ( (0<<FOC0A) | (0<<FOC0B) | (0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00)); // 1/1024
TIMSK0= ( (0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0)); //

OCR0B=OCR0A=93; //100Гц

ADCSRA= ( (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (1<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) ); //
ADCSRB= ( (0<<ACME) | (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0) ); //запускать конверсию вручную
#define ADJS_IN ((0<<REFS0) | (0<<ADLAR) | (1<<MUX1) | (1<<MUX0)) //температуро
ADMUX = ADJS_IN ;
ACSR = ( (0<<ACD) | (0<<ACBG) | (0<<ACO) | (1<<ACI) | (1<<ACIE) | (0<<ACIS1) | (0<<ACIS0) ); //запускать конверсию от TC0compare

GTCCR= ( (1<<TSM) | (0<<PSR10)); // Фперёд!

MCUCR= _sleep_type_idle();

CLKPR =(1<<CLKPCE);
CLKPR =((0<<CLKPS0)|(0<<CLKPS1)|(0<<CLKPS2)|(0<<CLKPS3)|(0<<CLKPCE));//1
}

void main(void){

config_sys();

while(1){

if ( ! (ADCSRA & (1<<ADSC)) ){
data_TEMPRADJS =ADC;
}
}
}

#pragma vector=ANA_COMP_vect
__interrupt void anarout(void){ // !!!!!!!!!!!!!!! для прповерки вот тут включает OUT

if (dbg ++ & 0x01)
TRIAC_ON(); // тут включает OUT
else
TRIAC_OFF();

}
Сергей Борщ
А не может по окончании преобразования АЦП по какой-то причине происходить сброс? Например, у вас разрешено прерывание АЦП а обработчика не видно и в программе вы проверяете флаг преобразования - обычно это взаимоисключающие действия... Попробуйте при старте выводить на свободную ногу импульс сразу после инициализации.
fmdost
Это не сброс. Импульсы помехи очень короткие, а в векторах стоят reti. Помеха появляется после записи в ADMUX, даже при выключенном ADC!
domowoj
А чем вам не нравятся рекомендации Атмел - AVR182?
rx3apf
Лениво разбираться с инициализацией, но ... А вход ADC и компаратора настроены на одну ногу ? Тогда ничего удивительного, схема выборки-хранения просто обязана доавть помеху.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.