Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 13.03.2012, 22:02   #1
tem-ya
Senior Member
 
Аватар для tem-ya
 
Регистрация: 30.11.2007
Адрес: Воронеж
Возраст: 41
Сообщений: 253
Вес репутации: 190/40
tem-ya has a spectacular aura abouttem-ya has a spectacular aura about
По умолчанию Помогите уложить частотомер в периферию PIC16F628

Не сочтите за троллинг.

Итак. Дано. PIC16F628a. 4 МГц кварц. Внешних делителей нет. Язык С!
Интервал измеряемых частот >500 КГц.

Для начала очевидное.
Существует два метода измерения частоты сигнала Fs

1)Подсчет количества периодов Ts сигнала за известный интервал времени t_izm

2)Измерение величины периода сигнала Ts (или нескольких периодов N*Ts,
например N = 4, 8, 16)

Интуитивно понятно, что при больших частотах Fs > Fx точнее измерять частоту
первым способом. При малых частотах Fs < Fx т.е. при больших длительностях
периодов Ts - точнее измерять частоту вторым способом.

При Fs = Fx, вернее при Fs=[Fx-delta; Fx+delta] оба метода должны давать
соизмеримые погрешности. Чему реально равна граничная частота Fx и как велика delta?


Поскольку все АБСОЛЮТНЫЕ времена - и интервал времени измерения t_izm в п.1),
и величина периода сигнала Ts в п.2) определяется
тактами контроллера, т.е. кварцем. В связи с этим увеличение таковой до,
например, 20 МГц приведет на практике к увеличению точности измерения частоты?


Практически интересное измерение частоты возможно
на данных контроллерах из-за наличия в них асинхронного предделителя
способного работать на частотах до десятков МГц.
Поэтому единственный вариант измерять высокие частоты - это TMR0 в режиме
внешего счетчика с предделителем на 256. С этим все достаточно однозначно.

Варианты появляются, когда встает вопрос как лучше сформировать абсолютное
время. В распоряжении остается 2 таймера: 8 разрядный TMR2,
16 разрядный TMR1 и связанный с ним модуль захвата.

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

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

Хватит ли стандартного 32 разрядного double для математических вычислений
или нужно смотреть в сторону 64 разрядных операций с плавающей точкой.

Не хотелось бы изобретать велосипед, поэтому кто реально сталкивался
поделитесь практическим опытом.
tem-ya вне форума   Ответить с цитированием
Старый 13.03.2012, 22:41   #2
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,652
Вес репутации: 5137/157
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
Не сочтите за троллинг.
Не хотелось бы изобретать велосипед, поэтому кто реально сталкивался
поделитесь практическим опытом.
а почему "не хотелось бы"? Иногда очень даже полезно и изобрести велосипед. Именно как опыт изобретения.
Небольшая подсказка - плавающая арифметика там вообще никаким боком... хотя, кстати, тоже был бы полезный опыт разобраться с этой плавучкой.
Greg вне форума   Ответить с цитированием
Старый 13.03.2012, 22:45   #3
alexem
Senior Member
 
Аватар для alexem
 
Регистрация: 08.03.2008
Адрес: Самара
Возраст: 44
Сообщений: 487
Вес репутации: 392/43
alexem is just really nicealexem is just really nicealexem is just really nicealexem is just really nice
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

В первом приближении - не надо double, float, и, тем более, 4MHz тактовой. Надо выбрать другой контроллер с ICM на борту и (если надо быстро - с максимальной тактовой частотой).
alexem вне форума   Ответить с цитированием
Старый 13.03.2012, 22:51   #4
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/95
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
Не хотелось бы изобретать велосипед, поэтому кто реально сталкивался
поделитесь практическим опытом.
Очень рекомендую почитать ветку с электроникса.
DL36 вне форума   Ответить с цитированием
Старый 13.03.2012, 23:42   #5
FlashBack
Senior Member
 
Аватар для FlashBack
 
Регистрация: 16.02.2010
Адрес: Грузия, Тбилиси
Возраст: 33
Сообщений: 2,233
Вес репутации: 2337/74
FlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond reputeFlashBack has a reputation beyond repute
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Когда то, давным давно, собрал частотомер по схеме из инета... Был на 16F873 с 4-мя мегагерцовым кварцем. Увы ссылка и схема не сохранились, есть только программа. Насколько мне хватило познаний асемблера - там использовали TMR1 для счёта.
На всякий кидаю в атач... В друг пригодится...

P.S. Работал действительно неплохо и точно. При чём с автоушкалой, с 1 Гц до 50 МГц кажется...

