Программный шим

Программная реализация нескольких каналов ШИМ на микроконтроллере. Теория

Программный ШИМ

Для того, чтобы понять, каким образом можно реализовать несколько каналов ШИМ на одном контроллере, давайте сначала вспомним, — что вообще такое ШИМ и с чем это едят.

ШИМ расшифровывается как широтно-импульсная модуляция.

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

Таким образом, для одного канала ШИМ нам нужно знать правила, которыми определяется коэффициент заполнения (с этим проблем нет, мы их сами устанавливаем), и, кроме того, отсчитывать два момента времени от начала импульса: во-первых, сколько сигнал находится в состоянии высокого уровня и во-вторых, общее время импульса.

Отлично, значит всё, что нам нужно для реализации одного ШИМ — это два счётчика. Алгоритм получится такой: запускаем оба счётчика, переключаем выход в “1”. По прерыванию от первого счётчика (время высокого уровня) переключаем выход в “0”, выключаем счётчик и ждём прерывание от второго счётчика.

По прерыванию от второго счётчика (общее время импульса) — повторяем всё с начала.

Соответственно, для трёх каналов ШИМ нам нужно 3*2=6 счётчиков.

Но, допустим у PIC12F629, есть только 2 счётчика, что же делать? Во-первых, сделаем одинаковым общее время импульса для всех каналов ШИМ (пусть все три канала работают с одной частотой), это уже минус два счётчика. Осталось только отсчитывать время высокого уровня для каждого из каналов ШИМ. Итого, осталось 4 счётчика. Не намного, но легче.

Теперь давайте вспомним, что контроллер, это не аналоговая микросхема, а цифровая, и моменты времени он отсчитывает дискретно. Все три времени высокого уровня (для каждого из каналов ШИМ) будут кратны какому-то общему кванту времени.

Длительность этого кванта определяется разрядностью ШИМ и частотой импульсов.

В случае, когда все каналы работают на одной частоте и имеют одинаковую разрядность, этот квант времени будет равен: T1=1/(f*(2n-1)), где n-разрядность ШИМ, f — частота импульсов.

Если ШИМ 8-ми битный и работает на частоте 100 Гц, то длительность кванта равна (1/100)/(28-1)=39 мкс — общее время импульса (1/f), делённое на число возможных моментов переключения (2n) минус 1 (если на прямой поставить N точек, то они образуют N-1 интервалов).

То есть, нам достаточно одного аппаратного счётчика, который будет отсчитывать интервалы T1. Далее, создаем программный счётчик, который будет подсчитывать количество таких интервалов, и задаём четыре уставки.

Одна уставка определяет, — сколько нужно отсчётов программного счётчика чтобы отсчитать время высокого уровня для первого канала ШИМ, вторая — тоже самое для второго канала, третья — для третьего, четвертая соответствует общему времени импульса, а операции сравнения, переключения, увеличения или обнуления программного счётчика будем
делать по прерыванию от аппаратного счётчика.

Основной недостаток такого метода в том, что вместо (n+1) прерываний за период, мы будем обрабатывать (2n-1) прерываний.

Давайте прикинем, какой может быть максимальная частота ШИМ при такой реализации? Очевидно, что при максимальной частоте, времени у контроллера хватает только на обработку прерывания. То есть, весь квант времени Т1 контроллер занят обработкой прерывания, как только он выходит из прерывания — тут же происходит ещё одно.

Если обозначить максимальное число машинных циклов, за которое выполняется подпрограмма, Nmax — то, с учётом выражения для T1, получаем уравнение: Nmax*4/fosc=1/(fmax*(2n-1)). Отсюда, максимальная частота ШИМ: fmax=fosc/(4*Nmax*(2n-1)).

Естественно, полученная формула просто оценочная, потому что мы допускали, что подпрограмма занимает всё время T1, но если после выполнения подпрограммы останется время для выполнения 2-х, 3-х команд, то это в общем-то тоже не сильно нас устроит.

Что можно сделать в 3 команды? По нормальному, если мы хотим ещё что-то делать, например, обмениваться инфой с компом, то подсчитанное значение частоты нужно поделить ещё минимум вдвое.

От чего зависит максимальное время выполнения подпрограммы прерывания? Ну, во-первых конечно, от степени криворукости программиста, и во-вторых — от количества каналов ШИМ, которые мы хотим реализовать.

Для того, чтобы было понятно, о каких величинах идёт речь, рассчитаем конкретный пример: пусть контроллер работает на частоте fosc=4 МГц, мы написали подпрограмму, которая выполняется максимум за 40 машинных циклов и хотим получить разрядность ШИМ 8 бит.

