реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Тахометр на 16меге, не могу разобраться
DAndy_boy
сообщение May 25 2007, 04:17
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Господа разработчики, подскажите пожалуйста, что я не так делаю? Задача следующая необходимо построить тахометр. На вход МК подается последовательность импульсов с частотой до 100 Гц. Нужно подсчитать количество импульсов за секунду и вывести на индикатор. Я использую 6мегу , кварц 8.0МГц. Завожу сигнал на вход T0 счетчика и снимаю с него параметры каждую секунду. Проблема в том что полученные результаты не постоянны. Т.е. значение на индикаторе скачет в пределах +-4 единицы. Думал, что не стабильно получаю секунду, так проверил на осциллографе… вроде нормально.. Всю голову сломал… У кого какие будут мысли? (пишу в AVR Studio)
Прилагаю код …
Код
#define QZ              8000000L
#define    TIME_OCR1A      ((QZ / 1024)-1)

int Speed_p;
void Timer1_init(void)
{

     OCR1A = TIME_OCR1A;        /* прерывание раз в секунду */
                TCCR1A = 0x00;
                TCCR1B = (1 << 3) | 0x05;
                TIMSK |= 1 << 4;  /* разрешить прерывание OCIE1A */
}

SIGNAL (TIMER1_COMPA_vect)
{
     Speed_p=TCNT0;
        TCNT0=0;
}


int main()
{
unsigned int g=0;
char str[10];

Timer1_init();

// Таймер0 считает входные импульсы
// Timer/Counter 0 initialization
TCCR0=0x07;
TCNT0=0x00;
OCR0=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=0 State6=0 State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xC8;

sei();
while(1)
{
   ..........

.//    Формируем строку для вывода
           g=(float)(Speed_p)*(float)1.66;
    str_out[8]=g%10;g/=10;
      str_out[7]=g%10;g/=10;
    str_out[6]=g%10;
// выводим строку      
reload();// динамическая индикация

}
Go to the top of the page
 
+Quote Post
muravei
сообщение May 25 2007, 07:32
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(DAndy_boy @ May 25 2007, 08:17) *
Думал, что не стабильно получаю секунду, так проверил на осциллографе… вроде нормально..

Глаз-алмаз! Что можно увидеть осцилл. ?
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение May 25 2007, 08:43
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



ну как что? добавил в прерывание таймера SIGNAL (TIMER1_COMPA_vect) строку PORTA^=(1<<4) и смотрел на период.... вот и все
Go to the top of the page
 
+Quote Post
aesok
сообщение May 25 2007, 08:57
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



В reoload() запрещаются прерывания? Есть другие обработчики прерываний в проекте?

Анатолий.
Go to the top of the page
 
+Quote Post
muravei
сообщение May 25 2007, 10:09
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(DAndy_boy @ May 25 2007, 12:43) *
смотрел на период.... вот и все

Чего на него смотреть , 40мС на 1000 не увидеть.
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение May 25 2007, 10:18
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Цитата(aesok @ May 25 2007, 12:57) *
В reoload() запрещаются прерывания? Есть другие обработчики прерываний в проекте?

Анатолий.


нет... прерывания нигде не запрещаются, и больше никаких прерываний не использую...
Go to the top of the page
 
+Quote Post
aesok
сообщение May 25 2007, 10:48
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



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

Анатолий.
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение May 25 2007, 11:00
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Сигнал стабильный ТТЛ... может попробывать считать входные импульсы через компоратор?... Вчером займусь...
Go to the top of the page
 
+Quote Post
GDI
сообщение May 25 2007, 12:35
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Для подсчета частоты импульсов есть специальный режим работы таймера - режим захвата, может воспользоваться им?
Цитата
g=(float)(Speed_p)*(float)1.66;

зачем вы в переменную типа int засовываете выражение типа float, при преобразовании типов тут вполне может быть и несомненно есть потеря точности, может по-этому и прыгают цифры? Здесь надо или как то считать все в int или сделать переменную g типом float и выводить на экран float с необходимой точностью.

В присоединенном файле функция преобразования float в массив char. Функция не моя и может глючить, но для проверки подойдет, как альтернатива объемному printf-у с поддержкой float
Прикрепленные файлы
Прикрепленный файл  bcdfp.rar ( 1.85 килобайт ) Кол-во скачиваний: 226
 


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение May 25 2007, 15:52
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Действительно.... с этими преобразованиями и дробными числами фигня получается.... Приташил из универа генератор.... проверил без всяких там коэффициентов все нормально работает... прыгает максимум на единицу... а после умножения на 1.66 уже на две... Придется фильтр, похоже использовать.. других я вариантов не вижу... Всем спасибо...
Go to the top of the page
 
+Quote Post
defunct
сообщение May 26 2007, 19:19
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(DAndy_boy @ May 25 2007, 18:52) *
проверил без всяких там коэффициентов все нормально работает... прыгает максимум на единицу... а после умножения на 1.66 уже на две...

1* 2 = 2, что тут удивительного то?
Берите среднее по последний трем результатам.
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение May 27 2007, 10:09
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Цитата(defunct @ May 26 2007, 23:19) *
1* 2 = 2, что тут удивительного то?
Берите среднее по последний трем результатам.


Так я не могу понять, почему вообще значение прыгает? Поставил кварц 7,3728МГц. Получаю точную секунду. Входная частота стабильная, с генератора. Да и величина ее не более 100Гц. По-моему вообще значения должны быть стабильными. И раз прыгает только единица, то скорее всего это в каком-то определенном месте... Как же исправить ситуацию?... Иначе погрешность вычисления уж очень большая...
Go to the top of the page
 
+Quote Post
defunct
сообщение May 27 2007, 19:01
Сообщение #13


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(DAndy_boy @ May 27 2007, 13:09) *
Так я не могу понять, почему вообще значение прыгает?

Целое число имеет точность +-1,
если его домножить на 2, то получите точность +-2... Что ж непонятного?

Цитата
Как же исправить ситуацию?

Усреднить рез-тат.
Go to the top of the page
 
+Quote Post
muravei
сообщение May 28 2007, 07:02
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



А может лучше мерять период вх сигнала , а не частоту? А после на "скользящее среднее"
Go to the top of the page
 
+Quote Post
DAndy_boy
сообщение May 28 2007, 07:13
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 25-09-05
Из: Москва
Пользователь №: 8 922



Цитата(muravei @ May 28 2007, 11:02) *
А может лучше мерить период вх сигнала , а не частоту? А после на "скользящее среднее"

Тоже мысль..... вечером попробую.... Т.е. надо завести входной сигнал на внешнее прерывание и по фронту запускать счетчик... а по другому его останавливать... и затем секунду делим на получившееся время... Так?
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 17:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016