P.S.2. Нашёл ссылочку http://kazus.ru/articles/427.html
Вложения
Тип файла: rar FreqMeter.rar (36.0 Кб, 60 просмотров)
FlashBack вне форума   Ответить с цитированием
Старый 14.03.2012, 00:02   #6
tem-ya
Senior Member
 
Аватар для tem-ya
 
Регистрация: 30.11.2007
Адрес: Воронеж
Возраст: 41
Сообщений: 253
Вес репутации: 190/40
tem-ya has a spectacular aura abouttem-ya has a spectacular aura about
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

alexem, в данном конкретном случае надо именно шашечки , а не доехать. Т.к. в более чем в 30 проектах которые я нагуглил на просторах ни в одном ни чего такого не использовалось. Авторы данных произведений бедный 84, 628 пик и иже с ним 12 просто изнасиловали во всех мыслимых и не мыслимых позах.
Я всегда считал реализацию всяких счетчиков на контроллере некой категорией неинтересного примитивизма - типа отбора конфеты у ребенка. И как-то всегда старался обходить стороной такие задачки.

Но тут неожиданно возникла практическая задача - заменить в подаренном мне старом приемнике цифровую шкалу на что-либо более компактное и совсем бюджетное. Поэтому, видимо, все-таки пришло время (для меня) расставить точки над i.

Greg, дорогой ты мой. Не хотел писать, но блин..., ДВА наших форума под завязку засраны темой измерения частоты. Я две недели честно пытался осилить весь этот бред. Даже завел текстовичек, куда стал заносить редкие более или менее здравые мысли. Кстати, ты в лидерах - больше всех выдавал по делу, только ну ОЧЕНЬ по малу. Чувствую есть серьезный практический опыт. Ну сколько можно. Не надо подсказок. Напиши хоть один раз развернуто как надо строить такой девайс, чтобы было понятно дураку. И можно будет закрыть эту тему прикрепив с пометкой важное!

DL36, спасибо обязательно ознакомлюсь.

Пока сделал так, но что-то, честно говоря, не нравиться как работает. На частотах 20-30 МГц заметно прыгают килогерцы, что меня не устраивает.

Код:
#include <pic.h>
#include "defs.h"
#include "pic_config.h"
#include "LCD.h"
#include "MT10T7_LCD.h"


#define t_izmer 500000      // время измерения в мкс 
#define F_pch   4630        // промежуточная частота в KГц 463.0



// Моя "state-машина"

//----------------------------
typedef enum {

    init,
    idle,
     start,
    stop,
    calc_F

} MyState;

MyState state;

//----------------------------



uint  N_owf_TMR0;  //число переполнений счетчика TMR0
ulong sum_TMR1;
ulong T_izm;

uint temp;           // Для недолгого хранения значений TMR1

float Fs;
double FFs;
ulong F1;


uchar tmp;

//********************************************
//            ОБРАБОТЧИК ПРЕРЫВАНИЙ            //
//********************************************
static void interrupt isr(void)
{

//===================================================
//    Прерывание по переполнению счетчика TMR0
//===================================================
if(T0IF)      
{
    T0IF = 0;
    N_owf_TMR0 = N_owf_TMR0++;  //первое прерывание считать не следует

    if(state == stop)  //Останавливаем измерения
    {
      T0IE = 0;    // Запрещаем прерывание от TMR0 при переполнении
      TMR1ON = 0;  // Прекращаем отсчет времени

      state = calc_F;
    }

    if(state == start) //Запускаем измерения
    {
       TMR1L = 23;     // Начальная инициализация, для того
       TMR1H = 0;      // чтобы правильно определять время измерения
       TMR1ON = 1;     // Запускаем TMR1 на счет периода
       N_owf_TMR0 = 0;
       
       state = idle;
    }

}// end TMR0 isr



//===================================================
//  Прерывание по переполнению TMR1 = FFFF
//           T > 65535 мкс (FFFF)
//===================================================
if(TMR1IF && TMR1IE)      
{
    TMR1IF = 0;
    sum_TMR1 = sum_TMR1 + 65536;
    
    if((sum_TMR1 > t_izmer) && (state != calc_F ))    // Если время измерения прошло
    {                        
       state = stop;  // заканчиваем измерения
    }
}// end TMR1 owerflow isr





}//----------------------  END all isr  ----------------------------------





