Юрец

Частотомер На 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    92

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

Точность можете оценить :) Модель там приложена. Среда разработки - 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    92
Да что вы прилипли к цилиндрам, вы меряете частоту вращения обычного вала,..

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

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


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

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

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

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

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

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

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

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

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


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

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

системой зажигания), 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    92

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

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


Ссылка на сообщение
Поделиться на других сайтах
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). пытаюсь вникнуть. (большая разница в синтаксисе, в регистрах...).

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


  • Сообщения

    • Не бывает однозначных ответов на ваши вопросы. Только компромиссы. А вообще вам надо книжку "Конструирование высокоскоростных цифровых устройств. Начальный курс черной магии."
      Не обращайте внимание на "высокоскоростных" и "цифровых". Аналог тем же правилам подчиняется.
    •   Приветствую! Разбираюсь с STM8L, посмотрел особенности, видеоуроки, почитал о семействе STM. Имеется немного опыта работы с PIC и AVR. Нашел 2 индикатора АЛС320, решил первым проектом сделать часы (пока только секунды) с использованием встроенного RTC. Почитал документацию по RTC, посмотрел примеры как людей, так и с библиотеки stdPeriph lib для IAR, подключил индикаторы (по типу схемы под спойлером, только без транзисторов). Сделал простенькую библиотеку для работы с 7-сегментником. Несколько функций для начальной установки времени. Но вот с выводом времени (секунд) возникли проблемы. В частности, установлен RTC wake-up каждых 500ms, и экран "мерцает" с этой частотой. Функцию вывода времени запускать через прерывание RTC wake-up или в главной петле в функции main? И в драйвере 7-сегментника решил сделать функцию для смены яркости путем смены частоты мерцания, но при конфигурации тактирования и делителя, функции delay с refreshDisplay устанавливают намного большую задержку (TimingDelay_Decrement прописан в прерываниях). Подскажите что я делаю не так. Спасибо! timing_delay.c segment_driver.cpp main.cpp Схема подключения (по примеру, но без транзисторов)
    • Зачем так много осциллографов?
    • Вот не понятно что за конденсаторы Эпкос, аналоги наших каких?..
    • Блин микруха взяла и сдохла ни с чего.  Вчера всё работало, а сегодня тупо не включилась.   Поставил другую всё работает. Все напряжения, осциллограммы, все функции работают, ВСЁ в норме!. Какого хрена она померла я не понимаю. 
    • На Вашем форуме я прочитал кое-что о ремонте плат вентилятора RG148/1200-3612-010202. Кто имеет какие либо схемы с удовольствием изучил. на плате управления есть м-схема на которой написано   243 EZ650. Не смог найти в даташит. Помогите!