Тогда максимальная частота ШИМ будет равна 4000000/(4*40*255)=98 Гц. Как видите, при таком способе реализации, всё достаточно ограничено, но для RGB хватит.

Между прочим, при 8-ми битах на цвет мы получим общее количество цветов, равное 28*28*28=16 млн и вообще стоит подумать — надо ли нам столько?

При разрядности 2 бита на канал и той же тактовой частоте можно получить максимальную частоту ШИМ, равную 4000000/(4*40*3)=8,3 кГц, при этом будет 22*22*22=64 различных сочетания коэффициентов заполнения (в случае с RGB это 64 цвета). Такую частоту уже можно юзать не только для RGB.

Ну вот, на этом с теорией всё.

Практическая реализация изложенного метода в программе управления RGB-светодиодом.

Источник: http://radiohlam.ru/?p=945

Программный ШИМ

Собрался я как-то сделать себе “утреннюю” подсветку дабы не столь лениво было просыпаться по утрам. Для начала была закуплена RGB лента с ИК контроллером в одном из китайских магазинов. Её ИК приёмник был прикручен к компьютерному передатчику и, посредством lirc начала будить меня по утрам, имитируя утро.

Но уж очень мне не нравилось, что нельзя нормально выставить яркость или хотя бы зажечь ленту с “запомненного” состояния — только встроенные яркости, которые слишком яркие. И, как на беду, валялась у меня на столе Arduino Nano и несколько полевых транзисторов из условно-бесплатных образцов.

“А почему-бы не попробовать?”, — подумалось мне…
Была сделана печатная плата с ИК приёмником, силовыми транзисторами, RS485 портом (а так, побаловаться и попробовать) и панелькой под Nano… Не буду расписывать эпопею с 485, библиотекой IRremote и прочим, а остановлюсь только на светодиодах.

Само собой, экспериментируя с Arduino, невозможно не воспользоваться её ШИМ функциями (analogWrite)… Вот тут меня поджидал первый сюрприз — отведённая мною для светодиода “нога” оказалась принудительно-необходима для IRremote.

Сам виноват — не изучил вопрос перед изготовлением платы… Ну да ладно, поменял “ногу”, домучил RS232/485 обмен и, наконец, подключил к плате светодиодную ленту вместо тестовых одиночных диодов.

(трагическая мелодия)

А они, заразы, моргают! Противненько так, подмаргивают… Таки пришлось разбираться, как же работает “железо”.

Выяснилось, что, мало того, что таймеры, отвечающие за ШИМ работают в разных режимах, так ещё и на разных частотах…

Далее начались поиски и эксперименты — благо, под рукой оказался одинокий микроконтроллер с макетной платой, avr-gcc и программатор… Были испробованы несколько версий BAM — вроде выгодно, не так часто надо дёргать прерывания, но так и не удалось добиться правильного и плавного перехода цветов на границах степени двойки (2, 4, 8, 16, 32…). И таки пришлось вернуться к традиционному программному ШИМу.

В итоге был получен нижеприведённый код. Как оказалось, он почти повторяет пример из AVR136. Исключение — способ вычисления управляющей маски.

Если сбрасывать маску “в ноль” по окончании PWM цикла, как предложено в примере, — моргает! Ну и экспериментально опробованы частоты ШИМа, когда мерцание не заметно. Как и предполагалось, они оказались ниже “стандартной” частоты ШИМ arduino.

Оптимальной выбрана частота примерно 163Гц, но рабочими оказались и другие частоты ниже 200Гц.

Итак, общие комментарии к коду:

  • Используется штатное прерывание ШИМ, отвязанное от аппаратных выводов
  • Фактически через настройки ШИМ запускается таймер по переполнению, а внутри обработчика прерывания считается “искусственный” ШИМ
  • У меня уже разведена плата и выходы оказались в разных портах контроллера, что привело к удвоению промежуточных переменных
  • Я использую много файлов в проекте Wiring, это один из таких файлов, а не кусок скетча. В скетч оно включается обычным #include 
  • У меня управление ведётся через внешние MOSFET-ы, потому сигнал получается инвертированным. Подключённые напрямую к “+” диоды будут гореть при яркости 0 и гаснуть при 255
Читайте также:  Солнечные модули