main(void)
{
  

  pic_config();  //Конфигурируем используемые ресурсы PIC16F628A

  state = init;  //Уходим на устанавливку стартовых значений переменных и счетчиков



  while(1)    //бесконечный цикл
  {            


  switch(state)    // проверяем состояния "state-машины"
  {    
    //------------------------------
    //     0. Начальная инициализация
    //------------------------------
    case init:

          N_owf_TMR0 = 0;
          T_izm = 0;
          temp = 0;
          sum_TMR1 = 0;

          T0IE = 1;   // Разрешаем прерывание от TMR0 при переполнении

        //----------------------
        state = start;
        break;


    //------------------------------
    case calc_F:

        Lo_byte(temp) = TMR1L;
        Hi_byte(temp) = TMR1H;
    
        T_izm =  temp + sum_TMR1 - 16; //18
    
        FFs = (65536.0*N_owf_TMR0)/(T_izm*0.0001);  //Частота в KГц.x

        F1 = (ulong)FFs - F_pch; 
    
        print_MT_Lcd(F1);

        //-------------
        state = init;
        break;


    //------------------------------
    case idle:
        // ничего не делаем
        // ждем прерываний
        break;


    }//end switch


  }//end while(1)


}//end main
ну и файл конфигурации переферии pic_config.h

Код:
#ifndef PIC_CONFIG_H
#define PIC_CONFIG_H


#ifndef    XTAL_FREQ
#define    XTAL_FREQ    4MHZ     //Частота кварца в MHz
#endif

//--------------------------------------------------------
//    Солово конфигурации процессора  PIC16F628 (4МГц)
//--------------------------------------------------------
__CONFIG (HS &WDTDIS &PWRTEN &MCLRDIS &LVPDIS &UNPROTECT);



#define TRISA_CONST  0b11101     // A2       - выход
#define TRISB_CONST  0b00000000  // RB0..RB6 - выходы


//--------------------------------------------------
//Подключение LCD МЭЛТ МТ10-Т7 к портам PIC16F628
//--------------------------------------------------
#define    MT_B0    RB0    
#define    MT_B1    RB1    
#define    MT_B2    RB2    
#define    MT_B3    RB3    

#define    MT_A0    RB4    
#define    MT_WR1    RB5    



//----------------------------------------------------------------------------
extern void pic_config(void); 


#endif
и pic_config.с

Код:
#include <pic.h>
#include "pic_config.h"
#include "MT10T7_LCD.h"


void TMR0_config(void);
void TMR1_config(void);
void TMR2_config(void);


//===================================================
//        Процедура начальной инициализации
//===================================================
void pic_config(void)
{

  TMR0_config();
  TMR1_config();
                //TMR2_config();

  PEIE = 1; // Разрешаем прерывание от всех переферийных модулей,
            // чтобы работали прерывания при переполнении TMR1 
  GIE = 1;  // Разрешены все прерывания

  //------------------
  TRISA = TRISA_CONST;
  TRISB = TRISB_CONST;

  //------------------
  lcd_init();   // Инициализируем индикатор
  lcd_clear();  // Очищаем

}



//----------------------------------------------------------
//                    Конфигурация TMR0 
//  Режим счета внешних событий. Считает количество периодов
//    внешего сигнала (после предделителя, естественно)
//---------------------------------------------------------- 
void TMR0_config(void)
{
/*
  OPTION =                                                    */
        //RBPU   = 1; // Активные нагрузки порта В отключены всегда
        //INTEDG = 1; // Прерывание по возрастающему фронту на ножке RB0/INT
        T0CS   = 1;   // Приращение TMR0 от внешнего тактового сигнала c входа RA4/T0CKI
        T0IE   = 1;      // Разрешаем прерывание от TMR0 при переполнении

        PSA    = 0;   // Включаем предделитель перед TMR0   
        PS2    = 1;
        PS1    = 1;   // конфигурация предделитель перед TMR0 1:256
        PS0    = 1; 
                      // или кратко:  OPTION = 11110111;

        /* Коэфициенты деления (для справки)
           -------------------T-----------¬
           ¦ PS2, PS1, PS0 ¦   для TMR0   ¦
           +------------------+-----------+
           ¦     0 0 0    ¦    1 : 2      ¦
           ¦     0 0 1    ¦    1 : 4      ¦
           ¦     0 1 0    ¦    1 : 8      ¦
           ¦     0 1 1    ¦    1 : 16     ¦
           ¦     1 0 0    ¦    1 : 32     ¦
           ¦     1 0 1    ¦    1 : 64     ¦
           ¦     1 1 0    ¦    1 : 128    ¦
           ¦     1 1 1    ¦    1 : 256    ¦
           L------------------+------------  */

}


