Страница 1 из 1

Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 10:24:06
karaseg
Подскажите как преобразовать сигнал шим генерируемый источником, частотой 100 Гц в шим ~30 кГц, с инвертирующим пропорциональным изменением % заполнения т.е. на входе 10% заполнения - на выходе 90%, на вход 40% на выходе 60%, на входе 70% на выходе 30% и т.д.
Хочу попробовать реализовать это на базе attiny13, но в инете есть куча примеров по генерации шима, но не могу найти как обрабатывается шим на входе в МК

Re: Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 10:32:47
ARV
На входной шим RC-фильтр, с него на АЦП контроллера, ну а потом по результату АЦП уже ШИМить на выход.
Собственно, 100 Гц ШИМ, как мне кажется, с приемлемой точностью можно измерить и по прерываниям Pin Change Interrupt...

Re: Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 12:18:24
YS
но не могу найти как обрабатывается шим на входе в МК
Поищите примеры использования возможности аппаратного захвата значения таймера (timer input capture) для измерения коэффициента заполнения входного сигнала.

Re: Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 12:23:17
ARV
YS писал(а): возможности аппаратного захвата значения таймера
отсутствуют как класс
karaseg писал(а):на базе attiny13

Re: Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 12:35:53
Аlex
И опять ни слова о требованиях. Одно только поверхностное объяснение хотелки, в двух словах.
Где максимальное отклонение входной частоты от 100 Гц ? Где необходимая точность и разрешение измерения скважности ? Где максимальное время реакции на изменение этой скважности ? Где всё, Карл ???

Re: Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 13:40:14
YS
отсутствуют как класс
Обалдеть, а ведь в ATtiny13 и правда нет input capture... :shock:

Re: Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 13:52:20
karaseg
Меня интересовало направление копания, без конкретизации схемных решений. Частота подразумевается стабильная, получаемая с другого МК, время реакции изменения выходного сигнала относительно входного не имеет принципиального значения, пусть будет +5 секунд край, разрешение так же не сильно важно, пусть будет нарастать % заполнения десятками от 0 до 100 на частоте 30 кГц

Re: Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 14:13:37
Аlex
Ну значит подойдёт вариант, предложенный ARV'ом - RC-цепь и подаём на АЦП.

Re: Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 15:17:35
karaseg
либо ATTINY2313 использовать, вроде бы у этого МК есть, необходимый для этого вывод ICP

Re: Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 15:22:25
akl
Можно так. Частота работы 4,8 МГц. Настроить Т0 на Fast PWM 7, OCR0A=160-1, разрешить прерывание от OCR0A, по которому наращивать счетчик длительности ШИМ частоты 100Гц. Дискрет отсчета 33,(3)мкс, т.е. каждые 3 отсчета будут давать длительность 100мкс или 1% PWM 100Гц. По таблице значение счетчика преобразовать в значения PWM 30кГц и загнать его в OCR0B.

Re: Преобразователь Шим в Шим

Добавлено: Пн окт 23, 2017 15:24:14
ARV
[uquote="karaseg",url="/forum/viewtopic.php?p=3213694#p3213694"]либо ATTINY2313 использовать, вроде бы у этого МК есть, необходимый для этого вывод ICP[/uquote]
с достаточной для ваших нужд (судя по описанию) точностью измерять ШИМ можно и 13-й тинькой просто обрабатывая прерывание PCINT и считая таймером время

Re: Преобразователь Шим в Шим

Добавлено: Вт окт 24, 2017 13:54:27
philosoraptor
Делал эмулятор егр на Тиньке-13. Для измерения скважности использовал счетчик между двумя прерываниями (верх — низ, или наоборот), фронт определял по логическому состоянию пина сразу после прерывания. Дальше считаем % и по нему генерим наш ШИМ. Ничего особо сложного, еще 30% свободного флеша в Тиньке осталось.

Re: Преобразователь Шим в Шим

