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

Nov 01, 2004 4 Replies

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



  • источника - транзистор - батарея - (резистор + конденсатор 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; }


Максим


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.

получаю

батареей к

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

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

Максим

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

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

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

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

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

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

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

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

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

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

VLV

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required