//----------------------------------------------------------
//                 Конфигурация TMR1 
//  (Используется для определения измерительного интервала)
//----------------------------------------------------------
void TMR1_config(void)
{
    TMR1ON = 0; // Выключить TMR1
    TMR1CS = 0; // Приращение TMR1 от внутреннего сигнала Fosc/4  
    TMR1IE = 1; // Разрешить прерывание от TMR1 при переполнении


    // Конфигурируем предделитель перед TMR1
    // T1CKPS1 = 0;    T1CKPS0 = 0;  
    

  /*         Коэфициенты деления
         ------------------T-----------¬
        ¦ T1CKPS1, T1CKPS0 ¦ для TMR1  ¦
        +------------------+-----------+
           ¦       1 1        ¦   1 : 8   ¦
           ¦       1 0        ¦   1 : 4   ¦
           ¦       0 1        ¦   1 : 2   ¦
           ¦       0 0        ¦   1 : 1   ¦
        L------------------+------------  */
}
tem-ya вне форума   Ответить с цитированием
Старый 14.03.2012, 06:26   #7
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,652
Вес репутации: 5137/157
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
Напиши хоть один раз развернуто как надо строить такой девайс, чтобы было понятно дураку. И можно будет закрыть эту тему прикрепив с пометкой важное!
так всё и написано, что можно было написать, там ничего особо сакрального нет.
Почему до сих нет описания универсальной любительской схемы такого девайса на 16 пике? Так на этом пике универсально это сделать невозможно. В зависимости от задачи всякий раз получается по-разному (со стороны это действительно очень похоже на изнасилование)
Что до двух конкретных приложений - автомобильных тахометров и вашей шкалы - не надо никаких заморочек, делайте методом частотомера и не парьтесь. В том же тахометре обычно самое сложное - не замерить точно, а красиво округлить, чтобы у результата последние цифры были одним или двумя нулями. ноу-хау в этом.
Greg вне форума   Ответить с цитированием
Старый 14.03.2012, 09:25   #8
tem-ya
Senior Member
 
Аватар для tem-ya
 
Регистрация: 30.11.2007
Адрес: Воронеж
Возраст: 41
Сообщений: 253
Вес репутации: 190/40
tem-ya has a spectacular aura abouttem-ya has a spectacular aura about
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Отмазался. Ок. Спрошу подругому. Ты бы как сделал себе, если бы потребовалось (в оговоренных рамках).
tem-ya вне форума   Ответить с цитированием
Старый 14.03.2012, 11:17   #9
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/95
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
DL36, спасибо обязательно ознакомлюсь.
Для понимания процесса это надо было сделать до написания программы, это классика.
Цитата:
ИЗМЕРЕНИЕ ЧАСТОТЫ С ПОМОЩЬЮ АВР МИКРОКОНТРОЛЛЕРА

1) Введём определения
Fо - сигнал опорной частоты,
То - период опорной частоты, То=1/Fо,
Fx - входной сигнал (меандр) неизвестной частоты, подлежащей измерению,
Тх - период входной частоты, Тх=1/Fx,
Тизм - период измерения входной частоты,
N - количество импульсов опорной частоты за время измерения,
M - количество импульсов входной частоты за время измерения.

2) Формула вычисления частоты Fx = Fо*М/N (поскольку очевидно, что То*N=Тх*М за Тизм).

3) Формула для Fx применима как к варианту с "воротами", так и к варианту со схемой захвата. При использовании схемы захвата М является точным числом, а N "гуляет" в пределах (-1,+1). При использовании "ворот" N является точным числом, а М "гуляет" в пределах (-1,+1).

Вот всё, что нам нужно знать из теории для измерения частоты.

4) Применим наши знания на практике. Выберем период измерения Тизм примерно равным одной секунде. (Примерно потому, что Тизм должен быть ТОЧНО кратен М*Тх). Пусть Fx=170 кГц, а Fо=16МГц. Тогда М=170000, а N=16000000.

Вычислим частоту по нашей формуле Fxвыч = Fо*М/N=16000000*170000/16000000=170000 Гц.
Вычислим погрешность метода. Не буду вас мучить выводом соответствующей формулы с помощью частных дифференциалов, кто захочет пусть сам потренируется, скажу только, что относительная погрешность будет суммой модулей относительных погрешностей отдельных составляющих.
Ну и ещё упростим задачу, приняв ΔFo/Fo =0 (На самом деле, кратковременная нестабильность кварцевой опоры порядка 10^(-8) или лучше).

Итак, Fx = Fо*М/(N±1)=170000±0.010625 Гц. Что нам и требовалось показать. Относительная погрешность составит 6*10^(-8). Можно добавить 10^(-8) нестабильности опоры, если требуется уточнить погрешность. Кстати, для варианта с "воротами" Fx = Fо*(М±1)/N=170000±1 Гц, как и было сказано.

5) Перейдём теперь к реализации алгоритма на микроконтроллере. В принципе, всё и так уже ясно, просто поставим точки над ϊ и чёрточки на t(:-). Сколько нам нужно захватов таймера, чтобы вычислить частоту? Два - один для захвата начала секундного интервала, и второй для захвата конца того же интервала. Пусть захват работает по прерыванию. При захвате, т.е. при положительном фронте импульса входной частоты, содержимое таймера перепишется в регистр ICR. Прекрасно, в этом же прерывании запомним в регистрах или в памяти два числа – количество импульсов Мнач и Nнач, запрещаем прерывание и выходим из него (замечу в скобках, схема захвата "молотит" по-прежнему, но прерывания запрещены), оно нам понадобится только через секунду, займёмся другими делами, скажем, расчетом частоты предыдущего цикла. Через примерно секунду работы (или вынужденного безделья, можно по таймеру) ОПЯТЬ разрешаем прерывания от схемы захвата. Как только оно произойдёт, опять запоминаем два числа – количество импульсов Мкон и Nкон, запрещаем прерывание по захвату и выходим из него, вычисляем М=Мкон-Мнач, N=Nкон-Nнач.

Вот так это всё и работает. Я, конечно многого не упомянул. Все переменные для расчета должны быть соответствующей разрядности, как минимум 32, умножение надо делать до деления, чтобы не потерять точность, вычисление частоты можно вести непрерывно, достаточно просто после вычисления частоты переписать переменные Мнач=Мкон, Nнач=Nкон. Обязателен учёт переполнения таймеров.

6) По времени выполнения, самые длительные операции – умножение и деление, скажем, по 400 тактов, остальное умещается в 500 или меньше. 1500 тактов из 16 миллионов - процессор практически свободен 99.9% времени.

7) Измерение по похожему алгоритму реализовано мной на МК 8515 и прекрасно работает более 5-ти лет в нескольких тысячах экземпляров (в Германии).

8) Надеюсь также, что сия заметка кому-то реально поможет в понимании, в реализации или ещё в чём-нибудь.
DL36 вне форума   Ответить с цитированием
Старый 14.03.2012, 21:16   #10
tem-ya
Senior Member
 
Аватар для tem-ya
 
Регистрация: 30.11.2007
Адрес: Воронеж
Возраст: 41
Сообщений: 253
Вес репутации: 190/40
tem-ya has a spectacular aura abouttem-ya has a spectacular aura about
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Вот это ты DL36, зацепил, народ...3 человека читают тему 2007 г. на электрониксе из гостей. Четвертый dosikus.
Пока ничего говорить не буду, не проникся пока. Только рекомендовал бы всем заинтересованным обязательно скачать указанную там книгу -

А.С. Касаткин Автоматическая обработка сигналов частотных датчиков 1966 г.

Думается там есть ответы на все вопросы в отличие от форумов. Старые книги толковыми были, не то что сейчас.
tem-ya вне форума   Ответить с цитированием
Старый 14.03.2012, 21:27   #11
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/95
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
Вот это ты DL36, зацепил, народ...3 человека читают тему 2007 г. на электрониксе из гостей. Четвертый dosikus.
Это классика а она не стареет, да и не только я даю эту ссылку. Лучшего описания нету.
DL36 вне форума   Ответить с цитированием
Старый 21.03.2012, 21:46   #12
tem-ya
Senior Member
 
Аватар для tem-ya
 
Регистрация: 30.11.2007
Адрес: Воронеж
Возраст: 41
Сообщений: 253
Вес репутации: 190/40
tem-ya has a spectacular aura abouttem-ya has a spectacular aura about
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Не в коня корм похоже. Читал-читал, а ясности так и ни на грамм не прибавляется.... печально

Асинхронный прескаллер на 256 подсчитал 256 периодов входного сигнала и счетчик TMR0 по переполнению дал прерывание. Берем этот момент за начало отсчета всего. Тогда автоматом засинхронизированны с фронтом входного сигнала. Тут же запускаем TMR1 на счет времени. В прерываниях по переполнению TMR1 просто подсчитываем время и сравниваем с интервалом измерения. Если время превысило интервал измерения выставляем флаг для TMR0. Когда после очередных 256 периодов входного сигнала мы попадаем в прерывание по переполнению счетчика TMR0 и видим установленный флаг - останавливаем все - и время и счет. Таким образом гарантированно имеем на входе целое число периодов. И время за которое они были подсчитаны. Дальше просто математика.

Реально реализован алгоритм практически идентичный описанию. Только нет модуля захвата. Что не так. Что я упустил? Почему все-таки пляшут килогерцы на высоких частотах?
tem-ya вне форума   Ответить с цитированием
Старый 22.03.2012, 03:02   #13
al.kl
Senior Member
 
Регистрация: 11.10.2011
Возраст: 22
Сообщений: 233
Вес репутации: 750/32
al.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to behold
Отправить сообщение для al.kl с помощью ICQ
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Не понятно, о какой точности может идти речь, если Вы тактируете сигнал с прескаллером на 256 ? На 65536 значений, погрешность = +-256. Это при ~6.5Мгц - ~25.6Кгц.
al.kl вне форума   Ответить с цитированием
Старый 22.03.2012, 07:40   #14
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,652
Вес репутации: 5137/157
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
Когда после очередных 256 периодов входного сигнала мы попадаем в прерывание по переполнению счетчика TMR0 и видим установленный флаг - останавливаем все - и время и счет. Таким образом гарантированно имеем на входе целое число периодов. И время за которое они были подсчитаны. Дальше просто математика.

Реально реализован алгоритм практически идентичный описанию. Только нет модуля захвата. Что не так. Что я упустил? Почему все-таки пляшут килогерцы на высоких частотах?
надо не "выставлять флаг для ТМР0", а останавливать счёт (аппаратно, тут вам надо подумать как). Потом можно аккуратно сосчитать (подсказка - фактически не сосчитать, а досчитать) сколько импульсов находится в прескалере.
Про "целое число периодов" на таких частотах забудьте, голой периферией 16-пика это не сделать.
Greg вне форума   Ответить с цитированием
Старый 22.03.2012, 12:27   #15
tem-ya
Senior Member
 
Аватар для tem-ya
 
Регистрация: 30.11.2007
Адрес: Воронеж
Возраст: 41
Сообщений: 253
Вес репутации: 190/40
tem-ya has a spectacular aura abouttem-ya has a spectacular aura about
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Да вся идея была как раз в том, чтобы избавиться от досчета как такового. При 30 МГц входного сигнала асинхронный предделитель будет
переполняться каждые 8.5 мкс (циклов процессора). Т.е. каждые 8 цыклов процессора TMR0 будет увеличиваться на 1. Переполнение (256) его произойдет чере 2184.5 циклов процессора (это очень долго) и мы попадем в прерывание по переполнению, где проводятся все проверки. Задержка между моментом переполнения TMR0 и входом в прерывание по переполнению по идее небольшая и относитльно стабильная. Если оперативно остановит счет времени, то скорректировав полученное время на величину задержки на вход в прерывание получим время ЦЕЛЫХ кратных 256 периодов входного сигнала. И нам по идее безразлично сколько там еще успело после этого в прескаллере натикать периодов - это уже нас не касаетсся. Время вроде бы берется на момент переполнения TMR0, а все что в прескалере сидит - это то, что уже после переполнения TMR0 туда набежало. Может в том косяк, что время входа в прерывание не стабильно и плавает?
tem-ya вне форума   Ответить с цитированием
Старый 22.03.2012, 13:59   #16
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 38
Сообщений: 796
Вес репутации: 1121/56
siargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud of
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

а, я понял, надо чтобы таймеры стартовали и останавливались синхронно.
но в процессоре возможно только последовательно с одинаковой задержкой. тогда и результат будет достоверным.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 22.03.2012, 18:50   #17
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,652
Вес репутации: 5137/157
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
Да вся идея была как раз в том, чтобы избавиться от досчета как такового. При 30 МГц входного сигнала асинхронный предделитель будет
вы ответьте на вопрос, на каком временном интервале вы проводите измерения. В тексте программы в комментариях этого не видно. Это самое главное.
Кстати, вся процедура прекрасно симулируется в мплабе, сразу видно, где что привносится.
Greg вне форума   Ответить с цитированием
Старый 22.03.2012, 20:14   #18
tem-ya
Senior Member
 
Аватар для tem-ya
 
Регистрация: 30.11.2007
Адрес: Воронеж
Возраст: 41
Сообщений: 253
Вес репутации: 190/40
tem-ya has a spectacular aura abouttem-ya has a spectacular aura about
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Код:
#define t_izmer 500000      // время измерения в мкс
В начале файла описано. Думается время измерения здесь мало влияет.
Пробовал погонять от 0.1с до 3с принципиальной разницы не увидел.

Вообще, для моих целей время измерения больше 1с не гут. Слишком медленно будут обновляться показания. 0.5с самое то.

По поводу Мплаба, что-то у меня не получилось симулировать сигнал с периодом меньше двух машинных циклов, т.е. сигнал реально высокой частоты. Это вообще возможно в Мплабе. Если да то как.

