Как найти коэффициент заполнения ШИМ, используя входной захват?

У меня есть контроллер PIC18F, и он поддерживает периферийное устройство захвата ввода. Я так понимаю, его можно использовать для определения частоты входящего сигнала. Как можно получить коэффициент заполнения ШИМ из следующих деталей в техническом паспорте ? Есть ли способ сделать это?

> bit 3-0 
 CCPxM<3:0>: CCPx Module Mode Select bits 0000 =
> Capture/Compare/PWM disabled (resets CCPx module) 0001 = Reserved 0010
> = Compare mode, toggle output on match (CCPxIF bit is set) 0011 = Reserved 0100 =    
  Capture mode:
  every falling edge 0101 = 
  Capture mode:
> every rising edge 0110 = 
  Capture mode: every 4th rising edge 0111 =
> Capture mode: every 16th rising edge 1000 = Compare mode: initialize
> CCPx pin low; on compare match, force CCPx pin high (CCPxIF bit is
> set) 1001 = Compare mode: initialize CCPx pin high; on compare match,
> force CCPx pin low (CCPxIF bit is set) 1010 = Compare mode: generate
> software interrupt on compare match (CCPxIF bit is set, CCPx pin
> reflects I/O state) 1011 = Compare mode: Special Event Trigger; reset
> timer on CCPx match (CCPxIF bit is set) 11xx = PWM mode
> 

техпаспорт стр. 257. PIC18F46J53.

Есть ли способ рассчитать коэффициент полезного действия? Я верю, что из этого можно получить только частоту.

Ответы (2)

Насколько я понимаю, модуль CCP может захватывать либо нарастающий, либо спадающий фронт, но не оба одновременно.

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

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

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

That can't be done with just one module.На самом деле это можно сделать. Я сделал это недавно с PIC18. Вы должны установить модуль CCP на нарастающий фронт, дождаться прерывания и изменить режим на спадающий фронт и так далее.
@Majenko Большое спасибо. Я нашел аналогичный элемент в приложении модуля DSPIC CCP, обратите внимание на режим коэффициента заполнения (режим обнаружения краев)
@ m.Alin большое спасибо. Я попробую ваш метод.

Чтобы ответить на ваш вопрос о других методах, некоторые PICS имеют очень удобный таймер-гейт, который действует независимо от модуля CCP. Если вы можете использовать один из них, это ОЧЕНЬ удобно для этого расчета. Считайте, пока сигнал высокий, используя гейт, и получите свой период с помощью КПК.

Быстрый поиск показывает, что PIC18(L)F2X/4XK22 (ссылка на техпаспорт в формате pdf), похоже, имеет эту функцию (см. раздел 12)