den2life

"мерить" Емкость

2 сообщения в этой теме

den2life    2

Вообщем я решил использовать компаратор управляющий схемой захват. Это ж возможно? Только вот что я ни как не пойму на счет результата регистра(буфера) ICR1, в каком формате он сохраняется от $00 до $FF или любом числом в виде?

Вот прикинь такую ситуацию, допустим данная RC - цепочка(R= 10k,C=295пФ - 357пФ) подключена к выводу OC1A которая в свою очередь генерирует ШИМ с периодом ~50мксек, выход RC-цепи подана на AIN0, а AIN0 подключена к схеме захвата таймер/счетчика Т1 (1<<ACIC), при лог.1 регистр захвата будет подсчитывать тактовые импульсы которые "влезут" в один период лог.1 с выхода компаратора. Но что то у меня не всё так гладко. Почему то не хочет работать ШИМы генерируються но вот результат схемы захвата регистра ICR1 почему то равен 0. Проверял так:

#include <mega8.h> 
#include <delay.h> 
volatile unsigned int buffer = 0; 


interrupt [TIM1_CAPT] void timer1_capt_isr(void) 
{ 
if ((ACSR&(1<<ACO))!= 0) 
buffer = (ICR1L|ICR1H); 

} 

void main (void) 
{ 
PORTC = 0; 
DDRC = (1<<3)|(1<<2)|(1<<1)|(1<<0);         //for led 
PORTD = (0<<7)|(0<<6);                      //disable resistors 
DDRD = (0<<7)|(0<<6);                       //ENTER for comparator 
PORTB = (0<<3);                            //отключаем подтягивающий резистор 
DDRB = (1<<3)|(1<<1);                             //выход регистра OC2 

TCCR2 = (0<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<COM20)|(1<<CS22)|(0<<CS21)|(1<<CS20);       //режим работы Phase correct PWM,  
                 //подключен к выводу OC2, предделитель clk(i/o)/1024 
TCCR1A = (0<<COM1A1)|(1<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10); 
TCCR1B = (0<<ICNC1)|(1<<ICES1)|(1<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10); 
ACSR = (0<<ACD)|(1<<ACBG)|(0<<ACIE)|(1<<ACIC)|(0<<ACIS1)|(0<<ACIS0);        //настройка компаратора вкл, ИОН не подключен 
OCR2 = 170;         //регистр сравнения равен 100 при сравнении регистра счета сбрасывается в $00 
OCR1A = 6; 
TIMSK = (1<<TICIE1); 


#asm ("sei") 
while(1) 
{ 
if ((ACSR&(1<<ACO))!= 0) 
{ 
if (buffer == 0) 
PORTC =(1<<1); 
if (buffer > 1) 
PORTC = (0 << 1); 
} 
else 
{ 
if (buffer == 0) 
PORTC = (0<<1); } 
//else if ((ACSR&(1<<ACO))!= 1) 
//PORTC = (1<<1);   
} 
}

post-144830-0-32381500-1335239727_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fuckir    6

..только не "мерить", а "измерять"

а если так:

С одного цифрового выхода подавать одиночный импульс заряжающий конденсатор. Включать таймер и отслеживать на другом входе логический ноль и уходить в прерывание, где извлекать накопленное значение таймера. Останется только отколибровать\проградуировать значение таймера в величину емкости.

Изменено пользователем fuckir

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас