Частотомер на PIC

Всё что связано с аппаратурой и антеннами
Ответить
  • Автор
  • Сообщение
Не в сети
Сообщения: 80
Зарегистрирован: 23 апр 2013 20:44

Частотомер на PIC

Сообщение DimaS »

Все привет!
Кто занимается конструированием, на заметку.
Сейчас многие современные PIC имеют в своем составе модули CLC (конфигурируемые логические ячейки).
По даташиту, максимальная частота переключения составляет 140МГц, что позволяет конструировать частотомеры с такой максимальной частотой. Для этого нужно сконфигурировать CLC в режиме D-триггера. Ниже конфигурация для PIC18F46Q10, где используется два CLC настроенные как делитель на 4:
TIMER0 - счет частоты с выхода CLC
TIMER1 - время измерения

CLCIN0PPS = 0x04; //вывод RA4 как вход CLC2:CLCIN0;

CLC1POL = 0x02;
CLC1SEL0 = 0x22;
CLC1SEL1 = 0x21;
CLC1SEL2 = 0x21;
CLC1SEL3 = 0x21;
CLC1GLS0 = 0x02;
CLC1GLS1 = 0x20;
CLC1GLS2 = 0x00;
CLC1GLS3 = 0x00;
CLC1CON = 0x84;

CLC2POL = 0x02;
CLC2SEL0 = 0x00;
CLC2SEL1 = 0x22;
CLC2SEL2 = 0x22;
CLC2SEL3 = 0x22;
CLC2GLS0 = 0x02;
CLC2GLS1 = 0x20;
CLC2GLS2 = 0x00;
CLC2GLS3 = 0x00;
CLC2CON = 0x84;

//TIMER 0 подсчет частоты, c CLC1
T0CON0 = 0x90;
T0CON1 = 0xF0;
TMR0H = 0;
TMR0L = 0;
PIR0bits.TMR0IF = 0;
PIE0bits.TMR0IE = 1;

//TIMER 1 период для измерения частоты c RA4
T1GCON = 0x00;
T1GATE = 0x00;
T1CLK = 0x01; //CS FOSC/4;
T1CON = 0x21;
TMR1H = tmr1h;
TMR1L = tmr1l;
PIR4bits.TMR1IF = 0;
PIE4bits.TMR1IE = 1;

Практические испытания позволили стабильно измерить частоту до 102МГц. По входу использован компаратор TLV3501.

73! Дима.
_________________
73! EU1CC

Не в сети
Аватара пользователя
Site Admin
Сообщения: 900
Зарегистрирован: 06 июн 2014 17:31
Откуда: Молодечно
Контактная информация:

Re: Частотомер на PIC

Сообщение EU2AA »

DimaS писал(а):Практические испытания позволили стабильно измерить частоту до 102МГц. По входу использован компаратор TLV3501.
73! Дима.
Дмитрий,
а можете сделать видимыми Герцы, 2 разряда после запятой?
Чтобы измерять с точностью до сотых долей Герца.
--
Конкретно, 10МГц измерить, как 10 000 000,00Гц.
Естественно, опорный генератор будет иметь стабильность 1Х10-9, т.е. 1ppb или 0,001ppm.
--
Такой частотомер очень пригодится при изготовлении опорных генераторов
_________________
Владимир,
ex UC2CED, EU2CED, RC2CA, EU2CA
2019 год - https://observablehq.com/@eu2aa
2017 год - http://eu2aa.com
1992 год - http://eu2aa.qrz.ru

Не в сети
Сообщения: 80
Зарегистрирован: 23 апр 2013 20:44

Re: Частотомер на PIC

Сообщение DimaS »

День добрый!
Конечно можно, просто увеличить время счета до 100сек... :-)
73!
_________________
73! EU1CC

Не в сети
Аватара пользователя
Сообщения: 136
Зарегистрирован: 07 июл 2009 19:58

Re: Частотомер на PIC

Сообщение EU1ME »

Дима, приветствую!
На свежих (10лет) пиках PIC16F1788 получалось по классике считать до 125МГц где-то (в анализаторе SWR-1), с CLC конечно можно сделать красивее

Выжимки кода:

Код: Выделить всё

    unsigned int i;
    unsigned char pre;

    switch(Count_Status)
    {
        case 0:	// инициализация измерения
        {
            GIE = 0;
            COUNTER_IN = 0;

            PSA = 0; // прескалер 256
            PS0 = 1;
            PS1 = 1;
            PS2 = 1;
            TMR0CS =  1; // с T0CKI
            TMR0SE = 0; // по фронту
            TRISA = 0b11001110; // Вход прескалера отключен
            COUNTER_IN = 0;

            AdjustTimer = Freq_Adjust;

            TMR0 = 0;
            TMR0IF = 0;
            Freq_Period_Counter = 0;
            Freq_Counter = 0;

            PR2 = 249;
            nop;
            TMR2IF = 0;
            TMR2 = 240;
            TRISA = 0b11011110; // включение счета
            Count_Status ++;	// переключаем на следующий шаг
            GIE = 1;
        break;
        }

        case 1:	// Подсчёт
        {
        break;
        }

        case 2:	// счет остановлен
        {
//            GIE = 0;
            Freq_Counter <<= 8;
            Freq_Counter += TMR0;
            Freq_Counter <<= 8;


            pre = TMR0; // досчет прескалера
            i = 0;
            while (TMR0 == pre)
            {
                TMR0SE = 1;
                TMR0SE = 0;
                i++;
            }
            TRISA = 0b11011110;
            Freq_Counter = Freq_Counter + (0x0100 - i);

            if (Freq_Counter == 1)Freq_Counter = 0;

            bin2bcd(Freq_Counter);
//            GIE = 1;
            Count_Status = 0;
        break;
        }
        default:  break;
    }
}


static void interrupt istf(void)
{
    if (TMR2IF)
    {
        TMR2IF = 0;
            if (Freq_Period_Counter == 1999)
            {
                while (AdjustTimer) AdjustTimer--;
                COUNTER_IN = 0;
                TRISA = 0b11001110; // Вход прескалера отключен
                Freq_Period_Counter = 0;
                Count_Status = 2; // Счет остановлен
            }
            Freq_Period_Counter ++;

            if (TMR0IF)
            {
                Freq_Counter ++;
                TMR0IF = 0;
            }
     }
}

_________________
Belka

Не в сети
Аватара пользователя
Site Admin
Сообщения: 900
Зарегистрирован: 06 июн 2014 17:31
Откуда: Молодечно
Контактная информация:

Re: Частотомер на PIC

Сообщение EU2AA »

DimaS писал(а):День добрый!
Конечно можно, просто увеличить время счета до 100сек... :-)
73!
А если измерять ПЕРИОД,
а потом пересчитать в частоту?
_________________
Владимир,
ex UC2CED, EU2CED, RC2CA, EU2CA
2019 год - https://observablehq.com/@eu2aa
2017 год - http://eu2aa.com
1992 год - http://eu2aa.qrz.ru

Не в сети
Сообщения: 80
Зарегистрирован: 23 апр 2013 20:44

Re: Частотомер на PIC

Сообщение DimaS »

На свежих (10лет) пиках PIC16F1788 получалось по классике считать до 125МГц где-то (в анализаторе SWR-1), с CLC конечно можно сделать красивее
Саша привет! Рад тебя слышать!
Вроде недокументированная возможность. Посмотрел TMR0, у него только 50МГц. Но сейчас у Микрочипа засилие "индусов", явно могли "накосячить" :-)
_________________
73! EU1CC

Не в сети
Сообщения: 80
Зарегистрирован: 23 апр 2013 20:44

Re: Частотомер на PIC

Сообщение DimaS »

EU2AA писал(а):
DimaS писал(а):День добрый!
Конечно можно, просто увеличить время счета до 100сек... :-)
73!
А если измерять ПЕРИОД,
а потом пересчитать в частоту?
Владимир Ильич, день добрый!
Период померять на такой частоте сложно. Надо тактировать счетчик, (если нужно померять 10Мгц с точностью 0.01Гц) частотой (10*100) 1ГГц.
Тут можно попробовать TDC (время в цифру конвертер). Принцип следующий:
1. Запускаем таймер времени измерения, например на 1 сек. (Т1)
2. Считаем количество импульсов другим счетчиком. (Т2)
3. По окончании счета Т1 запускаем TDC
4. По приходу фронта(спада) нашей частоты (с входа Т2) останавливаем TDC
5. Измеренное время от TDC добавляем к 1сек(Т1)

TDC обычно используют либо готовые микросхемы (TDC7200 -> разрешение 55ps, MAX35101 -> 20ps), либо на конденсаторе. (Конденсатор заряжают нарастающим напряжением, а затем измеряют АЦП) Здесь неплох описано (1-я половина статьи) https://habr.com/ru/post/352276/

Возможно существуют еще другие способы, но они мне неизвестны.
73! Дима.
_________________
73! EU1CC
Ответить