Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 38. Использование ШИМ. Подключение полевых транзисторов.

Киселев Роман, Июнь 2007
Статья обновлена 26 Мая 2014

Файлы к статье скачать


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


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

На диаграмме показана зависимость напряжения на нагрузке от времени. Закрашенное серым - это область, когда управляемый с помощью ШИМ прибор был включен. Выделяемую энергию можно считать пропорциональной площади этой области. Отношение периода повторения импульсов (T) к их длительности (AC) называется скважностью. Величина, обратная скважности, называется коэффициентом заполнения. Судя по диаграмме, скважность наиболее велика в середине диаграммы. Значит, на этом участке на нагрузке выделялось наименьшее количество энергии в единицу времени. Надеюсь, с этим все понятно. Но возникает вопрос: а чем же так хороша ШИМ? Почему бы не использовать для регулировки мощности устройство, способное менять сопротивление (переменный резистор или транзистор)? Рассмотрим две, казалось бы, эквивалентные схемы.

Если менять сопротивление резистора, как показано на графике в центре, а на ключевой элемент правой схемы подавать ШИМ-последовательность, изображенную на диаграмме, то лампочки будут в любой момент времени светить одинаково (UL - напряжение на лампочке). Но в правой схеме энергия будет выделяться только в лампочке, а в левой - и в лампочке, и в резисторе (или транзисторе, которым можно с успехом его заменить). Резистор будет разогреваться, и, возможно, не хуже лампочки. Поэтому на вопрос, какая схема рациональнее, я думаю, любой ответит, что правая. Она называется импульсной, а левая схема - линейной. Когда работают с мощной сильноточной электроникой, всегда отдают предпочтение именно импульсным элементам и способам. Линейные применяются лишь там, где управляют малыми мощностями и слабыми токами. К тому же, в цифровой электронике, где существуют лишь два состояния - "включено" и "выключено", ШИМ реализовать намного легче. Чем мы и займемся в этой статье.

Для этого нам понадобится совсем немного - полевой транзистор, который и будет работать у нас в качестве ключа (в ключевом режиме). Полевой транзистор предпочтительней потому, что его затвор изолирован от силовой схемы и управление производится электрическим полем, а ток управления достигает микроампер. Это позволяет, используя один-два транзистора, управлять с их помощью нагрузкой огромной мощности (до десятков ампер и десятков-сотен вольт), не нагружая МК. Замечательные мощные и недорогие (10 - 30 руб) транзисторы производит фирма International Rectifier. Они имеют название IRFxxxx, где xxxx - трех или четырехзначный номер. Я использовал в своей макетной плате IRF7311. Подойдут также и другие подобные ему: IRF7341, IRF7103 IRF7301, IRF7343, IRF7401, IRF7403, IRF7413... Эти транзисторы управляются логическим уровнем +5 В, т. е. нашего МК будет достаточно, чтобы полностью их открыть. Они, в свою очередь, могут управлять напряжением от 20 В (все) до 50 В (IRF7103, IRF7341) и через них можно будет открывать и закрывать более мощные транзисторы с достаточно высоким управляющим напряжением, например, IRF530. Таким образом, возможно собрать очень мощный быстродействующий каскад на полевых транзисторах, способный с помощью ШИМ плавно менять мощность на нагрузке, коммутируя токи в десятки ампер. Учитывая также тот факт, что полевые транзисторы можно соединять параллельно (в отличие от биполярных), возможно получить еще более мощный каскад на сотни ампер.

Итак, предположим, Вы решили купить IRF7311. Если открыть его Datasheet (есть в файлах к статье), то выясняется следующее: это махонькая микросхема в корпусе SO-8, внутри которой располагаются два полевых транзистора с индуцированным каналом N-типа и встроенными диодами Шоттки. Это означает, что для открывания транзистора надо подать на затвор G (Gate - "ворота, шлюз") управляющее напряжение +5 В по отношению к истоку S (Source - "источник"). Тогда, если было приложено коммутируемое напряжение "плюсом" к стоку D (Drain - "сток") и "минусом" к истоку, то потечет достаточно сильный ток (до 6 А) от D к S. Наличие диода Шоттки позволяет, не боясь ЭДС самоиндукции, применять эти транзисторы для управления электромоторами. Ниже приведу цоколевку транзистора и его внешний вид:

Сверху на корпусе в углу должна быть точка, такая же, как на рисунке. Она стоит рядом с "ножкой" 1. Кстати, у всех микросхем "ножки" нумеруются начиная от подобной метки против часовой стрелки, если смотреть сверху - а то вдруг кто не знает... Если Вы купили полевой транзистор с P-каналом - ничего страшного. Тогда Вам придется подать "минус" на G (относительно S) для включения и поменять полярность нагрузки. То есть для любого полевого транзистора с индуцированным затвором нужно подавать ток против стрелочки, расположенной между затвором и диодом, а нагрузку подключать так, чтобы ток через нее тек в направлении, обратном встроенному диоду. Вот и все.

Прицепим теперь наш транзистор IRF7311 затвором к 21 "ножке" МК (PD7, OC2) и истоком к "земле". К его стоку подключим "плюс" внешнего источника питания (до 20 В), а между его "минусом" и истоком подключим нагрузку, например, лампочку или электромоторчик постоянного тока.

Когда я все собрал, получилось вот так (хоть проводов и не видно, но лампочка подключена):

Осталось только разобраться, как МК реализует ШИМ и написать программу. Как уже говорилось ранее, в нашем МК есть 3 таймера, и все они могут работать в ШИМ-режиме. Таймер1 является самым навороченным и может выводить ШИМ сразу на двух выводах МК. Но мы не будем вдаваться в ненужные нам пока подробности и сложности и рассмотрим работу с ШИМ на примере таймера2.

Существуют два режима работы таймера в качестве ШИМ-модулятора. Это Fast PWM (быстрая ШИМ) и Phase correct PWM (ШИМ с фазовой коррекцией). Рассмотрим оба режима на следующих диаграммах:

Режим работы определяется содержимым битов WGM (Waveform Generation Mode) в регистре TCCR2. В Datasheetе написано, что для ШИМ с фазовой коррекцией нужно установить в единицу WGM20, а для быстрой ШИМ WGM20 и WGM21. Чем же отличаются эти режимы? В быстром режиме меняется состояние "ножки" OC2 в моменты совпадения счетного регистра TCNT2 и регистра сравнения OCR2 (зеленая стрелка), а также в момент сброса таймера (синяя стрелка).При этом серединка импульса (оранжевая) как бы смещается влево, меняется фаза импульса. В режиме фазовой коррекции такого явления не наблюдается. В этом режиме таймер, досчитав до максимума (до 255), начинает счет в другую сторону. В моменты совпадения регистров TCNT2 и OCR2 меняется состояние ножки OC2. При этом серединка импульса никуда не смещается. Этот режим имеет в два раза меньшую частоту, чем быстрый, но изготовитель утверждает, что он лучше подходит для управления электромоторами (скорее всего, шаговыми). Быстрый режим можно использовать в любых других случаях. Все остальные таймеры работают в ШИМ-режиме аналогично, таймер1 позволяет также менять период ШИМ произвольным образом, но, думаю, нам это ни к чему.

С теорией вроде бы теперь все понятно. Откроем IAR, создадим новый проект, наберем следующий код:

#include "iom16.h"

unsigned char pwm = 1;
unsigned char inc = 1; // inc = 0 - уменьшать, inc = 1 - увеличивать яркость

void timer2_init()
{
  OCR2 = 1; //ШИМ почти выключена
  // Быстрая ШИМ, переключать OC2 (PD7), увеличение таймера каждые 64 такта
  TCCR2 |= (1 << WGM20) | ( 1 << WGM21) | (1 << COM21) | (1 << CS22);
}

void timer1_init()
{
  OCR1A = 43200; //Прерывание 32 раза в секунду
  TCCR1A = 0;
  // СТС режим, увеличение таймера каждые 8 тактов
  TCCR1B |= (1 << WGM12) | (1 << CS11);
  // Прерывание по совпадению А таймера1
  TIMSK |= (1 << OCIE1A);
  SREG |= (1 << 7); //Разрешить прерывания
}

void io_init() //Инициализация портов ввода-вывода
{
  DDRD = (1 << PD7);
  PORTD = 0;
}

void main ()
{
  timer2_init();
  timer1_init();
  io_init();
  while(1)
  {
  }
}

// Заставляет лампу плавно загораться и гаснуть раз в 8 секунд
#pragma vector = TIMER1_COMPA_vect 
__interrupt void PWM_change()
{
  if (inc == 1) 
  {
    if (pwm < 254)
    {
      pwm++;  // Увеличиваем яркость лампы, пока не достигнем максимума
      OCR2 = pwm;
    }
    else
    {
      inc = 0;
    }
  }
  else
  {
    if (pwm > 1)
    {
      pwm--;  // Уменьшаем яркость лампы, пока не остигнем минимума
      OCR2 = pwm;
    }
    else
    {
      inc = 1;
    }
  }
}

Функция timer2_init() используется нами для включения таймера в ШИМ-режиме. Таймер будет увеличивать счетный регистр каждые 64 такта, работать в режиме Fast PWM, меняя состояние ОС2 неинвертированным образом (биты СОМ20, СОМ21). Да, забыл сказать. Эти биты отвечают за поведение "ножки" ОС2, к которой подключен транзистор. Режим может быть инвертированным и неинвертированным. Чтобы это понять, посмотрите на диаграмму выше. Там приведен график состояния ОС2 (неинвертированный выход) и ОС2 с чертой (инвертированный выход). Если оба бита установлены в 1, то режим будет инвертированным. При работе с ШИМ и использовании транзисторов есть одна ловушка: не все транзисторы могут очень быстро менять свое состояние. Для одних могут потребоваться десятки-сотни наносекунд (как для нашего), для других - микросекунды и десятки микросекунд. Поэтому не советую, не изучив документацию на транзистор, использовать его на высокой частоте - большая нагрузка при высокой частоте ШИМ может его сжечь.

timer1_init() включает таймер2 и заставляет его делать 32 прерывания в секунду. Когда происходит прерывание, меняется OCR2 регистр и, соответственно, яркость лампы. Таким образом, лампа будет плавно загораться и плавно гаснуть раз в 8 секунд. Можно вместо таймера подключить кнопки и менять яркость при их нажатии. Но у нас для наглядности все будет происходить автоматически.

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

Выбираем Release, нажимаем F7, программа компилируется. Запускаем AVReal, прошиваем МК. Кстати, возможно, у Вас возникал вопрос: а бесконечное ли число раз можно перепрошивать МК? Оказывается, нет. Всего лишь 10000 раз (как минимум). Поэтому, думаю, об этом совершенно не стоит беспокоиться. После того, как все это сделали, можно проверять устройство.

ВАЖНО!!! Сначала нужно подать питание на МК, убедиться, что транзистор подсоединен к МК, и лишь затем подавать питание в цепь с лампой (мотором) и полевым транзистором. Иначе можете сжеть транзистор. Дело в том, что в выключенном состоянии "ножки" МК "болтаются в воздухе" - они ни к чему не подключены, и на них возникают наводки. Этих слабеньких наводок достаточно, чтобы частично открыть очень чувствительный полевой транзистор. Тогда его сопротивление между стоком и истоком упадет от нескольких МОм до нескольких Ом или долей Ом и через него потечет большой ток к лампе. Но транзистор не откроется полностью, т. к. для этого нужно подать на затвор не 1-3 В наводки, а стабильные 5 В, и его сопротивление будет намного больше минимального (для IRF7311 это 0,029 Ом). Это приведет к выделению на нем большого количества тепла, и он задымится, а может, и сгорит. Хотя, конечно, все зависит от мощности лампы или мотора.

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

Можно вместо нашей схемы с транзистором и лампой просто подключить светодиод к выводу OC2. Он будет плавно менять свою яркость. Но это, конечно, уже не так интересно.



© Киселев Роман
Июнь 2007
http://www.kernelchip.ru



© KERNELCHIP 2006 - 2023