Перейти к содержанию
    

input capture mega8

Нужно измерить длительность импульса. Но никак не понимаю как это сделать. Datasheet читал. Но все равно непонятно. :( То есть понятно, что для этого надо использовать Timer1, но как настроить так, чтобы счет начался по нарастающему фронту, а заканчивался ро спадающему? Очень нужен пример на C...

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

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


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

Что-то неприпомню чтобы таймер можно было настроить так, чтобы он сам запускался.

Запустить таймер можно например по внешнему прерыванию.

А остановить по прерыванию Input Capture.

 

т.е. заводим сигнал параллельно например на Int0 и на ICP1, настраиваем Int0 на генерацию прерывания по положительному фронту. В обработчике прерывания Int0 запускаем таймер в режиме IC по отрицательному фронту. По прерыванию IC останавливаем таймер и вычитываем значение из регистров ICRx.

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


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

Нужно измерить длительность импульса. Но никак не понимаю как это сделать. Datasheet читал. Но все равно непонятно. :( То есть понятно, что для этого надо использовать 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()

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


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

Tr=temp+4; //компенсация

Не понял, чего компенсировать?

Ведь значение счетчика защелкивается в ICR по фронту/спаду.

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


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

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

 

Про такой вариант я думал. Но как с переполнением ICR1?

Пример:

Tf=30000

Tr=50000

Tf-Tr=20000 OK.

 

А если:

Tf=60000

Tr=60000+20000=???

Tf-Tr=???

 

По моему неправильно. Или я не понял?

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


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

Tf=60000

Tr=60000+20000=???

Tf-Tr=???

60000+20000-65536=14464

14464-60000+65536=20000

Так что все работает, пока разность не превысит 65535, а далее нужен учет переполнений T1.

Но зачем коррекция я не понял.

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


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

Пример:

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 Переполнение

 

Работает, работает, все давно проверено.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...