Добавлено: Сб авг 06, 2022 23:46:10
karaseg
Хоть и спустя долгий период опишу что получилось... :) может кому пригодится
В итоге всё сделал через вывод ICP на МК ATTINY2313

В этом режиме, по изменению логического уровня на ножке ICP (по фронту или по спаду), делается копия данных из регистра счетчика TCNT в регистр ICR1.
А затем вызывается прерывание (TIMER1_CAPT_vect), если произошел "захват", по установленному условию (фронт/спад), в прерывании подпрограммой обрабатываются значения счетчика. Зная значения счетчика между двумя фронтами, можно высчитать частоту сигнала, и затем зная значение счетчика между двумя фронтами и между фронтом и спадом можно высчитать % заполнения. В подпрограмме прерывания, можно перенастраивать "режим захвата", с фронта на спад, тем самым манипулировать значением того что пытаемся получить, частоту или заполнение (два фронта или фронт и спад соответственно).

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

// Настройка режима счетчика TCCR1B
/*
Bit 7 – ICNC1: Input Capture Noise Canceler. Установка этого бита в лог. 1 активирует входной подавитель шума,
при этом будет фильтроваться входной сигнал Input Capture Pin (ICP1). Функция фильтрации требует 4 последовательных
одинаковых значений, поступивших на вывод ICP1, чтобы было зарегистрировано изменение уровня сигнала. Таким образом,
захват входных импульсов (Input Capture) будет задержан на 4 такта генератора микроконтроллера, когда возможность фильтрации разрешена.
---
Bit 6 – ICES1: Input Capture Edge Select. Этот бит выбирает тип среза (фронт или спад) на входе ICP1, который вызовет событие захвата импульса.
Когда в ICES1 записан лог. 0, то спад (отрицательный срез) вызовет срабатывание триггера, и когда в ICES1 записан лог. 1, срабатывание
триггера вызовет уже фронт (положительный срез) сигнала.
---
Bit 4:3 - WGM13 : WGM12: Выбор режима timer1. These bits are used for mode selection like Normal mode, PWM mode, CTC mode, etc.
here we will select normal mode, so set these bits to zero.


Когда срабатывает триггер захвата события по входу в соответствии с установкой ICES1, значение счетчика (TCNT1, регистры TCNT1H и TCNT1L) копируется
в регистр захвата Input Capture Register (ICR1). Событие также вызовет установку флага Input Capture Flag (ICF1), и это может использоваться
для срабатывания прерывания Input Capture Interrupt, если оно разрешено.
---
Bit 2:0 – CS12:10: Clock Select. Эти 3 бита задают источник тактового сигнала для счетчика.
===============
CS12 	CS11 	CS10 	Описание
===============
0 	0 	0 	Источник тактов не задан (таймер/счетчик остановлен).
0 	0 	1 	clkI/O (без делителя частоты)
0 	1 	0 	clkI/O / 8 (с выхода делителя)
0 	1 	1 	clkI/O / 64 (с выхода делителя)
1 	0 	0 	clkI/O / 256 (с выхода делителя)
1 	0 	1 	clkI/O / 1024 (с выхода делителя)
1 	1 	0 	Внешний тактовый сигнал, поданный на вход T1. Тактирование происходит по срезу (спаду) уровня сигнала.
1 	1 	1 	Внешний тактовый сигнал, поданный на вход T1. Тактирование происходит по фронту (нарастанию) уровня сигнала.
*/

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

// Настраиваем счетчик на фронт (бит 6 счетчика TCCR1B в 1), режим Normal (Table 46. Waveform Generation Mode Bit Description из даташита на 2313)
	TCCR1A = 0b00000000;
	TCCR1B = 0b01000100;

затем при срабатывании захвата сигнала на ICP, срабатывает прерывание, в котором уже делается, что нужно:

ISR (TIMER1_CAPT_vect)
{
    t = ICR1;
...
}