// file: pwm.h
#ifndef __PWM_H__
#define __PWM_H__ #include // User-changeable variables
volatile byte R_color;
volatile byte G_color;
volatile byte B_color;
volatile byte W_color; // PORTB
#define WPIN _BV(1)
#define RPIN _BV(2) // PORTD
#define GPIN _BV(5)
#define BPIN _BV(6) // RGBW buffer
volatile byte rgbw_buf[4]; ISR(TIMER1_COMPA_vect) { static byte _pwm_cntr=0; byte mask1 = 0; byte mask2 = 0; // reset every 256 cycles if (++_pwm_cntr == 0) { rgbw_buf[0] = R_color; rgbw_buf[1] = G_color; rgbw_buf[2] = B_color; rgbw_buf[3] = W_color; // from AppNote avr136. Flickers // mask1 = 0; // mask2 = 0; } // calc on/off state if (rgbw_buf[0]

Источник: http://avsnippets.blogspot.com/2012/10/blog-post.html

Особенности формирования шим сигналов в микропроцессорных системах управления

PECULIARITIES OF PWM SIGNALS FORMATION IN MICROPROCESSOR CONTROL SYSTEM

Andrei Makhanko

candidate of Science, assistant professor in Kazan National Research Technical University named after A.N. Tupolev-KAI,

Russia, Republic of Tatarstan, Kazan

АННОТАЦИЯ

В современных системах управления нашли широкое применение сигналы широтно-импульсной модуляции, но в отсутствии специальной аппаратуры на это требуется много машинного времени. В статье рассматривается алгоритм, позволяющий экономить машинное время при формировании ШИМ сигналов.

ABSTRACT

Modern control systems are widely used signals PWM, but in the absence of special equipment required too many computer time. The article discusses the algorithm allows saving machine time during the formation of the PWM signals.

Ключевые слова: широтно-импульсная модуляция, система управления, дискретные, аналоговые, сигналы, программное формирование.

Keywords: pulse-width modulation, control system, discrete, analog, signals, software formation.

При формировании аналоговых управляющих сигналов, часто используемых в современных системах управления [2], возникает проблема – для управления сильноточными нагрузками необходимо формировать мощный аналоговый сигнал.

Дополнительные сложности возникают из-за того, что большинство выпускаемых микроконтроллеров не имеют аналоговых выходов, что требует высокой квалификации специалистов [4] при проектировании систем на основе таких микроконтроллеров.

Вариантом формирования управляющего сигнала является использование цифро-аналоговых преобразователей (ЦАП) и пропорционального усилителя, но такая система крайне сложна и имеет низкий КПД, так как для пропорционального управления требуется промежуточные режимы работы усилителя – не желательные с точки зрения энергопотребления.

Альтернативой ЦАП является использование сигналов широтно-импульсной модуляции (ШИМ), которые сейчас широко используются в цифровых системах управления.

Они удобны тем, что могут вырабатываться дискретными системами и имеют только два уровня (активный – «1» и пассивный – «0»), но при этом могут без дополнительных преобразований подаваться на исполнительные устройства, требующие аналогового сигнала постоянного тока, а в качестве усилителей мощности могут использоваться дискретные ключи, обеспечивающие малое рассеивание мощности на управляющих элементах схемы.

Сигналы ШИМ особенно удобны для микроконтроллеров, так как позволяют объединить в одном корпусе вычислительное устройство и устройство формирования управляющего сигнала.

Для формирования управляющего ШИМ сигнала в составе некоторых типов микроконтроллеров предусматриваются специальные устройства. На рисунке 1 приведён пример схемы такого устройства, использованного в семействе микроконтроллеров PIC16 фирмы Microchip.

Рисунок 1. Устройство формирования ШИМ сигнала

Как правило, такое устройство имеет в составе регистр длительности импульса (CCPR) и таймер с ограничением периода переполнения (TMR2).

Функционирует такое устройство следующим образом: в регистр длительности импульса записывается число. На таймер заводятся сигналы системы синхронизации и тактирования контроллера.

При работе таймера пока значение, накопленное в таймере, меньше значения записанного в регистре на выходе устройства устанавливается единица. Когда число в таймере превышает значение в регистре, на выходе устанавливается ноль.

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

Значение регистра ограничения периода позволяет регулировать частоту импульсов.

Подобная аппаратура позволяет формировать ШИМ высокой частоты большого разрешения и практически не требует дополнительных вычислительных мощностей. Однако эта аппаратура существенно усложняет и удорожает контроллер, поэтому применяется недостаточно широко (например, в микроконтроллерах PIC16 используется не более двух независимых формирователей ШИМ).

Для того чтобы восполнить недостаток аппаратных средств формирования ШИМ, как правило, используется следующий алгоритм программного формирования ШИМ. (рисунок 2).

Каждый период ШИМ делится на кванты, отсчитываемые одним из аппаратных таймеров, который настраивается так, чтобы генерировать прерывания через определённые промежутки времени, соответствующие длительности одного кванта сигнала ШИМ. В памяти контроллера резервируются следующие ячейки памяти: два регистра для каждого канала ШИМ, и один регистр для отсчёта периода ШИМ.

Рисунок 2. Блок-схема алгоритма формирования ШИМ сигнала

В данном алгоритме используется явление переполнения разрядной сетки. При каждом прерывании таймера значение регистра периода ШИМ уменьшается на единицу (NN0=NN0-1).

Это приведёт к тому, что для восьмиразрядного процессора если исходное значение NN0 равно 0, то после вычитания получится 255, таким образом, происходит переполнение (рисунок 3).

Формирование сигнала ШИМ происходит следующим образом – в момент времени, когда NN0=0 происходит запись числа из буферного регистра (N1) в регистр счётчик (NN1), после чего на каждом прерывании происходит уменьшение регистра счётчика на единицу, до тех пор, пока он не станет равен нулю, после этого уменьшение прекращается. Пока значение регистра счётчика не равно нулю на выходе (OUT1) установлена единица, когда значение приравнивается нулю, на выходе устанавливается ноль. Этот алгоритм повторяется для каждого канала ШИМ.

Для реализации этого алгоритма необходимо, чтобы контроллер имел доступ к поразрядному управлению портами ввода-вывода. Управление частотой осуществляется настройкой периода прерывания таймера. Скважность импульсов равна отношению числа, записанного в буферный регистр и максимального числа при данной разрядной сетке (для восьмиразрядного контроллера это 255).

Рисунок 3. Временная диаграмма формирования ШИМ сигнала

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

Рассмотренный алгоритм использовался при проектировании системы управления колёсного погрузчика ПК-60.01Я [3]. В системе имелось 6 каналов управления, все были выполнены как ШИМ сигналы.

В качестве управляющего устройства использовался контроллер PIC18F8680 с тактовой частотой 16 МГц, частота ШИМ задана была 100 Гц. Для обеспечения заданной частоты ШИМ потребовалось задать длительность кванта ШИМ – 39,22 микросекунд (627 тактов генератора или 156 командных циклов).

Программа обслуживания одного канала содержала 11 операторов. Для сохранения состояния процессора и последующего его восстановления необходимо 14 операторов. Вся подпрограмма обслуживания ШИМ состояла из 80 (11*6 + 14) операторов, на выполнение которой требовалось 20 микросекунд.

Следовательно, на формирование ШИМ тратилось 20 мкС / 39,22 мкС = 51 % вычислительных возможностей контроллера.

Если бы требовалось обслуживать 12 каналов, процедура формирования ШИМ состояла бы из 146 операторов, занимала бы 36,5 микросекунд и забирала бы более 93 % времени контроллера. Это означает, что для выполнения остальных функций контроллера в системе управления не хватало бы времени.

Для решения этой проблемы можно было бы предложить поднять тактовую частоту, что сократит время исполнения подпрограммы, но контроллеры имеют ограничение максимальной тактовой частоты (например, для семейства PIC18 до 25 МГц).

К тому же, при повышении тактовой частоты увеличивается потребление энергии и нагрев контроллера.

Выходом из возникающего затруднения может стать предлагаемый новый экономичный алгоритм (рисунок 4).

Для использования этого алгоритма необходимо организовать массив, содержащий записи {Ni Mi}.

В этой записи Mi – маска, которая при выполнении операции «логическое И» с текущим состоянием порта обнуляет один или несколько разрядов порта, а Ni – число, характеризующее момент применения маски, то есть момент переключения очередного сигнала.

Кроме массива необходимо использовать счётчик времени (NN0) и указатель массива (i). Так же, как и в предыдущем алгоритме используется аппаратный таймер, который отсчитывает промежутки времени, соответствующие квантам сигнала ШИМ.

Читайте также:  Kicad

При каждом прерывании счетчик времени увеличивается на единицу. Период ШИМ сигнала соответствует переполнению счётчика (для восьмиразрядных систем 255). В начале цикла указатель массива устанавливается на начало массива, а текущее значение счётчика времени сравнивается с выбранным значением Ni.

Как только значение счётчика превышает Ni, производится операция «И» между текущим значением порта вывода, в котором должны быть сосредоточены сигналы ШИМ, формируемые этим алгоритмом, и маской Mi, в результате чего некоторые разряды порта вывода будут обнулены.

Так же в этот момент указатель «передвигается» на следующий элемент массива (i = i+1).

После завершения цикла ШИМ (NN0=0) производится анализ команд выданных основной программой (составляется новый массив {Ni Mi}).

Значения Ni сортируются по возрастанию и определяются маски Mi соответствующие каждому переключению. В начале нового цикла все каналы ШИМ устанавливаются в единицу.

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

Таким образом, частота ШИМ определяется периодом между прерываниями, заданным таймером. Скважность каждого импульса определяется соотношением соответствующего регистра Ni и максимального значения счётчика времени при данной разрядной сетке (для восьмиразрядных систем – 255).

Рисунок 4. Экономичный алгоритм формирования ШИМ сигнала

Для реализации такого метода необходимо чтобы порт вывода, используемый для формирования ШИМ, был доступен для операций считывания и модификации.

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

Например, при реализации системы управления длина программных ветвей процедуры обработки прерывания не превышает 16 операторов (при выполнении переключения сигнала 16 операторов, без выполнения переключения 12).

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

Для сравнения – рассмотренный выше алгоритм формирования 6 управляющих сигналов укладывается в 32 оператора (16 операторов – процедура формирования ШИМ и 16 операторов процедура входа и выхода из прерывания), что составляет всего 20,4 % времени контроллера. Это соотношение не меняется, независимо от количества каналов, до тех пор, пока количество каналов не превышает разрядности шины данных контроллера.

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

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

В этом случае процедура обслуживания прерывания составит 34 оператора, то есть потребует 21,675 % рабочего времени контроллера.

Использование дискретного по сути сигнала ШИМ позволяет существенно упростить аппаратную реализацию системы управления. В этом случае формирователи выходного сигнала представляют собой мощные транзисторные ключи.

Основное требование к выходным ключам для ШИМ сигналов – малое время переключения, а, следовательно, высокая частота коммутации. Это требование обусловлено необходимостью формировать короткие импульсы при малом уровне сигнала и короткие паузы при большом уровне сигнала.

При разработке блока управления «Омега-1» колёсного погрузчика ПК-60.01 использовались ключи на полевых транзисторах с частотой переключений до 6 МГц. Это позволило формировать сигналы большой точности.

В одном из вариантов системы использовался электрогидрораспределитель с двумя выходными каналам в каждой секции. Это позволило управлять шестью бустерами коробки передач (1, 2, 3, 4 передачи и бустеры переднего и заднего хода) с помощью трёх секций распределителя.

Однако это потребовало формирования выходного сигнала так, что диапазон от Uпит/2 до Uпит использовался как команда для одного канала управления, а от 0 до Uпит/2 для другого.

Это уменьшило разрешающую способность каждого из сигналов ШИМ в 2 раза, но этого оказалось достаточно для обеспечения требуемого уровня точности формирования управляющих сигналов.

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

Модифицированный блок «Омега-1» использовался в системе управления трансмиссией бульдозера-рыхлителя Т-40.01ЯБР. В этом случае высокое разрешение сигнала ШИМ позволило обеспечить плавность управления поворотом трактора.

https://www.youtube.com/watch?v=Xki0CD3uy0Y

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

При разработке системы управления трансмиссией бульдозера-рыхлителя Т-40.01КБР был использован микропроцессорный блок фирмы Sauer-Danfoss марки Plus1 MC 050-010, в котором используется система защиты выходных ключей от короткого замыкания в нагрузке. Это позволило существенно повысить надёжность системы.

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

Они имеют встроенную защиту от перегрузки и позволяют без дополнительных аппаратных затрат организовать обратную связь по току в нагрузке.

Это позволяет организовать управление током, а не напряжением в нагрузке, что важно при управлении электромагнитными устройствами, например, электромагнитами гидроклапанов.

Однако, интеллектуальные ключи имеют низкую частоту переключения, что затрудняет их использование для формирования сигналов ШИМ.

В данном случае возможно два решения.

В первом случае используется обычный полевой транзистор, который формирует ШИМ сигнал, а вместе с ним работает система защиты и измерения тока. Такая система получается громоздкой, сложной и дорогой.

Другим вариантом решения этой проблемы служит совместное использование транзисторного и интеллектуального ключа.

В этом случае ключи включаются последовательно, интеллектуальный ключ постоянно открыт, а формирование ШИМ выполняется транзисторным ключом.

Интеллектуальный ключ используется для защиты системы формирования сигнала аварии в канале управления и формирования сигнала обратной связи по току.

В результате получен алгоритм пригодный для формирования ШИМ сигналов в системах управления авиационными, автотракторными, корабельными устройствами и системами [1], а также применимый в других видах приборов и систем, в том числе в педагогике в наглядных пособиях [5].

Список литературы:

  1. Алпаров А.У., Благов А.Е., Дегтярев Г.Л., Маханько А.В., Маханько А.А., Руденко С.А., Харитонов А.Ю. Микропроцессорная система управления самоходной моделью тримарана. Вестник казанского государственного технического университета им. А.Н. Туполева, Казань, 2014. № 3.
  2. Благов А.Е., Земляков А.С. Синтез управления механическими системами на основе декомпозиции-агрегирования. Вестник Казанского государственного технического университета им. А.Н. Туполева. 2004. № 2.
  3. Дегтярёв Г.Л., Маханько А.А. Опыт применения микропроцессорных систем управления на тяжёлых транспортных машинах. Вестник казанского государственного технического университета им. А.Н. Туполева, Казань, 2007. № 1 (45).
  4. Морозов С.А., Соколова Г.П. Особенности создания системы дистанционного обучения. Математические методы в технике и технологиях – ММТТ. 2013. № 9-1 (59).
  5. Соколова Г.П. Использование информационных технологий при изучении графических дисциплин. Математические методы в технике и технологиях – ММТТ-21: сб.трудов XXI Международ. науч. конф. в 10 т. Т. 9. Саратов: изд-во Сарат. гос. техн. ун-та, 2008.

Источник: https://sibac.info/conf/tech/lix/57724

Программный ШИМ

12.06.2018

     Краткое описание: ШИМ широтно импульсная модуляция процесс управления мощностью, подводимой к нагрузке, путем изменения скважности импульсов, при постоянной частоте.

     Задача:Требуется написать с использованием библиотеки StdPeriph код. Программа должна изменять яркость свечения светодиода при нажатии на пользовательскую кнопку.

#include “stm32f30x.h”
#include “stm32f30x_gpio.h”
#include “stm32f30x_rcc.h”
#include “stm32f30x_exti.h”
#include “stm32f30x_syscfg.h”
#include “stm32f30x_misc.h”
#include “stm32f30x_tim.h”

#define TIMER_PRESCALER 800//Пределитель 
#define TIMER_PERIOD 10//Период

GPIO_InitTypeDef gpio;//Объявляем переменную gpio типа GPIO_InitTypeDef
TIM_TimeBaseInitTypeDef timer;//Объявляем переменную timer типа TIM_TimeBaseInitTypeDef

int PWM_PERIOD_COUNT;//Период ШИМ
int PWM_DUTY_CYCLE_COUNT;//Коэффициент заполнения ШИМ

void initAll()

     RCC_HSICmd(ENABLE);//Включаем тактирование от внутреннего источника
     RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//Подаем тактовый сигнал на системную шину
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);//Включаем тактирование порта С
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//Включаем тактирование таймера

     gpio.GPIO_Mode = GPIO_Mode_OUT;//Выбираем режим работы пина: ВЫХОД

     gpio.GPIO_Pin = GPIO_Pin_7;//Выбираем нужный пин 
     GPIO_Init(GPIOC, &gpio);//Инициализируем структуру с настройками

     gpio.GPIO_Mode = GPIO_Mode_IN;//Выбираем режим работы пинов

     gpio.GPIO_Pin = GPIO_Pin_0;//Выбираем нужны пин
     GPIO_Init(GPIOC, &gpio);//Инициализируем структуру с настройками

Читайте также:  Радиочастотные модули облегчают внедрение радио технологий во встроенные системы

     timer.TIM_Prescaler = TIMER_PRESCALER;//Устанавливаем пределитель 

     timer.TIM_Period = TIMER_PERIOD;//Устанавливаем период 
     TIM_TimeBaseInit(TIM4, &timer);//Инициализируем структуру с настройками
     TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//Настраиваем таймер для генерации прерывания по обновлению (переполнению)
     TIM_Cmd(TIM4, ENABLE);//Запускаем таймер 
}

int main()
{
     ok_enable_irq();//Разрешаем прерывания 
     initAll();//Вызываем функцию инициализации периферии
     NVIC_EnableIRQ(TIM4_IRQn);//Разрешаем прерывание по таймеру

     while(1)

     {

     } 

}

void TIM4_IRQHandler()//Функция обработчика прерываний таймера 

     TIM_ClearITPendingBit(TIM4, TIM_IT_Update);//Очищаем бит прерывания

     PWM_PERIOD_COUNT ++;//Увеличиваем значение счетчика периода ШИМ на 1

     PWM_DUTY_CYCLE_COUNT++;//Увеличиваем значение счетчика коэффициента заполнения ШИМ на 1

     if (PWM_PERIOD_COUNT == 12) 

     {
          PWM_PERIOD_COUNT=0;//Обнуляем счетчик периода ШИМ когда он досчитает до 12 миллисекунд
          PWM_DUTY_CYCLE_COUNT=0;//Обнуляем счетчик коэффициента заполнения
          GPIO_ResetBits(GPIOC, GPIO_Pin_7);//Выключаем диод 
     }
     if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) == 1) //Узнаем состояние входа PIN0, кнопка нажата или нет
     {
          if (PWM_DUTY_CYCLE_COUNT == 11)//Если кнопка нажата увеличиваем коэффициент заполнения ШИМ и зажигаем светодиод 
          {
               GPIO_SetBits(GPIOC, GPIO_Pin_7); 
          } 
     } 
     else 
     {
          if (PWM_DUTY_CYCLE_COUNT == 1)//Если кнопка не нажата уменьшаем коэффициент заполнения ШИМ и зажигаем светодиод 
          {
               GPIO_SetBits(GPIOC, GPIO_Pin_7); 
          } 
     }
}

     Скомпилируйте программу нажав кнопку Build, прошейте микроконтроллер, нажмите RESET. Зеленый светодиод должен светится в полную силу, при нажатии на кнопку светодиод начнет светится тусклее. 

     ВНИМАНИЕ: Приведенный листинг кода не является единственной и оптимальной реализацией поставленной задачи. Пример опубликован с демонстрационной целью. Также автор во избежание переписывания чужих статей, пропускает теоретические основы необходимые для понимания примера, связывая это с тем что всю необходимую информацию можно найти в интернете.

Источник: http://www.milbestore.ru/article/programmnyj-shim

Генерация звука через канал ШИМ в схемах на микроконтроллере

Известны следующие способы генерации звука в MK:

•                 формирование на выходе цифрового порта последовательности ВЫСОКИХ и НИЗКИХ уровней с программными паузами 0.2…10 мс между ними;

•                 смена ВЫСОКИХ/НИЗКИХ уровней на выходе порта в момент прерывания по таймеру MK. Время между прерываниями определяет частоту звука;

•                 использование 8…16 выходов MK, к которым подключается резистивная матрица ЦАП с организацией «2R» или «R-2R»;

•                 применение MK с уже встроенным каналом ЦАП;

•                 изменение частоты или скважности импульсов в канале ШИМ MK.

Первые два варианта — простые в аппаратной и программной реализации, но годятся для извлечения лишь неприхотливых «цифровых» звуков. Третий вариант обеспечивает достаточно качественное «аналоговое» звучание, хотя требует много свободных линий портов.

Четвёртый вариант поддерживается далеко не всеми типами МК , а только наиболее «продвинутыми», а стало быть дорогими.

Остаётся пятый вариант с ШИМ, который занимает промежуточное положение по критерию «качество + возможности» и положительно оценивается радиолюбителями.

Звуковые сигналы в канале ШИМ могут генерироваться по низкой частоте непосредственно выходными импульсами («цифровой» звук) или по высокой частоте с последующим выделением «музыкальной» огибающей («аналоговый» звук).

Интерес для практики представляет именно «аналоговое» звучание. В этом случае на выходе MK ставят фильтр с верхней частотой в районе 3400 Гц, что соответствует качеству телефонного разговора, или 20 кГц, что характерно для воспроизведения музыкального компакт-диска.

На Рис. 2.59, a…c приведены схемы генерации звука через канал ШИМ MK.

Рис. 2.59. Схемы генерации звука через канал ШИМ MK (начало):

а) пассивный двухзвенный ФНЧ на элементах R1, R2, C1, С2обеспечивает лучшее подавление гармоник, чем однозвенный ФНЧ, но с небольшим уменьшением амплитуды t/BbIX;

б) пассивный пятизвенный ФНЧ обеспечивает хорошую фильтрацию и высококачественное звучание, но со значительным уменьшением амплитуды на выходе;

в) укорачивающая цепочка С/, VD1 применяется при импульсах большой длительности;

г) заряд/разряд конденсатора C1 производится резисторами R1, R2 соответственно от ВЫСОКОГО/НИЗКОГО уровня на двух выходах MK. Цепочка R3, С2образует ФНЧ для суммарного сигнала ШИМ. Кодирование сигнала производится по системе RC-2, что годится для синтеза различных звуков и шумовых эффектов (речь и музыка здесь звучат неестественно); О

О Рис. 2.59. Схемы генерации звука через канал ШИМ MK (продолжение):

д) конденсатор C1 устраняет постоянную составляющую. Элементы R1, C1 фильтруют сигнал в канале ШИМ. Резистор R2 регулирует уровень звука в наушнике, который подключается кгнездуЛ37;

е) гальваническая опторазвязка звуковых сигналов, генерируемых с выхода MK через канал «высокочастотной» ШИМ. Фильтром служат элементы Л2, C1

ж) активный двухзвенный ФНЧ на элементах R1, C1, C2, R4, DA1. УНЧ на микросхеме DA2 может переходить в «спящий» и «беззвучный» режимы от ВЫСОКИХ уровней на среднем и нижнем выходах MK;

з) управляемый активный ФНЧ для звуковых сигналов, формируемых с верхнего выхода MK. Сигналами ШИМ на среднем и нижнем выходах MK изменяется частота среза фильтра; О

О Рис. 2.59. Схемы генерации звука через канал ШИМ MK (продолжение):

и)         выделение огибающей звукового сигнала пассивным ФНЧ на элементах R1, C1. Дополнительное подавление высших гармоник осуществляется в самом электродинамическом громкоговорителе BA1 (инерциядиффузора). Цепочка R4, C3 устраняет самовозбуждение УНЧ DA1 к) наличие джампера на соединителе S1 позволяет передавать на выход постоянную составляющую сигнала;

л) активный четырёхзвенный ФНЧ «Sallen-Кеу» («Саллен-Ки») на ОУ DA1 (возможная замена TL072) обеспечивает хорошее подавление высших гармоник.

Такие схемы применяют при синтезе электронной полифонической музыки, но при воспроизведении речи могут появиться искажения, связанные с возбуждением ОУ на фронтах ШИМ-сигнала.

Для их уменьшения желательно, чтобы микросхема DA1 имела по даташиту уровни «Rail-to-Rail Input/Output», т.е. она должна устойчиво работать с входными/выходными сигналами от нуля до питания; О

О Рис. 2.59. Схемы генерации звука через канал ШИМ MK (продолжение):

м) четырёхзвенный ФНЧ настроен на диапазон речевого телефонного сигнала 0.3…3.4 кГц и содержит четыре ДС-цепочки: R1 и C7; R3 и C3; R5 и C4 R2nC2. Между звеньями располагаются повторители напряжения на ОУ DA1.1, DA1.

2, что обеспечивает высокое качество фильтрации и отсутствие самовозбуждения. На элементе DA1.3 собран УНЧ с регулируемым коэффициентом усиления (R4).

Особенность схемы — примерно одинаковая громкость звучания как с низкоомным электродинамическим (40 Ом), так и с высокоомным пьезокерамическим (10 кОм) телефоном BF1

н) восьмизвенный ФНЧ на цифровом фильтре DA1 (фирма Maxim Integrated Products) обеспечивает подавление 2…6 гармоник звукового сигнала на 11…78 дБ. Идеально подходит для преобразования прямоугольных сигналов в синусоидальные в полосе частот 0.1 ГЦ…25 кГц.

Конденсатор C2 определяет частоту внутреннего тактового генератора микросхемы DA1 по формуле Fosc[KrU] = 33333/С2[пФ]. Частота среза ФНЧ будет в 100 раз ниже, чем Fosc.

При желании можно подавать тактовую частоту на DA1 от нижней линии MK (показано пунктиром) и создавать методом ШИМ «плавающий» ФНЧ для звуковых спецэффектов;

о) устойчивый активный четырёхзвенный ФНЧ на ОУ DA1 с двухполярным питанием;

О Рис. 2.59. Схемы генерации звука через канал ШИМ MK (окончание):

п)схема М.Вязаня. Двухканальный мостовой УНЧ на полевых транзисторах с выходной мощностью до 27 Вт с ФНЧ на LC-фильтре. Радиаторы для транзисторов VT1, VT2 не требуются, КПД 90%. Сигналы ШИМ должны быть строго противофазными и иметь частоту 100…200 кГц;

p) мостовой усилитель звука с противофазными ШИМ-сигналами и двухканальным драйвером на микросхеме DA1 фирмы Maxim Integrated Products;

с) два выхода MK используются для генерации стереосигнала. DA1 — двухканальный УНЧ.

Источник: Рюмик, С. М., 1000 и одна микроконтроллерная схема. Вып. 2 / С. М. Рюмик. — М.:ЛР Додэка-ХХ1, 2011. — 400 с.: ил. + CD. — (Серия «Программируемые системы»).

Источник: http://nauchebe.net/2014/03/generaciya-zvuka-cherez-kanal-shim-v-sxemax-na-mikrokontrollere/

Ссылка на основную публикацию
Adblock
detector