Измерить длину импульса

Обсуждаем контроллеры компании Atmel.
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Измерить длину импульса

Сообщение kk042fjv »

Добрый день! Подскажите, как измерить длину импульса? Верней в codevisionAVR настроить таймер чтоб, измерял длину импульса и выводил на ЖК. Почитав много статей понял, нужно настроить МК чтоб делал захват от нарастающего фронта до спада, но как в codevisionAVR сделать не соображу.

Это нужно для создания бортового компьютера для авто, чтоб он рассчитывал расход топлива (таких приборов в сети уже много, но чтоб сделать чей то под себя нужно откорректировать код, а корректировать код другого автора только больше запутаешься, так как новичок). Для начала хочу взять сигнал с форсунки (для этого даже сделал небольшой стенд и взял у знакомых СТОшников форсунку).
Реклама
Аватара пользователя
Gisteresis
Друг Кота
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Re: Измерить длину импульса

Сообщение Gisteresis »

Для чего там нужно измерять?
Может вам надо напрямую ШИМом управлять?

В визарде настраиваете таймер Fast PWM первый, выбираете инвертированный или нет, задаете частоту.

Чтобы измерить надо так: Поставить фильтр на ШИМ, далее на АЦП и он покажет скважность.
В самой программе измерений не требуется, дабы всегда можно узнать содержимое регистра OCR
Реклама
Аватара пользователя
ANALOG
Мучитель микросхем
Сообщения: 444
Зарегистрирован: Вс ноя 28, 2010 15:18:52
Откуда: Минск

Re: Измерить длину импульса

Сообщение ANALOG »

Конкретно по codevision ничего не скажу, но идея такова: вам надо настроить прерывание по изменению состояния какой-нибудь ножки (на нее и заводите этот импульс), в обработчике прерывания смотрите куда изменился лог. уровень - если поднялся в единицу, то запускаете какой-нибудь таймер, если опустился с единицы в ноль - забираете значение, которое натикало в том таймере - это и есть длина импульса.
Надо только следить чтоб не переполнялся таймер, ну и частоту подобрать там, в зависимости от нужной точности
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Измерить длину импульса

Сообщение oleg110592 »

проще использовать Input Capture
Для измерения длительности импульсов нужно сделать следующее:
- Настроить тактирование таймера 1 от внутреннего тактового генератора.
- Создать обработчик прерывания для события захвата (Timer/Counter1 Input Capture Interrupt) и разрешить прерывание по событию захвата.
- Разрешить работу узла захвата по входу ICP1.
В обработчике прерывания Input Capture нужно сохранить или проанализировать значение счетчика, чтобы по нему определить длительность входного импульса.
http://microsin.net/programming/AVR/atm ... nting.html
Реклама
Эиком - электронные компоненты и радиодетали
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: Измерить длину импульса

Сообщение kk042fjv »

Если попробовать вот-так сделать?

Нашел в сети этот код, только он недоработанный, но все понятно написано. Подскажите как откорректировать? Как подобрать тактовую частоту если на вход 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: Измерить длину импульса

Сообщение oleg110592 »

лучше этот код переделать: http://www.embed.com.ua/mikrokontroller ... ntervalov/
Реклама
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: Измерить длину импульса

Сообщение kk042fjv »

oleg110592 писал(а):лучше этот код переделать: http://www.embed.com.ua/mikrokontroller ... ntervalov/
Я рассматривал это вариант уже, начало так же все идет понятно, а вот в конце ничего не могу понять и в этом архиве нету файла .prj чтоб открыть в codevisionAVR
Аватара пользователя
Gisteresis
Друг Кота
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Re: Измерить длину импульса

Сообщение Gisteresis »

Там в роди как мейк файл для создания проекта из командной строки (могу ошибаться, это мог быть и файл созданный компилятором)
Как бы там ни было это не проблема.
Создайте пустой проект и зацепите туда *.c и *.h файлы, скомпилируйте и получите *.prj
Самое главное, что код там есть.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Измерить длину импульса

Сообщение oleg110592 »

kk042fjv писал(а):...а вот в конце ничего не могу понять и в этом архиве нету файла .prj чтоб открыть в codevisionAVR
проверил - работает:
Изображение
InputCapture.zip
(64.13 КБ) 368 скачиваний
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: Измерить длину импульса

Сообщение kk042fjv »

Добрый день!
Собрал я вышеуказанный прибор, в протеусе работает отлично, но с подключением к форсунки возникла проблема. На форсунку идет постоянно "+12В", а "-12В" импульсами подается с ЭБУ, как я понял мне надо инвертировать этот импульсный сигнал, чтоб на мой прибор приходил импульсный "+12В"? Подскажите какую-нибудь схему как лучше это сделать? И Как лучше на транзисторе или на микросхеме собрать?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Измерить длину импульса

Сообщение oleg110592 »

Оптопара, например PC817
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: Измерить длину импульса

Сообщение kk042fjv »

Добрый день!
Подскажите какой сигнал нужно подавать на 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/
В этом коде не учтена ситуация, когда прерывания по захвату и переполнению накладываются. Будет изредка выскакивать заметная ошибка.
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: Измерить длину импульса

Сообщение kk042fjv »

Я наверно неправильно сформулировал вопрос.

Как можно измерить длину вот этого сигнала:
Изображение

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

В прикрепленном файле, файл протеуса и исходник
Вложения
БК(на mega8).rar
(84.05 КБ) 250 скачиваний
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Измерить длину импульса

Сообщение Аlex »

kk042fjv писал(а):В прикрепленном файле, файл протеуса и исходник
Ну всё правильно показывает. Частота 1 Гц, длительность импульса = 0.5 сек, что и высвечивается у Вас на дисплее.
СпойлерИзображение
Вложения
2014-06-05 11-53-38.png
(148.11 КБ) 2188 скачиваний
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: Измерить длину импульса

Сообщение kk042fjv »

Аlex писал(а):
Ну всё правильно показывает.
В протеусе то правильно показывает правильно, там стоит амплитуда 5В, но вот в железе не хочет, в железе сигнал около 1,5В как на фото выше
Аватара пользователя
Gisteresis
Друг Кота
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Re: Измерить длину импульса

Сообщение Gisteresis »

Усильте операционником до 5В, еще лучше компаратор поставить. LM311 самое оно. В качестве опорного напряжения для сравнения обычный диод с падением 0.7В
Последний раз редактировалось Gisteresis Чт июн 05, 2014 12:38:05, всего редактировалось 1 раз.
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Измерить длину импульса

Сообщение ИС-пытатель »

Странно, как он у Вас вообще меряет при таком напряжении. уровни-то должны соответствовать. А так он измеряет у Вас длительность выброса на заднем фронте импульсов.
Усильте операционником до 5В
не до 5 Вольт, а до напряжения питания МК
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Re: Измерить длину импульса

Сообщение kk042fjv »

Gisteresis писал(а):Усильте операционником до 5В, еще лучше компаратор поставить. LM311 самое оно.
Пробовал на lm324n собрать, подаю через него сигнал, получается на выходе 3-5-3-5-3-5 сигнал на 0 не падает, на ЖК все по нулям.
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Измерить длину импульса

Сообщение ИС-пытатель »

Так у Вас средняя точка у операционника 3 Вольт. Снизьте ее до 0-0,5 вольт. схему покажите.
Ответить

Вернуться в «AVR»