Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: input capture mega8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ReM37
Нужно измерить длительность импульса. Но никак не понимаю как это сделать. Datasheet читал. Но все равно непонятно. sad.gif То есть понятно, что для этого надо использовать Timer1, но как настроить так, чтобы счет начался по нарастающему фронту, а заканчивался ро спадающему? Очень нужен пример на C...
defunct
Что-то неприпомню чтобы таймер можно было настроить так, чтобы он сам запускался.
Запустить таймер можно например по внешнему прерыванию.
А остановить по прерыванию Input Capture.

т.е. заводим сигнал параллельно например на Int0 и на ICP1, настраиваем Int0 на генерацию прерывания по положительному фронту. В обработчике прерывания Int0 запускаем таймер в режиме IC по отрицательному фронту. По прерыванию IC останавливаем таймер и вычитываем значение из регистров ICRx.
ReM37
Понял. Спасибо.
bezobraznic
Цитата(ReM37 @ Nov 29 2006, 00:35) *
Нужно измерить длительность импульса. Но никак не понимаю как это сделать. Datasheet читал. Но все равно непонятно. sad.gif То есть понятно, что для этого надо использовать Timer1, но как настроить так, чтобы счет начался по нарастающему фронту, а заканчивался ро спадающему? Очень нужен пример на C...


Вот держи!!! Длительность=Tf-Tr; Рабочий пример!!

interrupt [TIM1_CAPT] void tim1_capt_isr(){
static register unsigned int temp;

temp = ICR1L; //Read low byte first (important)
temp |= (unsigned int)ICR1H << 8; //Read high byte and shift into top byte

if (CAPTURE_FRONT_F){ //обработка переднего фронта импульса тока
TCCR1B = 0b10000001; //switch to falling edge
CAPTURE_FRONT_F = 0;
Tr=temp+4; //компенсация
} //if
else { //обработка заднего фронта импульса тока
TCCR1B = 0b11000001; //switch to rising edge
CAPTURE_FRONT_F = 1;
Tf=temp-4; //компенсация
} //else
}//tim1_capt_isr()
Andreas1
Цитата
Tr=temp+4; //компенсация

Не понял, чего компенсировать?
Ведь значение счетчика защелкивается в ICR по фронту/спаду.
ReM37
Цитата(bezobraznic @ Nov 29 2006, 00:06) *
Вот держи!!! Длительность=Tf-Tr; Рабочий пример!!


Про такой вариант я думал. Но как с переполнением ICR1?
Пример:
Tf=30000
Tr=50000
Tf-Tr=20000 OK.

А если:
Tf=60000
Tr=60000+20000=???
Tf-Tr=???

По моему неправильно. Или я не понял?
Andreas1
Цитата
Tf=60000
Tr=60000+20000=???
Tf-Tr=???

60000+20000-65536=14464
14464-60000+65536=20000
Так что все работает, пока разность не превысит 65535, а далее нужен учет переполнений T1.
Но зачем коррекция я не понял.
ReM37
14464-60000+65536=20000 ???
Это Tf-Tr?

Tf=60000
Tr=14464 OK (60000+20000) т.к. переполнение
Tf-Tr=60000-14464=45536
Andreas1
Цитата
Пример:
Tf=30000
Tr=50000
Tf-Tr=20000 OK.

Ну сами же перепутали Tf-Tr=-20000

Еще раз
Tf=30000
Tr=50000
Tr-Tf=20000

Tf=60000
Tr=60000+20000=14464 Переполнение
Tr-Tf=14464-60000+65536=20000 Переполнение

Работает, работает, все давно проверено.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.