Измерить длину импульса
Измерить длину импульса
Добрый день! Подскажите, как измерить длину импульса? Верней в codevisionAVR настроить таймер чтоб, измерял длину импульса и выводил на ЖК. Почитав много статей понял, нужно настроить МК чтоб делал захват от нарастающего фронта до спада, но как в codevisionAVR сделать не соображу.
Это нужно для создания бортового компьютера для авто, чтоб он рассчитывал расход топлива (таких приборов в сети уже много, но чтоб сделать чей то под себя нужно откорректировать код, а корректировать код другого автора только больше запутаешься, так как новичок). Для начала хочу взять сигнал с форсунки (для этого даже сделал небольшой стенд и взял у знакомых СТОшников форсунку).
Это нужно для создания бортового компьютера для авто, чтоб он рассчитывал расход топлива (таких приборов в сети уже много, но чтоб сделать чей то под себя нужно откорректировать код, а корректировать код другого автора только больше запутаешься, так как новичок). Для начала хочу взять сигнал с форсунки (для этого даже сделал небольшой стенд и взял у знакомых СТОшников форсунку).
- Реклама
- Gisteresis
- Друг Кота
- Сообщения: 4732
- Зарегистрирован: Ср сен 18, 2013 10:08:26
- Откуда: Санкт-Петербург
Re: Измерить длину импульса
Для чего там нужно измерять?
Может вам надо напрямую ШИМом управлять?
В визарде настраиваете таймер Fast PWM первый, выбираете инвертированный или нет, задаете частоту.
Чтобы измерить надо так: Поставить фильтр на ШИМ, далее на АЦП и он покажет скважность.
В самой программе измерений не требуется, дабы всегда можно узнать содержимое регистра OCR
Может вам надо напрямую ШИМом управлять?
В визарде настраиваете таймер Fast PWM первый, выбираете инвертированный или нет, задаете частоту.
Чтобы измерить надо так: Поставить фильтр на ШИМ, далее на АЦП и он покажет скважность.
В самой программе измерений не требуется, дабы всегда можно узнать содержимое регистра OCR
Re: Измерить длину импульса
Конкретно по codevision ничего не скажу, но идея такова: вам надо настроить прерывание по изменению состояния какой-нибудь ножки (на нее и заводите этот импульс), в обработчике прерывания смотрите куда изменился лог. уровень - если поднялся в единицу, то запускаете какой-нибудь таймер, если опустился с единицы в ноль - забираете значение, которое натикало в том таймере - это и есть длина импульса.
Надо только следить чтоб не переполнялся таймер, ну и частоту подобрать там, в зависимости от нужной точности
Надо только следить чтоб не переполнялся таймер, ну и частоту подобрать там, в зависимости от нужной точности
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Измерить длину импульса
проще использовать Input Capture
http://microsin.net/programming/AVR/atm ... nting.htmlДля измерения длительности импульсов нужно сделать следующее:
- Настроить тактирование таймера 1 от внутреннего тактового генератора.
- Создать обработчик прерывания для события захвата (Timer/Counter1 Input Capture Interrupt) и разрешить прерывание по событию захвата.
- Разрешить работу узла захвата по входу ICP1.
В обработчике прерывания Input Capture нужно сохранить или проанализировать значение счетчика, чтобы по нему определить длительность входного импульса.
Re: Измерить длину импульса
Если попробовать вот-так сделать?
Нашел в сети этот код, только он недоработанный, но все понятно написано. Подскажите как откорректировать? Как подобрать тактовую частоту если на вход ICP подать частоту 5 Гц?
Нашел в сети этот код, только он недоработанный, но все понятно написано. Подскажите как откорректировать? Как подобрать тактовую частоту если на вход ICP подать частоту 5 Гц?
Код: Выделить всё
#include <mega88.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x0B ;PORTD
#endasm
#include <lcd.h>
#include <stdio.h>
char buf[30];
unsigned int EdgeR, EdgeF; //время первого и второго импульса
unsigned long PulseClocks; //количество тактовых импульсов внутри импульса на входе ICP
// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
static unsigned char a; //локальная статическая переменная
if(!a) //если чётный вход в обработчик по нарастающему фронту (новое измерение периода)
{
EdgeR = ICR1L; //запоминаем значение счётчика
a = 1; //изменяем переменную для завершения текущего измерения
}
else //если нечётный вход в обработчик по нарастающему фронту (завершение текущего измерения)
{
EdgeF = ICR1L; //запоминаем значение счётчика
a = 0; //изменяем переменную для нового измерения периода
PulseClocks = ((unsigned long)EdgeF - (unsigned long)EdgeR);//вычисляем период
}
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Rising Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: On
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x43;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x20;
// LCD module initialization
lcd_init(16);
#asm("sei")
while (1)
{
sprintf(buf, "%i", PulseClocks); // выводим значение переменной на экран
lcd_gotoxy(5,0);
lcd_puts(buf);
};
}
- Реклама
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Измерить длину импульса
лучше этот код переделать: http://www.embed.com.ua/mikrokontroller ... ntervalov/
Re: Измерить длину импульса
Я рассматривал это вариант уже, начало так же все идет понятно, а вот в конце ничего не могу понять и в этом архиве нету файла .prj чтоб открыть в codevisionAVRoleg110592 писал(а):лучше этот код переделать: http://www.embed.com.ua/mikrokontroller ... ntervalov/
- Gisteresis
- Друг Кота
- Сообщения: 4732
- Зарегистрирован: Ср сен 18, 2013 10:08:26
- Откуда: Санкт-Петербург
Re: Измерить длину импульса
Там в роди как мейк файл для создания проекта из командной строки (могу ошибаться, это мог быть и файл созданный компилятором)
Как бы там ни было это не проблема.
Создайте пустой проект и зацепите туда *.c и *.h файлы, скомпилируйте и получите *.prj
Самое главное, что код там есть.
Как бы там ни было это не проблема.
Создайте пустой проект и зацепите туда *.c и *.h файлы, скомпилируйте и получите *.prj
Самое главное, что код там есть.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Измерить длину импульса
проверил - работает:kk042fjv писал(а):...а вот в конце ничего не могу понять и в этом архиве нету файла .prj чтоб открыть в codevisionAVR
Re: Измерить длину импульса
Добрый день!
Собрал я вышеуказанный прибор, в протеусе работает отлично, но с подключением к форсунки возникла проблема. На форсунку идет постоянно "+12В", а "-12В" импульсами подается с ЭБУ, как я понял мне надо инвертировать этот импульсный сигнал, чтоб на мой прибор приходил импульсный "+12В"? Подскажите какую-нибудь схему как лучше это сделать? И Как лучше на транзисторе или на микросхеме собрать?
Собрал я вышеуказанный прибор, в протеусе работает отлично, но с подключением к форсунки возникла проблема. На форсунку идет постоянно "+12В", а "-12В" импульсами подается с ЭБУ, как я понял мне надо инвертировать этот импульсный сигнал, чтоб на мой прибор приходил импульсный "+12В"? Подскажите какую-нибудь схему как лучше это сделать? И Как лучше на транзисторе или на микросхеме собрать?
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Измерить длину импульса
Оптопара, например PC817
Re: Измерить длину импульса
Добрый день!
Подскажите какой сигнал нужно подавать на ICP1, чтоб измерить длину импульса? У меня сигнал переключается:
1) 50 имп. в мин. длина 1,23 сек.
2) 17 имп. в мин. длина 0,5 сек.
1-ый вид выводится хорошо, второй на ЖК выводит 0,04 сек, в чем может быть причина? Может ему напряжения нехватает?
Ниже в архиве фото с осцилографа
Подскажите какой сигнал нужно подавать на ICP1, чтоб измерить длину импульса? У меня сигнал переключается:
1) 50 имп. в мин. длина 1,23 сек.
2) 17 имп. в мин. длина 0,5 сек.
1-ый вид выводится хорошо, второй на ЖК выводит 0,04 сек, в чем может быть причина? Может ему напряжения нехватает?
Ниже в архиве фото с осцилографа
- Вложения
-
- Фото.rar
- (342.86 КБ) 221 скачивание
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Измерить длину импульса
В этом коде не учтена ситуация, когда прерывания по захвату и переполнению накладываются. Будет изредка выскакивать заметная ошибка.oleg110592 писал(а):лучше этот код переделать: http://www.embed.com.ua/mikrokontroller ... ntervalov/
Re: Измерить длину импульса
Я наверно неправильно сформулировал вопрос.
Как можно измерить длину вот этого сигнала:

На ЖК показывает 0,04 сек. когда на осциллографе 0,5, подскажите нужно сгладить сигнал или усилить амплитуду?
В прикрепленном файле, файл протеуса и исходник
Как можно измерить длину вот этого сигнала:

На ЖК показывает 0,04 сек. когда на осциллографе 0,5, подскажите нужно сгладить сигнал или усилить амплитуду?
В прикрепленном файле, файл протеуса и исходник
- Вложения
-
- БК(на mega8).rar
- (84.05 КБ) 250 скачиваний
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Измерить длину импульса
Ну всё правильно показывает. Частота 1 Гц, длительность импульса = 0.5 сек, что и высвечивается у Вас на дисплее.kk042fjv писал(а):В прикрепленном файле, файл протеуса и исходник
Спойлер
- Вложения
-
- 2014-06-05 11-53-38.png
- (148.11 КБ) 2188 скачиваний
Re: Измерить длину импульса
В протеусе то правильно показывает правильно, там стоит амплитуда 5В, но вот в железе не хочет, в железе сигнал около 1,5В как на фото вышеАlex писал(а):Ну всё правильно показывает.
- Gisteresis
- Друг Кота
- Сообщения: 4732
- Зарегистрирован: Ср сен 18, 2013 10:08:26
- Откуда: Санкт-Петербург
Re: Измерить длину импульса
Усильте операционником до 5В, еще лучше компаратор поставить. LM311 самое оно. В качестве опорного напряжения для сравнения обычный диод с падением 0.7В
Последний раз редактировалось Gisteresis Чт июн 05, 2014 12:38:05, всего редактировалось 1 раз.
- ИС-пытатель
- Вымогатель припоя
- Сообщения: 577
- Зарегистрирован: Ср июн 19, 2013 08:10:48
- Откуда: Москва, СПб, Липецк, Рязань
Re: Измерить длину импульса
Странно, как он у Вас вообще меряет при таком напряжении. уровни-то должны соответствовать. А так он измеряет у Вас длительность выброса на заднем фронте импульсов.
не до 5 Вольт, а до напряжения питания МКУсильте операционником до 5В
Re: Измерить длину импульса
Пробовал на lm324n собрать, подаю через него сигнал, получается на выходе 3-5-3-5-3-5 сигнал на 0 не падает, на ЖК все по нулям.Gisteresis писал(а):Усильте операционником до 5В, еще лучше компаратор поставить. LM311 самое оно.
- ИС-пытатель
- Вымогатель припоя
- Сообщения: 577
- Зарегистрирован: Ср июн 19, 2013 08:10:48
- Откуда: Москва, СПб, Липецк, Рязань
Re: Измерить длину импульса
Так у Вас средняя точка у операционника 3 Вольт. Снизьте ее до 0-0,5 вольт. схему покажите.


