реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> input capture mega8
ReM37
сообщение Nov 28 2006, 23:35
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 3-11-06
Пользователь №: 21 954



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

Сообщение отредактировал ReM37 - Nov 28 2006, 23:37
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 29 2006, 00:28
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

т.е. заводим сигнал параллельно например на Int0 и на ICP1, настраиваем Int0 на генерацию прерывания по положительному фронту. В обработчике прерывания Int0 запускаем таймер в режиме IC по отрицательному фронту. По прерыванию IC останавливаем таймер и вычитываем значение из регистров ICRx.
Go to the top of the page
 
+Quote Post
ReM37
сообщение Nov 29 2006, 00:38
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 3-11-06
Пользователь №: 21 954



Понял. Спасибо.
Go to the top of the page
 
+Quote Post
bezobraznic
сообщение Nov 29 2006, 01:06
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 26-05-05
Пользователь №: 5 441



Цитата(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()
Go to the top of the page
 
+Quote Post
Andreas1
сообщение Nov 29 2006, 11:54
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 446
Регистрация: 12-03-06
Из: Москва
Пользователь №: 15 142



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

Не понял, чего компенсировать?
Ведь значение счетчика защелкивается в ICR по фронту/спаду.
Go to the top of the page
 
+Quote Post
ReM37
сообщение Nov 29 2006, 12:14
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 3-11-06
Пользователь №: 21 954



Цитата(bezobraznic @ Nov 29 2006, 00:06) *
Вот держи!!! Длительность=Tf-Tr; Рабочий пример!!


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

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

По моему неправильно. Или я не понял?
Go to the top of the page
 
+Quote Post
Andreas1
сообщение Nov 29 2006, 13:36
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 446
Регистрация: 12-03-06
Из: Москва
Пользователь №: 15 142



Цитата
Tf=60000
Tr=60000+20000=???
Tf-Tr=???

60000+20000-65536=14464
14464-60000+65536=20000
Так что все работает, пока разность не превысит 65535, а далее нужен учет переполнений T1.
Но зачем коррекция я не понял.
Go to the top of the page
 
+Quote Post
ReM37
сообщение Nov 29 2006, 15:08
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 3-11-06
Пользователь №: 21 954



14464-60000+65536=20000 ???
Это Tf-Tr?

Tf=60000
Tr=14464 OK (60000+20000) т.к. переполнение
Tf-Tr=60000-14464=45536
Go to the top of the page
 
+Quote Post
Andreas1
сообщение Nov 29 2006, 17:04
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 446
Регистрация: 12-03-06
Из: Москва
Пользователь №: 15 142



Цитата
Пример:
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 Переполнение

Работает, работает, все давно проверено.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th July 2025 - 17:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01933 секунд с 7
ELECTRONIX ©2004-2016