Все привет!
Кто занимается конструированием, на заметку.
Сейчас многие современные 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! Дима.
Частотомер на PIC
- Автор
- Сообщение
-
Не в сети
- Сообщения: 80
- Зарегистрирован: 23 апр 2013 20:44
Частотомер на PIC
_________________
73! EU1CC
73! EU1CC
-
Не в сети
- Site Admin
- Сообщения: 900
- Зарегистрирован: 06 июн 2014 17:31
- Откуда: Молодечно
- Контактная информация:
Re: Частотомер на PIC
Дмитрий,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
Владимир,
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
День добрый!
Конечно можно, просто увеличить время счета до 100сек...
73!
Конечно можно, просто увеличить время счета до 100сек...

73!
_________________
73! EU1CC
73! EU1CC
-
Не в сети
- Сообщения: 136
- Зарегистрирован: 07 июл 2009 19:58
Re: Частотомер на PIC
Дима, приветствую!
На свежих (10лет) пиках PIC16F1788 получалось по классике считать до 125МГц где-то (в анализаторе SWR-1), с CLC конечно можно сделать красивее
Выжимки кода:
На свежих (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
Belka
-
Не в сети
- Site Admin
- Сообщения: 900
- Зарегистрирован: 06 июн 2014 17:31
- Откуда: Молодечно
- Контактная информация:
Re: Частотомер на PIC
А если измерять ПЕРИОД,DimaS писал(а):День добрый!
Конечно можно, просто увеличить время счета до 100сек...
73!
а потом пересчитать в частоту?
_________________
Владимир,
ex UC2CED, EU2CED, RC2CA, EU2CA
2019 год - https://observablehq.com/@eu2aa
2017 год - http://eu2aa.com
1992 год - http://eu2aa.qrz.ru
Владимир,
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
Саша привет! Рад тебя слышать!На свежих (10лет) пиках PIC16F1788 получалось по классике считать до 125МГц где-то (в анализаторе SWR-1), с CLC конечно можно сделать красивее
Вроде недокументированная возможность. Посмотрел TMR0, у него только 50МГц. Но сейчас у Микрочипа засилие "индусов", явно могли "накосячить"

_________________
73! EU1CC
73! EU1CC
-
Не в сети
- Сообщения: 80
- Зарегистрирован: 23 апр 2013 20:44
Re: Частотомер на PIC
Владимир Ильич, день добрый!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
73! EU1CC