ReM37 0 28 ноября, 2006 Опубликовано 28 ноября, 2006 (изменено) · Жалоба Нужно измерить длительность импульса. Но никак не понимаю как это сделать. Datasheet читал. Но все равно непонятно. :( То есть понятно, что для этого надо использовать Timer1, но как настроить так, чтобы счет начался по нарастающему фронту, а заканчивался ро спадающему? Очень нужен пример на C... Изменено 28 ноября, 2006 пользователем ReM37 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 29 ноября, 2006 Опубликовано 29 ноября, 2006 · Жалоба Что-то неприпомню чтобы таймер можно было настроить так, чтобы он сам запускался. Запустить таймер можно например по внешнему прерыванию. А остановить по прерыванию Input Capture. т.е. заводим сигнал параллельно например на Int0 и на ICP1, настраиваем Int0 на генерацию прерывания по положительному фронту. В обработчике прерывания Int0 запускаем таймер в режиме IC по отрицательному фронту. По прерыванию IC останавливаем таймер и вычитываем значение из регистров ICRx. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReM37 0 29 ноября, 2006 Опубликовано 29 ноября, 2006 · Жалоба Понял. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bezobraznic 0 29 ноября, 2006 Опубликовано 29 ноября, 2006 · Жалоба Нужно измерить длительность импульса. Но никак не понимаю как это сделать. 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() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andreas1 1 29 ноября, 2006 Опубликовано 29 ноября, 2006 · Жалоба Tr=temp+4; //компенсация Не понял, чего компенсировать? Ведь значение счетчика защелкивается в ICR по фронту/спаду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReM37 0 29 ноября, 2006 Опубликовано 29 ноября, 2006 · Жалоба Вот держи!!! Длительность=Tf-Tr; Рабочий пример!! Про такой вариант я думал. Но как с переполнением ICR1? Пример: Tf=30000 Tr=50000 Tf-Tr=20000 OK. А если: Tf=60000 Tr=60000+20000=??? Tf-Tr=??? По моему неправильно. Или я не понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andreas1 1 29 ноября, 2006 Опубликовано 29 ноября, 2006 · Жалоба Tf=60000 Tr=60000+20000=??? Tf-Tr=??? 60000+20000-65536=14464 14464-60000+65536=20000 Так что все работает, пока разность не превысит 65535, а далее нужен учет переполнений T1. Но зачем коррекция я не понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReM37 0 29 ноября, 2006 Опубликовано 29 ноября, 2006 · Жалоба 14464-60000+65536=20000 ??? Это Tf-Tr? Tf=60000 Tr=14464 OK (60000+20000) т.к. переполнение Tf-Tr=60000-14464=45536 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andreas1 1 29 ноября, 2006 Опубликовано 29 ноября, 2006 · Жалоба Пример: 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 Переполнение Работает, работает, все давно проверено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться