Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

AN592 Frequency Counter есть вопрос

Сб апр 18, 2015 19:13:37

Решил сделать себе частотомер, в меру простой, но при этом точнее общедоступных.
Изучая тематический материал нарыл субжевый аппноут.
an592.pdf
Частотомер
(34.42 KiB) Скачиваний: 304

Потом прочитал и понял основной принцип: одна нога МК работает шлюзом для входного сигнала. Например, открывает вход на 1 секунду, а встроенный счетчик/таймер Пика считает количество импульсов. Потом шлюз закрывается, а это количество импульсов показывается на экране как частота, коей и является (при 1 сек измерения). Если время замера 0,1сек, то полученное число надо умножить на 10 и показать на экране.
Автор предлагает оригинальный метод досчета предделителя, у которого, в отличие от основного счетчика, нет своего регистра. И из него напрямую невозможно скачать насчитанное число. То есть, он делит частоту входного сигнала на 256. Просто считает, ноль, раз, два и тд, до 255. После этого он сбрасывается снова на ноль, а на выходе выдает одиночный импульс. Эти импульсы подсчитываются таймером/счетчиком Пика.
Изображение
(T0 это RTCC)
Идея в чем. после окончания замера остается небольшое число импульсов в предделителе, от 0 до 254. Это добавляется к погрешности измерения. Что бы точно узнать это число и, соответственно, повысить точность, автор предложил генерировать одиночные импульсы на входе счетчика/таймера с подключенным предделителем с помощью другой ноги МК и каждый раз проверять, не увеличилось ли содержимое Timer0 Пика. Искомое число вычисляется по формуле (256-N), где N - число сгенерированных импульсов.
Изображение
(RTCC это T0)
Но, для этого автор использует ту же самую ногу МК, которая управляет поступлением входного сигнала.
Это как раз то, чего я не могу понять. Ведь вместо того, что бы генерировать одиночные импульсы, он просто пропускает пачки импульсов входного сигнала! Лично я бы доверил это разным ногам МК, типа так:
Изображение
То есть, одна нога перекрывает шлюз для входного сигнала, а вторая генерирует импульсы досчета.

Кто занимался, прокомментируйте, плз. Потому как наличие во многих прошивках частотомеров на ПИК "программной калибровки" наводит на мысль, что с ее помощью компенсируется именно эта ошибка. Даже собранный лично частотомер на 16F84 показывает свою собственную тактовую частоту 4МГц как 4.000660.
Спасибо.

ЗЫ.
Вопрос закрыт:
1. Входной сигнал давится ногой, запрограммированной как выход, за счет резистора к47. То есть идет правильный досчет.
2. В собранном мной частотомере не выверено время измерения.
Большое спасибо.
Последний раз редактировалось DrLivsy Вс апр 19, 2015 07:47:42, всего редактировалось 1 раз.

Re: AN592 Frequency Counter есть вопрос

Сб апр 18, 2015 20:11:35

Года 4-5 назад делал универсалнъй LCFT (индуктивност, капацитет, частота, температура) измеритель на 16F628А. LCF мерю через F, Программу для частоту скачал откуда-то с интернета и модифицировал. Получился хорошии прибор.
Про измерения частотъ:
Апаратная часть: Один вход RA4/TOCKI - на нем с мултиплексора подаются разнъе входъ (L,C,F)
Программная часть:
Начальное состояние RA4/TOCKI как вход
Три переменнъе TimerH;TimerM и TimerL
Старт измерения RA4/TOCKI = вход
Delay 0.25s минус время на прохождение программ итого 0,25с
TMR0 => ТimerM
переполнения TMR0 => ТimerH
Стоп измерения RA4/TOCKI = въход
Здесь ответ твоего вопроса. Начинаем дергат T0SE и следим за состояние TMR0. Если состояние TMR0 изменилось то ето означает что предделитель переполнился и пропустил импулс к TMR0. Если просчитали сколько раз дернул TOSE то инверсия етого числа и является содержание предделителя =>TimerL.
после досчета =>RA4/TOCKI = вход
Вот фрагмент досчета:
clrf TimerL
Cont
; incf TimerL, F ;оригиналното
decf TimerL, F
bsf STATUS, RP0
bsf OPTION_REG, T0SE ; Дочитане
nop
nop
bcf OPTION_REG, T0SE
bcf STATUS, RP0
nop
nop

movf TMR0, W
subwf TimerM, W ;това май е по правилното

btfsc STATUS, Z
goto Cont ;ако са равни -> продължи
btfsc INTCON, T0IF ;Последна проверка за препълване
incf TimerH, F
bcf INTCON, T0IF

bsf STATUS, RP0 ;след измерването T0CKI остава като изход
bsf TRISA,4 ; връщаме го на вход
bcf STATUS, RP0


Рад буду если помог чем то.

Re: AN592 Frequency Counter есть вопрос

Сб апр 18, 2015 21:06:17

Спасибо, вы используете немного другой способ: переключая фронт детектируемого сигнала битом T0SE, вызываете ложные срабатывания на входе предделителя. (элемент ИЛИ на входе)
А вот Микрочип похоже жестоко обманул своих пользователей...
Последний раз редактировалось DrLivsy Вс апр 19, 2015 07:56:58, всего редактировалось 1 раз.

Re: AN592 Frequency Counter есть вопрос

Сб апр 18, 2015 21:15:49

Мне кажется, что гдето в Microchip-е я читал про етот способ. Давно бъло. Но и идея с внешним въводом тоже будеть работат. Но, здесь у меня проблемъ. Не люблю тратить ног МК на пустяки.
DrLivsy писал(а):показывает свою собственную тактовую частоту 4МГц как 4.000660.

Здесь скорее время измерения не является въдержаннъм. Я так думаю.

Re: AN592 Frequency Counter есть вопрос

Вс апр 19, 2015 07:18:38

botchin писал(а):Мне кажется, что гдето в Microchip-е я читал про етот способ. Давно бъло. Но и идея с внешним въводом тоже будеть работат. Но, здесь у меня проблемъ. Не люблю тратить ног МК на пустяки.
DrLivsy писал(а):показывает свою собственную тактовую частоту 4МГц как 4.000660.

Здесь скорее время измерения не является въдержаннъм. Я так думаю.

Согласен.
Главный показатель точности частотомера с прямым отсчетом это точное время измерения. Надо будет сделать отдельный шлюз на восьминогом МК, и считать задержку строго по тактам процессора.

Re: AN592 Frequency Counter есть вопрос

Вс апр 19, 2015 07:30:06

DrLivsy писал(а):То есть, одна нога перекрывает шлюз для входного сигнала, а вторая генерирует импульсы досчета. Кто занимался, прокомментируйте, плз.
Не занимался, но прокомментирую. Там достаточно одной ноги, так как когда она работает как шлюз - она находится в высокоимпендансном состоянии - сконфигурирована как вход и на входной сигнал не влияет, а когда "досчитывает" то как выход и потому "давит" входной сигнал. Это решение было придумано 20 лет назад, когда ничего лучше чем pic16c84 у радиолюбителей не было. Сейчас такое решение не актуально - есть кристаллы с несколькими таймерами и функциями Gate.

Re: AN592 Frequency Counter есть вопрос

Вс апр 19, 2015 07:45:43

uldemir писал(а):
DrLivsy писал(а):То есть, одна нога перекрывает шлюз для входного сигнала, а вторая генерирует импульсы досчета. Кто занимался, прокомментируйте, плз.
Не занимался, но прокомментирую. Там достаточно одной ноги, так как когда она работает как шлюз - она находится в высокоимпендансном состоянии - сконфигурирована как вход и на входной сигнал не влияет, а когда "досчитывает" то как выход и потому "давит" входной сигнал. Это решение было придумано 20 лет назад, когда ничего лучше чем pic16c84 у радиолюбителей не было. Сейчас такое решение не актуально - есть кристаллы с несколькими таймерами и функциями Gate.

О! Теперь понял! :)
Вопрос закрыт:
1. Входной сигнал давится ногой, запрограммированной как выход, за счет резистора к47. То есть идет правильный досчет.
2. В собранном мной частотомере не выверено время измерения.
Большое спасибо.

Re: AN592 Frequency Counter есть вопрос

Чт авг 18, 2022 09:55:32

Более подходящей темы не нашел. Частотомер на PIC, вход: по timer0. C, CCS. Вопрос касается "метода досчета". С высоким прескалером (напр. 256) до сих пор много раз применял к старым типам: PIC16F628A, PIC16F648A, PIC16f1509 и другие типы - экспериментально. Все успешные, даже недавно очень положительные попытки из-за относительно високие частоты частотного предела входа (>150 MHz).

Сегодня на столе есть PIC16F18326. Сюрприз - по timer0 нет T0SE/16F648A, нет TMR0SE/16F1509 и аналогичные регистры для Timer0 Source Edge Select bit. T0SC(0-вой бит T0SC/5-ой бит T0CON1: T0SCIPPS/T0T0SCIPPS-inverted) никуда не делся (проверка никогда не выходит с переполнением -> то импульсы при изменении не поступают для досчета).

Есть ли другой способ для досчета (как TMR0SE)? (Aппаратно вкл. два вывода (по AN592) пока не работает по какой-то причине, почему-то прыгает частота). (частично пользуюсь переводчиком БГ->РУ)
Вложения
f1509_f18326.jpg
(139.56 KiB) Скачиваний: 80
Последний раз редактировалось veso74 Чт авг 18, 2022 12:44:09, всего редактировалось 1 раз.

Re: AN592 Frequency Counter есть вопрос

Чт авг 18, 2022 10:32:33

Переключиться на источник CLC1, а судя по блок-схеме этой конфигурируемой логической ячейки, либо дёргать её, либо сосчитать, сколько она дёрнулась вполне возможно

Re: AN592 Frequency Counter есть вопрос

Чт авг 18, 2022 12:59:09

Спасибо за направление, действительно не осталось другого блока для добавки импульсы / без внешней периферии/, кроме CLC. Вижу, что в CLC есть XOR (LCxPOL) /также для полярности фронта/. Попробую сначала проверить действие на аппаратный выход (LED). Но CLC для меня новинка, пока есть несколько попыток для усп. настройки :).
Вложения
f18326_clc.jpg
(77.68 KiB) Скачиваний: 70
Последний раз редактировалось veso74 Чт авг 18, 2022 13:22:03, всего редактировалось 1 раз.

Re: AN592 Frequency Counter есть вопрос

Чт авг 18, 2022 13:15:19

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

Re: AN592 Frequency Counter есть вопрос

Чт авг 18, 2022 14:03:52

Первый шаг успешно выполнен :): светодиод мигает с CLC, меняю LC1POL и выход меняется.
Код:
#bit LC1POL = 0xF11.7   // CLC1POL, bit 7

void main() {     
  setup_clc1(CLC_ENABLED | CLC_OUTPUT_INVERTED);
 
  while(TRUE) {
    LC1POL = 0;
    output_bit(PIN_C3, LC1OUT);
   
    delay_ms(1000);
   
    LC1POL = 1;
    output_bit(PIN_C3, LC1OUT);
   
    delay_ms(1000);
  }
}
Вложения
clc_led_01.zip
(688 байт) Скачиваний: 81

Re: AN592 Frequency Counter есть вопрос

Чт авг 18, 2022 15:16:02

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

Re: AN592 Frequency Counter есть вопрос

Чт авг 18, 2022 15:55:21

Возможно, что-то подобное происходит. t0_pre по-прежнему всегда равно нулю (как без досчета). Будем читать инфо ... :). Нет скуки.
Код:
t0_pre = 256;

T0CON1 |= 0b11100000;  // T0CS = 0b111 -> CLC1

uint8_t tmp = get_timer0();

while (tmp == get_timer0()) {
  LC1POL = 0;
  LC1POL = 1;
  t0_pre--;
}

T0CON1 &= 0b00011111; // T0CS = 0b000 -> T0CKIPPS (True)

freq = ((uint32_t)t0_hi * 256 + (uint32_t)t0_lo) * 256 + (uint32_t)t0_pre;  // prescaler = 256

---
На самом деле мне пришел в голову еще один вариант: с CLC сделать блокировка входа, как и генератор дополнительных импульсов (с доп. пин?), но превращается в аппаратное решение. И очень не нравится :).

Re: AN592 Frequency Counter есть вопрос

Сб авг 20, 2022 14:11:14

... если только вдруг какая-нить бяка не вылезет, типа автосброса значений при переключений входов ...

Написано в документации ... но как всегда: чтение позже :).
(T0CS<2:0> - часть T0CON1)
PIC16F18326, 26.3 Programmable Prescaler
... The prescaler is not directly readable or writable. Clearing the prescaler register can be done by writing to the TMR0L register, the T0CON0 register, or the T0CON1 register.

Re: AN592 Frequency Counter есть вопрос

Сб авг 20, 2022 15:28:34

Гадство! я сглазил :(
Тогда да - дёргать второй ногой... и мне тоже так не очень нравится.

Добавлено after 4 minutes 4 seconds:
хотя, разве у логической ячейки нет входа с ноги? то есть, сделать её изначально входом частотометра, а потом досчитывать полярностью?

Re: AN592 Frequency Counter есть вопрос

Сб авг 20, 2022 15:54:49

Да, как конструктор :), а и логические элементы в CLC - быстрые.
Только в CLC много конфигурации ... но интересно как логическая задача.
Последний раз редактировалось veso74 Сб авг 20, 2022 16:42:30, всего редактировалось 2 раз(а).

Re: AN592 Frequency Counter есть вопрос

Сб авг 20, 2022 16:39:33

а ещё можно попробовать маршрутизацию cигнала через PPS изменить, то есть, у таймера оставляем навсегда источником логическую ячейку, а в ячейке менять источник в PPS
но это идея наспех, я не вчитывался в способности PPS

Re: AN592 Frequency Counter есть вопрос

Сб авг 20, 2022 17:55:12

мелкий успешный шаг: CLC-повторитель: вход (PIN_C3) -> выход (PIN_C4)
4 x AND (1 вход: хардуерной CLC_INPUT_CLCIN0 (PIN_C3), 3 входа:лог 1)
(LC1POL жестко привязан к 1: The output of the logic cell is inverted)
Код:
#bit LC1POL = 0xF11.7

void main() {   
  LC1POL = 1;
 
  setup_clc1(CLC_ENABLED | CLC_OUTPUT_INVERTED | CLC_MODE_AND);
 
  clc1_setup_input(1, CLC_INPUT_CLCIN0);  // PIN_C3
 
  clc1_setup_gate(1, CLC_GATE_SET | CLC_GATE_NON_INVERTED_INPUT_1);
  clc1_setup_gate(2, CLC_GATE_SET);
  clc1_setup_gate(3, CLC_GATE_SET);
  clc1_setup_gate(4, CLC_GATE_SET);
 
  while(TRUE) {
   output_bit(PIN_C4, LC1OUT);
   delay_ms(100);
  }
}

---
... маршрутизацию cигнала через PPS изменить ...

Это интересно! :) Спасибо!
---
Как идея без PPS: при перенастройке один вход в 0 на входного ЛЕ 4И -> входной сигнал прекратится. Затем досчет с LC1POL.

Добавлено after 39 minutes 59 seconds:
На сл. шаге хотел бы попробовать, насколько быстро работает CLC-повторитель.

8,192 MHz на PIN_C3 посчитали успешно на частотомере (без досчета, монтаж на бредборде) ...
28,63636 MHz прошли успешно ...
с входным генератором посложнее стало: 50 ... 100 ... 150 ... 155,000000 MHz. Отлично!

Добавлено after 32 minutes 35 seconds:
Martian, считайте метод с CLC: рабочий :beer:.
Последний разряд начал мерцать с +4 Hz / 0 Hz (с prescaler 256, изм. период 1/4 сек)
Считаю задачу выполненной. Спасибо!
Код:
      t0_pre = 256;

      uint8_t tmp = get_timer0();
     
      clc1_setup_gate(1, CLC_GATE_SET | CLC_GATE_CLEAR);

      while (tmp == get_timer0()) {
        LC1POL = 0;
        LC1POL = 1;
        t0_pre--;
      }
     
      clc1_setup_gate(1, CLC_GATE_SET | CLC_GATE_NON_INVERTED_INPUT_1);

      freq = ((uint32_t)t0_hi * 256 + (uint32_t)t0_lo) * 256 + (uint32_t)t0_pre;  // prescaler = 256

Re: AN592 Frequency Counter есть вопрос

Сб авг 20, 2022 18:19:39

Отлично! Спасибо за проделанную работу!
Ответить