Проблемы с АЦП Attiny26

Доброго времени суток! Делаю я зарядное устройство. В качесиве управляющего сигнала использую ШИМ. Цепь такая:

  • источника - транзистор - батарея - (резистор + конденсатор 50 мкф паралельно) - земля Меряю напряжение на резисторе несколько раз в секунду. При измерении тестером (китайский М830)напряжения на резисторе, получаю устойчивое значение 0.16 В. Подключаю точку между резистором и батареей к входу АЦП, значение на АЦП скачкообразно меняется от 0 до ~150. При подключении резистивного делителя к входу АЦП, все нормально. Почему? Это програмная проблема или железная?

Максим

e-mail: max-ll%ukr.net

Вот программа:

char lcd_temp[6]; volatile unsigned char adc_done=1; int time=75; void BinBCD(char* str, uint16_t byte) { lcd_temp[5] = 0; lcd_temp[4] = byte % 10+0x30; byte /= 10; lcd_temp[3] = byte % 10+0x30; byte /= 10; lcd_temp[2] = byte % 10+0x30; byte /= 10; lcd_temp[1] = byte % 10+0x30; byte /= 10; lcd_temp[0] = byte % 10+0x30; byte /= 10;

} int main(void) { PLLCSR = 0x03;//0x03 lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_gotoxy(0,0); lcd_puts("----------------"); lcd_gotoxy(0,1); lcd_puts("Init progress..."); sbi(DDRB,PB1); TCCR1A = 0x42; TCCR1B = 0x03; OCR1A = time; TCCR0 = 0x05; OCR1C = 0XE4; //ADC6 ADMUX = 0x86; ADCSR = 0x8b; adc_done=0; TIMSK = 0x02; sei(); sbi(ADCSR,ADSC); lcd_clrscr(); while (1){ if (adc_done==1){ lcd_gotoxy(0,0); BinBCD(lcd_temp, ADCW); lcd_puts(lcd_temp); lcd_gotoxy(0,1); time = ADCL; adc_done = ADCH; //if (time < 104) { // OCR1A++; //} //if (time > 96 ) { // OCR1A--; //} adc_done=0; } BinBCD(lcd_temp, TCNT0); lcd_gotoxy(0,1); lcd_puts(lcd_temp); BinBCD(lcd_temp, OCR1A); lcd_gotoxy(9,1); lcd_puts(lcd_temp); } return 0; } INTERRUPT(SIG_OVERFLOW0) { sbi(ADCSR,ADSC); } INTERRUPT(SIG_ADC) { adc_done = 1; }

Максим

Reply to
Maxim Krasovsky
Loading thread data ...

MK> При измерении тестером (китайский М830)напряжения на резисторе, получаю MK> устойчивое значение 0.16 В. Подключаю точку между резистором и батареей к MK> входу АЦП, значение на АЦП скачкообразно меняется от 0 до ~150. MK> При подключении резистивного делителя к входу АЦП, все нормально. MK> Почему? Это програмная проблема или железная?

Стоит попробовать осциллограф на вход АЦП подключить, и будет видно, возможно.

MK> lcd_temp[4] = byte % 10+0x30; MK> byte /= 10; MK> lcd_temp[3] = byte % 10+0x30;

Библиотечный sprintf может быть заметно более эффективен (по времени).

MK> while (1){ MK> if (adc_done==1){ MK> lcd_gotoxy(0,0); MK> BinBCD(lcd_temp, ADCW); MK> adc_done=0; MK> }

MK> INTERRUPT(SIG_OVERFLOW0) MK> { MK> sbi(ADCSR,ADSC); MK> } MK> INTERRUPT(SIG_ADC) MK> { MK> adc_done = 1; MK> }

Грабли -- приход timer0 interrupt во время выполнения BinBCD.

Reply to
Kirill Frolov

получаю

батареей к

Жаль что нету у меня осцилографа, но подключил я на вход звуковухи. Да, там импульсы (почти пила), потому и прыгает, что попадает в разные точки импульса. Кто делал контроль тока при помощи PWM? Как мне теперь получить значение тока (напряжения на резисторе)? Делать выпрямитель или еще чего не хочется, потому как этот вход АЦП подключен к батарее, и при измерении напряжения на батарее относительно него меряется напряжение. А если взять несколько значений подряд и усреднить, то результат _+10-15 LSB.

Но не по размеру. Добавление в эту програмку вызова sprinf увеличивает прошивку с 1442 байт до 3296, а памяти в Attiny26 только 2 килобайта. Причем пять делений подряд (как у меня) занимает места меньше, чем если это же делать в цикле.

Максим

Reply to
Maxim Krasovsky

Здpавствуй, Maxim !

Wednesday November 03 2004 :: Maxim Krasovsky --> Kirill Frolov [Re: Проблемы с АЦП Attiny26]:

MK> Жаль что нету у меня осцилографа, но подключил я на вход звуковухи. MK> Да, там импульсы (почти пила), потому и прыгает, что попадает в разные

Осциллографы есть почти на всех кафедрах, накрайняк я мог бы принести свой переносной но это очень ненадолго.

До встpечи, Maxim ! Nik.

... [Электpоника] [Легкий Пpогpаммизм] [Книги] [-Mazafaka-]

Reply to
Yuri Nikiforov

Mon Nov 01 2004 22:17, Maxim Krasovsky wrote to All:

MK> Делаю я зарядное устройство. В качесиве управляющего сигнала использую MK> ШИМ. Цепь такая: MK> + источника - транзистор - батарея - (резистор + конденсатор 50 мкф MK> паралельно) - земля

Хорошо придумано. В результате источник щелкает через транзистор неограниченным током в конденсатор 50uF. MK> Почему? Это програмная проблема или железная?

Проблема с драйвером ruki.sys

VLV

"Быть честным - лучший способ оставаться бедным" (c) Hаполеон Бонапарт

Reply to
Vladimir Vassilevsky

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.