Обсуждаем контроллеры компании Atmel.
Ответить

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

Пн окт 23, 2017 10:24:06

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

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

Пн окт 23, 2017 10:32:47

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

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

Пн окт 23, 2017 12:18:24

но не могу найти как обрабатывается шим на входе в МК


Поищите примеры использования возможности аппаратного захвата значения таймера (timer input capture) для измерения коэффициента заполнения входного сигнала.

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

Пн окт 23, 2017 12:23:17

YS писал(а): возможности аппаратного захвата значения таймера
отсутствуют как класс
karaseg писал(а):на базе attiny13

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

Пн окт 23, 2017 12:35:53

И опять ни слова о требованиях. Одно только поверхностное объяснение хотелки, в двух словах.
Где максимальное отклонение входной частоты от 100 Гц ? Где необходимая точность и разрешение измерения скважности ? Где максимальное время реакции на изменение этой скважности ? Где всё, Карл ???

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

Пн окт 23, 2017 13:40:14

отсутствуют как класс


Обалдеть, а ведь в ATtiny13 и правда нет input capture... :shock:

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

Пн окт 23, 2017 13:52:20

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

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

Пн окт 23, 2017 14:13:37

Ну значит подойдёт вариант, предложенный ARV'ом - RC-цепь и подаём на АЦП.

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

Пн окт 23, 2017 15:17:35

либо ATTINY2313 использовать, вроде бы у этого МК есть, необходимый для этого вывод ICP

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

Пн окт 23, 2017 15:22:25

Можно так. Частота работы 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

либо ATTINY2313 использовать, вроде бы у этого МК есть, необходимый для этого вывод ICP

с достаточной для ваших нужд (судя по описанию) точностью измерять ШИМ можно и 13-й тинькой просто обрабатывая прерывание PCINT и считая таймером время

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

Вт окт 24, 2017 13:54:27

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

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

Сб авг 06, 2022 23:46:10

Хоть и спустя долгий период опишу что получилось... :) может кому пригодится
В итоге всё сделал через вывод 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;
...
}

Ответить