Косяк где-то в методике. Чего-то я пока недопонимаю. Видимо нужно пробовать тупо реализовывать другие подходы - досчет, пробывать прикрутить ССP. Отмерять целый интервал измерения, кратный 256, забив на целое количество входных периодов, непрерывные измерения, усреднения и т.д.
Смотреть, сравнивать и нарабатывать статистику. Может что и проясниться.
tem-ya вне форума   Ответить с цитированием
Старый 22.03.2012, 23:33   #19
tem-ya
Senior Member
 
Аватар для tem-ya
 
Регистрация: 30.11.2007
Адрес: Воронеж
Возраст: 41
Сообщений: 253
Вес репутации: 190/40
tem-ya has a spectacular aura abouttem-ya has a spectacular aura about
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Перевел AN592.

PIC16C54 имеет один 8-разрядный таймер (RTCC), который может быть использован с 8-разрядным предделителем. Предделитель работает асинхронно, поэтому он может считать очень высокие частоты. Минимальное время нарастания и спада на входе частоты составляет 10 нс, так что самая высокая тактовая частота RTCC может достигать 50 МГц. Предделитель необходимо использовать при измерении высоких частот. Поскольку предделитель может быть сконфигурирован как делитель на 256, максимальное разрешение, с которым входная частота может быть измерена, составляет 16 бит. Тем не менее, делитель не может быть непосредственно прочитан как регистр. Эта статья описывает уникальный метод, посредством которого пользователь может «извлечь» 8-битное значение из предделителя. С этим значением точность измерений составляет 16 бит. Старшие 8 бит хранятся в RTCC - младшие 8 бит в предделителе.

В этом документе описан частотомер, который может измерять частоты от 50 МГц до 50 Гц. Частотомер был реализован, чтобы продемонстрировать метод измерения частоты 16-битным счетчиком с предварительным делителем и RTCC.

Схема измерительной цепи следующая: входной сигнал измеряемой частоты подается на RTCC или на вход RA4 (вывод 3 PIC16C54). RA4 соединен накоротко с RA2. Входной сигнал подается к RTCC через резистор на 470 Ом.

RTCC в PIC16C54 конфигурируется для измерения входной частоты на входе RA4. Входную частоту "закрывают" точным периодом времени. Перед началом формирования этих точных временных "ворот", RTCC очищается (что приводит к очистке предделителя), а RA2 вывод конфигурируется как вход. Точные временные "ворота" реализуется в программе с помощью точных задержек. В конце задержек вывод RA2 настраивается как выход и устанавливается в 0. Это приводит к тому, что счет на входе RTCC останавливается. А 16-битное значение входной частоты на этот момент оказывается сохраненным в RTCC и 8-битном предделителе. Старшие 8 бит частоты в RTCC могут быть легко прочитаны. А 8 младших битов должна быть дополнительно "сдвинуты". Эти 8-бит предделителя принудительно "сдвигаются" переключением RA2 с помощью команды BSF” и “BCF. После каждого такого переключения, значение в RTCC проверяется, с целью зафиксировать момент, когда RTCC будет увеличен. Если число переключений, вызывающих увеличение RTCC на 1, было N, то 8-разрядное значение в предделителе может быть рассчитано как = (256 - N). Объединяя подсчитанное в предделителе значение и исходное значение в RTCC, определяем 16-битное значение для входной частоты.
tem-ya вне форума   Ответить с цитированием
Старый 23.03.2012, 09:52   #20
al.kl
Senior Member
 
Регистрация: 11.10.2011
Возраст: 22
Сообщений: 233
Вес репутации: 750/32
al.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to behold
Отправить сообщение для al.kl с помощью ICQ
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

На сколько мне известно, TMR1 может работать в режиме асинхронного счётчика. Почему бы его не задействовать для подсчёта внешних импульсов ? Зачем этот гемор с прескаллерами ?
al.kl вне форума   Ответить с цитированием
Старый 23.03.2012, 19:04   #21
tem-ya
Senior Member
 
Аватар для tem-ya
 
Регистрация: 30.11.2007
Адрес: Воронеж
Возраст: 41
Сообщений: 253
Вес репутации: 190/40
tem-ya has a spectacular aura abouttem-ya has a spectacular aura about
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

al.kl, я даже не знаю что сказать - я второй ваш пост, мягко говоря не понимаю...Если есть желание, напишите развернутый взгляд на проблему, что бы даже далеким от темы людям стало понятно, глядишь и для себя что-нибудь полезного откроете, а может и нас (меня) просветите.
tem-ya вне форума   Ответить с цитированием
Старый 23.03.2012, 19:14   #22
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,299
Вес репутации: 4442/102
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
Эти 8-бит предделителя принудительно "сдвигаются" переключением RA2 с помощью команды BSF” и “BCF.
во-первых: не "сдвигается", а делается "досчет"
а во-вторых: переключением фазы счета досчет производится без махания ногой наружу, т.е. в источник не вносится помех низкоомным резистором. Когда то очень давно делал на PIC16F84 синтезатор частоты с очень точным опорником (1Е-10), так вот досчет с маханиями наружу вышибали своей помехой фазу ФАПЧ-а, что приводило к полной фигне на выходе генератора. Немного подумав, сделал досчет внутри PIC-а и синтезатор заработал. Синтезировал частоты типа 6,50625 МГц (шаг сетки 6.25кГц).
ampersant вне форума   Ответить с цитированием
Старый 23.03.2012, 20:35   #23
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,652
Вес репутации: 5137/157
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
Код:
#define t_izmer 500000      // время измерения в мкс
В начале файла описано. Думается время измерения здесь мало влияет.
что-то с математикой не чисто

Код:
FFs = (65536.0*N_owf_TMR0)/(T_izm*0.0001);  //Частота в KГц.x
умножьте всё сначала (в том числе на 10000 (1/0.0001)), а потом уже делите

я же вам говорил забыть про флоат, делайте всё целыми, что в лонг не уложится - на старом форуме давали длинное умножение и деление (да там ничего сложного)
Greg вне форума   Ответить с цитированием
Старый 23.03.2012, 22:07   #24
al.kl
Senior Member
 
Регистрация: 11.10.2011
Возраст: 22
Сообщений: 233
Вес репутации: 750/32
al.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to behold
Отправить сообщение для al.kl с помощью ICQ
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
al.kl, я даже не знаю что сказать - я второй ваш пост, мягко говоря не понимаю...Если есть желание, напишите развернутый взгляд на проблему, что бы даже далеким от темы людям стало понятно, глядишь и для себя что-нибудь полезного откроете, а может и нас (меня) просветите.
Честно говоря, даже и не знаю как развернуть мой ответ.
Вы используете TMR0 для подсчёта внешних импульсов, а период подсчёта этих импульсов реализуете таймером TMR1. Почему именно так ? Почему бы не поменять их местами и отгородить себя от проблем с предделителем ? 1-ый таймер 16-ти битный, даже на высокой частоте, вполне спокойно и без усилий можно подсчитывать его переполнения. Так-же, его можно сконфигурировать как асинхронный счётчик, что позволит его инкрементировать внешним сигналом с частотой выше тактовой частоты МК.

Последний раз редактировалось al.kl; 23.03.2012 в 22:14.
al.kl вне форума   Ответить с цитированием
Старый 23.03.2012, 22:42   #25
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/95
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Re: Помогите уложить частотомер в периферию PIC16F628

Цитата:
Сообщение от tem-ya Посмотреть сообщение
Не в коня корм похоже. Читал-читал, а ясности так и ни на грамм не прибавляется.... печально
Ветку читали, там многие не поняли сразу.
Цитата:
Сообщение от tem-ya Посмотреть сообщение
Реально реализован алгоритм практически идентичный описанию. Только нет модуля захвата. Что не так. Что я упустил? Почему все-таки пляшут килогерцы на высоких частотах?
На 628 напрямую спроектировать наверно не получится.

Я давно не работал с этим чипом поэтому поправьте если, что.

Если посчитать 30 МГц/256/256 ~= 457 Гц много или мало не знаю но хотелось бы увеличить время измерения.

Идея такая запускаем таймер0 в режим свободного счета и по переполнению организуем смену состояния на любой ноге порта для ССР.

Далее первый таймер тоже в режиме свободного счета от системного генератора и работает на модуль захвата, который срабатывает через внешнюю ногу.
При этом появится возможность использовать дополнительный делитель, настраивая CCP на срабатывание каждый первый, шестнадцатый фронт.

Считать период измерения между двумя событиями захвата, ну и считать количество переполнений таймера1 и останавливать ничего не надо, оптимально использовать прерывание только для формирования выхода для CCP.

Поскольку таймер0 свободно бегущий выполняется условие кратности.
Ну вот приблизительно, так...
DL36 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите не могу прошить PIC16F628 программатор WILLEPROM FARGYS Продукция MICROCHIP 13 02.07.2008 15:46
Помогите с PWM на pic16f628 djdiablo Продукция MICROCHIP 22 24.01.2008 15:00


Часовой пояс GMT +3, время: 11:41.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot