Юрец

Частотомер На Atmega

53 сообщения в этой теме

Юрец    7
Раз выбрано внешнее тактирование - значит однократный "тик".

если по прихождению одного импульса на вход Т1 возникает однократное прерывание ISR(TIMER1_COMPA_vect){counter++;}

тогда возникает следующий вопрос:

а это не то-же самое (с алгоритмической точки зрения) что и подсчет количества прерываний interrupt [EXT_INT0] void ext_int0_isr(void){i++;} за 1 сек ?

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Zenner    1

Нет. Таймер включен в режиме CTC, и прерывание будет происходить каждые 100 "тиков", когда TCTN1(он инкрементируется каждый "тик") совпадёт с OCR1A.

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


Ссылка на сообщение
Поделиться на других сайтах
2.фактически это алгоритм автомобильного тахометра. скажем до 8000 оборотов. 8000 * 4 цилиндра = 32кГц. пока это будет максимумом.

Уважаемый Юрец, я не перестаю удивляться.. Это к тому, что 8000 об/мин коленчатого вала двигателя не есть 8000 Гц практически

никогда, а уж тем более 32кГц и ни на какое кол-во цилиндров умножать не нужно!!!

Правильная постановка задачи уже содержит половину ответов:) Поэтому начнем с приведения данных в систему.

Вот моё видение постановки задачи: есть вращающийся вал, датчик для измерения кол-ва оборотов в сек. - самое простое контактная

пара, оптодатчик и т.д. Допустим оптодатчик (светодиод-фототранзистор), на валу диск с одним отверстием, тогда оборот вала дает

1 импульс, если отверстия 2 - тогда 1 оборот - 2 импульса и т.д. Допустим отверстие одно - тогда частота в 1 Гц будет соответствовать

частоте вращения 60 об/мин.

После небольших преобразований 8000 об/мин / 60 сек = 133,33.. Гц.

Кстати можно реализовать программный пересчет Гц в об/мин.

Теперь о частотомере. Сам написал аж 3 варианта программы частотомера, пока не получил хорошие показатели по точности.

Не буду заморачивать подсчетом фронтов и прочей не заслуживающей внимания ерундой... вот насчет внешних прерываний - не знаю,

не пользовал.

Самый надежный вариант, тактирование 2-хбайтного таймера от внешнего источника - настрой регистр TCCR1B, вот кусок даташита

CS12 CS11 CS10 Description

1 1 0 External clock source on T1 pin. Clock on falling edge.

1 1 1 External clock source on T1 pin. Clock on rising edge.

т.е. по срезу и фронту импульса. Забиваешь 6(0b110) или 7(0b111) в TCCR1B таймер запустится, ждешь фиксированное время

скажем 1сек - pause_ms(1000) - это в кодевижн, остановил таймер, вывел результат и по новой. Не нравится с паузами, запустил

второй таймер... Время берешь любое - хочешь 10 сек - для очень низкочастотных процессов или 0,01сек, а потом пересчет к одной

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

частоты ограничен по даташиту Fclk/2, рекомендуется Fclk/2,5 т.е. с кварцем 16 МГц сможешь мерять до 8-ми...

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


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

Если интересно, мой исходник тахометра из этой темы...

Точность можете оценить :) Модель там приложена. Среда разработки - AtmanAVR, компилятор GCC. Портируется элементарно...

tachomether.rar

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

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


Ссылка на сообщение
Поделиться на других сайтах
Zenner    1
верхний предел измеряемой

частоты ограничен по даташиту Fclk/2, рекомендуется Fclk/2,5 т.е. с кварцем 16 МГц сможешь мерять до 8-ми...

Поправлю: верхний предел по Вашему методу получится 65кгц, если мерить до единиц Гц. 650кгц - десятков Гц. 6.5мгц - сотен Гц.

Таки в два байта не впишешь пару Мгц с точностью 1гц...

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


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

Парни, учтите, что при одном импульсе на цилиндр, за 1 оборот коленвала с датчика поступают два импульса, т.к. срабатывают два цилиндра за 1 оборот. Не забудьте.

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


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

Да что вы прилипли к цилиндрам, вы меряете частоту вращения обычного вала, который вращается, частота его вращения ессно меняется в определенных пределах. К чему здесь цилиндры не воткну никак...

To Zenner:

Естественно точность такая, как ты сказал, но что такое 10Гц на пределе в 650кГц...

Максимальная погрешность тут будет на нижнем пределе диапазона 65кГц-650кГц и то примерно 0,015%

Я же не предлагаю мерять в данном случае единицы герц, правильно будет разбить на поддиапазоны и

в них мерять, что я и сделал. Повесил кнопки, переключаешь поддиапазоны.

Вопрос: есть решения измерения на пределе в несколько МГц с дискретностью отсчета 1Гц?

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


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

-> Вопрос: есть решения измерения на пределе в несколько МГц с дискретностью отсчета 1Гц?

На прошлой странице дали ссылку на мой проект LC-метра на меге, меряет 4мгц(гарантировано), может и больше, с точностью 1гц.

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


Ссылка на сообщение
Поделиться на других сайтах
Goodefine    94
Да что вы прилипли к цилиндрам, вы меряете частоту вращения обычного вала,..

А чего бы к ним не прилипнуть? Количество импульсов зажигания свечи жестко связано с оборотами коленчатого вала. И вместо использования сего факта, лепить оптопары или феррит к коленчатому валу просто глупо...

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


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

Ну тогда да, если коннектится к прерывателю-распределителю.

Ну в общем случае, можно не только к коленвалу...к распредвалу например,

или к любому валу связанному с коленчатым определенным передаточным отношением,

на худой конец даже ременной передачей - если космическая точность не нужна, мне

кажется в некоторых случаях это будет даже удобней... чем палить постоянно формирователь

импульсов, подлюченный к довольно нехилой индуктивности (в случае с классической батарейной

системой зажигания), 20 кВольтов все таки

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


Ссылка на сообщение
Поделиться на других сайтах
Goodefine    94
...чем палить постоянно формирователь

импульсов, подлюченный к довольно нехилой индуктивности (в случае с классической батарейной

системой зажигания), 20 кВольтов все таки

Почему палить? Сейчас почти везде (за исключением только самых древних систем зажигания) стоит электронный ключ (дребезжит меньше механического, но с ним даже немного сложнее - с механикой тоже проблем нет особых), замыкающий катушку на массу. Если подключится к отрицательной клемме катушки (конец первичной обмотки, замыкающийся на массу через ключ), то простой делитель 33к/1.2к + стабилитрон отлично решает все проблемы. По такой схеме подключаю прямо на лапу МК, даже без полноценного формирователя - не то что не горит, даже не глючит... Так что не надо искать проблемы там где их нет...

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


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

Ну если пробовал, тогда убедил ;) Вопросов по данной части больше не имею.

To Zenner:

А чего собсно такой вариант входной части частотомера, как у нее с чувством и входным сопротивлением?

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


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

А х его з. Что в голову пришло то и нарисовал. 0,5В чует точно. Входное сопротивление не менее 10кОм.

Кстати, С3 нужно увеличить до каких 100нф, чтоб 50гц и ниже пропускал.

И да, вся эта байда нужна чтоб сигнал произвольной формы привести в "нормальный" вид для МК. В данный момент уже приделал формирователь на логике.

И на днях скорее всего будет Update до 100мгц без потери точности.(всё теже +-1гц, по крайней мере постараюсь :) )

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

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


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

В "Радио" видел нормальную входную часть, там чувак на пике частотомер сделал.

Только что специально распечатку нашел №7 2004г с.64 - чувство 75-150мВ, вход на полевике, что тоже есть гут.

Буду его делать.

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


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

Ага. Таймеры/счетчики PIC-ов - единственное их достоинство, в остальном проигрывают по всем параметрам.

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


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
Самый надежный вариант, тактирование 2-хбайтного таймера от внешнего источника - настрой регистр TCCR1B, вот кусок даташита

CS12 CS11 CS10 Description

1 1 0 External clock source on T1 pin. Clock on falling edge.

1 1 1 External clock source on T1 pin. Clock on rising edge.

т.е. по срезу и фронту импульса. Забиваешь 6(0b110) или 7(0b111) в TCCR1B таймер запустится, ждешь фиксированное время

скажем 1сек - pause_ms(1000) - это в кодевижн, остановил таймер, вывел результат и по новой. Не нравится с паузами, запустил

второй таймер...

это такой=же алгоритм, как и в программе от Zenner.

разбираюсь потихоньку.

спасибо.

Если интересно, мой исходник тахометра .

Точность можете оценить :) Модель там приложена.

спасибо и Вам за участие!

Парни, учтите, что при одном импульсе на цилиндр, за 1 оборот коленвала с датчика поступают два импульса, т.к. срабатывают два цилиндра за 1 оборот. Не забудьте.

учту! т.к. частоту буду брать с контакта катушки.

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


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

to Zenner : что-то я совсем запутался.

вот код:

/*****************************************************                        
Chip type           : ATmega16
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>

// Alphanumeric LCD Module functions
#asm
  .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
#include <delay.h>
#include <stdio.h>

unsigned char buffer_dec [33];
volatile unsigned char c;        	//количество прерываний таймера2
volatile unsigned long int counter;    	//здесь хранятся пойманые импульсы


// Timer 1 overflow interrupt service routine   
interrupt [TIM1_OVF] void timer1_comp_isr(void) //прерывание по совпадению таймера1
{ 
counter++;        
}

interrupt [TIM2_COMP] void timer2_comp_isr(void)  //прерывание по совпадению таймера2
{
if(c<125){c++;}
else
{	
   TCCR1B = 0; TCNT1 = 0;  //останавливаем таймер1
   sprintf(buffer_dec,"F = %u.%u kHz",counter/10,counter%10);lcd_gotoxy(0,0);lcd_puts(buffer_dec);//выводим
   counter = 0;//очищаем переменную для счёта импульсов
   c=0;//очищаем количество прерываний таймера2
   TCCR1B=0x0F; //0b00001111 запускаем таймер1
   TCNT2 = 0;//обнуляем таймер2
}
}

void timerinit()            	//инициализируем таймеры
{
// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x0F;  //0b00001111 таймер2, тактируем от Fosc/1024, режим СТС
TCNT2=0x00;
OCR2=0x7C; //124

// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x0F; //0b00001111  таймер1, режим СТС, внешнее тактирование по нарастающему фронту 
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;

OCR1AH=0x00; //OCR1A = 99
OCR1AL=0x63;

OCR1BH=0x00;
OCR1BL=0x00; 

TIMSK =0x90;//установить биты 7 и 4 OCIE2 и OCIE1A по даташиту меги16;
}
void main(void)
{
// Input/Output Ports initialization
PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;


// LCD module initialization
lcd_init(16); 
#asm("sei")

timerinit(); 

while (1)
     { 
     };
}
';

в итоге: на жк дисплей ничего не выводится. эмулирую в протеусе.

если тупо вставить sprintf(buffer_dec,"F = %u.%u kHz",counter/10,counter%10);lcd_gotoxy(0,0);lcd_puts(buffer_dec); в цикл while (1) , то показывает F = 0.0 kHz

в чем засада?

тут проект протеусаtaho.rar

Изменено пользователем Юрец

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


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

А порт ещё жив? Ато он у вас DDRx = FF. Импульсы куда подавать то будем, если у нас всё выходы?

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


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
А порт ещё жив? Ато он у вас DDRx = FF. Импульсы куда подавать то будем, если у нас всё выходы?

да... косячек. исправил. результат такой-же. (сгореть-не сгорит. пока проверяю в протеусе).

в программе не происходит прерывание таймера1. импульсы на ногу Т1 поступают.

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


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

А никто не забыл, что для тахометра частоты довольно низкие? И данный метод (временные ворота организуются фиксированным интервалом) работает хорошо для высоких частот, а на низких - даже пропуск одного импульса (интервал закончился на серединке между импульсами) даст существенную погрешность. В подобных случаях, ворота организуют именно сигнальными импульсами, подсчитывая потом таймерные тики. В хороших частотомерах, эти два метода работают по отдельности, каждый в своем диапазоне. Граница диапазонов - там где погрешности двух методов уравниваются...

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


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

2 Юрец

Ну раз >>>в итоге: на жк дисплей ничего не выводится.<<<, то прерывание таймера2 тоже не работает.

Ошибка: не TIM1_OVF, а TIM1_COMPA - у нас ведь режим совпадения.

***добавлено***

хз. скомпилировал твой код в CVAVR - прерывания не происходят

скомпилировал в AVR-GCC - всё работает, пруфскрин прикрепляю к посту.

Так что с причудами CVAVR-а пускай его знатоки разбираются.

post-23328-1250239530_thumb.jpg

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

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


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
Ошибка: не TIM1_OVF, а TIM1_COMPA - у нас ведь режим совпадения.

точно! исправил. не работает.

пошел по старому пути. только таймер использовал 16-ти битный. х.з. в чем дело, но заработало:

post-14455-1250314934_thumb.jpg

всем СПАСИБО!

Изменено пользователем Юрец

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


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

И всё же мне было интересно где собака зарылась...Переписал во всевозможных вариантах - не работает и всё тут.

Поменял камень - работает, обратно мег16 - нет!

Вобщем, в CVAVR кривой хидер mega16.h, чтоб исправить - копируем в него дефайны из mega32.h и радуемся.

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


Ссылка на сообщение
Поделиться на других сайтах
Юрец    7
Вобщем, в CVAVR кривой хидер mega16.h, чтоб исправить - копируем в него дефайны из mega32.h и радуемся.

спасибо за помощь! попробую обязательно!

хочу перейти с cvcar на avr studio. скачал winawr, avr studio 4.16. многое непонятно (начиная с того, как на пруфскрине увидел работу avr studio с proteus). пытаюсь вникнуть. (большая разница в синтаксисе, в регистрах...).

что можете порекомендовать для лучшего понимания работы в этой связке?

Изменено пользователем Юрец

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • @DedLogoped Вот на том и благодарочка! Заказал я подсветку у братьев наших продвинутых. Подожду. По ходу событий бу отчитываться.
    • Так странности такого рода: при отключенной CRC вообще принимает много чего проехали, 1 байт как бы соответствует протоколу и опять ловит фигню при включенном пульте на левых каналах, фигню это 100%. Как то вот этот факт меня пока что смущает...
    • Это у тебя усовершенствованная его схема (с VT6.VT7) Чтобы народ не путать малэнькая ремарка понимаш
    • Да по характеристикам намоточного провода это гдето 40 грамм выходит. Столько же и приемная у меня получается по весу.
    • С первого дня рождения, человек видит солнце и наблюдает за ним. 400 лет ведется наблюдение за пятнами на поверхности Солнца. Появление и
      исчезновение пятен на Солнце имеет циклическую природу происхождения. И период цикличности, равен в среднем 11 лет. Возникает вопрос. С чем связано это природное явление. Почему это природное явление существует в природе. При анализе циклического появления пятен на
      Солнце, можно выявить закономерность. Погода, температура на планете, зависит от длительности цикла активности на Солнце. Было зафиксировано. Один цикл, между пиками активности, который длился 50 лет. За время этого цикла на поверхности земли, наблюдался малый ледниковый период. А это можно связать с уменьшением энерговооруженности Солнца. Можно продолжить рассуждения. Если интервал между циклами будет длиться
      1000 лет. Все живое, можно предположить, должно погибнуть. Кроме примитивных организмов. Такое утверждение подтверждает необходимость действия, закона сохранения энергии. Если расходуется энергия, то энергия должна пополняться по мере расходования. На такое рассуждение подсказывает 50 летний интервал, между пиками активности солнца. Следующие нормальные циклы, восстановили нормальное функционирование светила. Теперь можно заметить, солнце функционирует 4,5 миллиардов лет. Предполагается, что солнце будет светить еще 4,5 миллиардов
      лет. Невольно возникает вопрос. Почему разум человека не задался вопросом, если существует закон сохранения энергии, то откуда поступает энергия для поддержания деятельности солнца в течение 9 миллиардов лет. Поскольку активность совпадает с появлением пятен на солнце,
      можно сделать вывод. На поверхности солнца, где расположено пятно, происходит закачивание энергии в тело солнца. То, что поступление энергии происходит из вне, подтверждает форма края пятна и глубина пятен до 1500км. Края поверхности солнца, в районе пятна, завернуты во внутрь. Отсутствие излучения света, темная поверхность пятна, указывает на высокую плотность поступающей из вне топлива. Свет, в зоне пятна, обладает меньшей плотностью, энергией и не может пробиться от внутренней поверхности Солнца к наблюдателю, через поступающий поток топлива. Поэтому мы наблюдаем процесс поступления энергии на Солнце в районе пятна и пятна указывают место загрузки топливом Солнца. Размер пятен, их расположение не носят случайный характер. Пока неизвестно, кто или что регулирует процессом загрузки. 20.02.2018г.                                                                                                                  UA3PAA  
    • Поправка, прибор вышел из спецификаций по шумам. Ценник соответственно скорректирован до 8000р.