Схема влючения простая. Вход АЦП (PB4) зашунтирован на обший резистором 68 Ом и конденсатором 1000 мкф. Осциллограф и тестер утверждают, что там 0 В. Да и по уму ничему другому там взяться неоткуда. Плата мытая. Результатом преобразования имеем значение 15 или около того. Вход АЦП (PB3) зашунтирован на общий резистором 4,7 кОм. Картина примерно таже самая. Суть проблемы в целом такова, что на нижнем пределе нет устойчивой однозначности результата преобразования. Плавно изменяющееся напряжение, снятое с RC-цепочки (время изменения от 1,03 В до 0 В примерно 1,5 с) демонстрирует даже какое-то подмигивание перед выключением светодиода, но не всегда а только примерно в 20% случаев. Из 10 значащих бит АЦП использую только старшие 8. Монтаж СМД, перекосов общего провода вродебы нет. Контроллер управляет MOSFETами, а они светодиодами. Яркость светодиодов управляется аппаратным ШИМом от таймера. Ну вобщем суть вопроса в том, как избавиться от миганий светодиода при нижних значениях яркости, в т.ч. и при нулевой яркости? Спасибо.
Код
volatile unsigned int c1,c2,adc_data;
volatile unsigned char t1,t2,flag1,flag2;
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | 0b01100000;
ADCSRA |= (1<<ADSC); //начать преобразование
while (!(ADCSRA & (1<<ADIF))) {asm("nop");}; //ждем появления флага завершения преобр.
ADCSRA |= (1<<ADIF);//сбросить флаг
//return ADCW;
return ADCH;
}
ISR(TIM0_OVF_vect)
{
if(flag1==1)
{
OCR0A=t1;
flag1=0;
}
if(flag2==1)
{
OCR0B=t2;
flag2=0;
}
}
int main(void)
{
PORTB = 0b00000000;
DDRB = 0b00000111;
OCR0A = 0;
OCR0B = 0;
TCNT0 = 0x01; //set count
TCCR0A = 0b10100001;
TCCR0B = 0b00000100; //start timer
TIMSK0 = 0b00000010;
DIDR0=0b00011000;
ACSR = 0x80;//компаратор выключить
ADCSRA = 0b10000110;
asm("sei");
while(1)
{
if(flag1==0)
{
adc_data=read_adc(2);
c1=0;
for(unsigned char i=0; i<250; i++)
{
adc_data=read_adc(2);
if(adc_data>c1) c1=adc_data;
}
t1=(unsigned char)c1;
if(c1>=250) t1=255;
if(c1<4) t1=0;
flag1=1;
}
if(flag2==0)
{
adc_data=read_adc(3);
c2=0;
for(unsigned char i=0; i<250; i++)
{
adc_data=read_adc(3);
if(adc_data>c2) c2=adc_data;
}
t2=(unsigned char)c2;
if(c2>=250) t2=255;
if(c2<10) t2=0;
flag2=1;
}
// OCR0A=pgm_read_byte(&brightness[t1]);
// OCR0B=pgm_read_byte(&brightness[t2]);
asm("nop");
}
return 0;
}
Живи днем так, чтобы ночью ты спал спокойно.