пятница, 15 июля 2011 г.

Трансформаторный преобразователь напряжения

Транзисторный мост рассматриваемый, в предыдущих статьях, как схема для коммутации электродвигателя может использоваться как инвертор напряжения (преобразователь постоянного напряжения в переменное) если диагональные транзисторы включать поочерёдно с требуемой частотой. Используя трансформатор можно повысить или понизить это напряжение до требуемого уровня. Преобразованное напряжение можно выпрямить выпрямителем и получить преобразователь постоянного напряжения. Схема управления электродвигателем микроконтроллером дополнена транзисторами VT2, VT5, VT4, VT7 включенными как обратные диоды, в диагональ моста включена первичная обмотка повышающего напряжение трансформатора Т1. Схема представлена на рисунке 1.

Схема преобразователя
Рисунок 1 - Схема преобразователя

Первичная обмотка w1 содержит около 21 витков алюминиевым проводом, вторичная w2 около 400 витков тонким медным проводом, сердечник использован от трансформатора строчной развёртки ТВС-110П3.

Напряжение на первичной обмотке составляло примерно 1.5 В.
Из за повышенной частоты видно что светодиоды светятся непрерывно, в принципе в этих светодиодах нет необходимости.

Напряжение на вторичной обмотке около 31В.

Действующее напряжение трансформатор повышает примерно в 20 раз.
Программа для управления электродвигателем микроконтроллером дополнена кодом для преобразователя напряжения. При нажатии на кнопку SB1 подключенную к четвёртому биту порта C срабатывает старый код который можно убрать. В коде для работы преобразователя напряжения, в отличии от кода для управления двигателем, используется функция _delay_us для  создания задержки в микросекундах.

Ниже приведен исходный код программы на языке C++ для микроконтроллера:

   #include <avr/io.h>
   #include <avr/delay.h>
   #define F_CPU 8000000UL  // 8 MHz

   int main(void)              // начало основой программы
   {
DDRD = 0xff;            /* все выводы порта D сконфигурировать как выходы */
DDRC = 0x00;      //выводы порта С сконфигурировать как входы
 
PORTC = 0xff; // установить "1" на всех выводах порта C,                       
                                        //включаем подтягивающие резисторы
 
while (1)          // Бесконечный цикл
{  
if (!(PINC & (1<<PINC4)))
{
DDRD |= 1<<1;
DDRD |= 1<<2;
_delay_ms(250);   // Ждем 250*8 мсек.
DDRD &= ~(1<<1);
DDRD &= ~(1<<2);
 
_delay_ms(250);   // Ждем 250*8 мсек.
DDRD |= 1<<0;
DDRD |= 1<<3;
_delay_ms(250);   // Ждем 250*8 мсек.
DDRD &= ~(1<<0);
DDRD &= ~(1<<3);
_delay_ms(500);   // Ждем 500*8 мсек.
}
else
{
DDRD &= ~(1<<0);
DDRD &= ~(1<<3);
DDRD |= 1<<1;
DDRD |= 1<<2;
_delay_us(5);   // Ждем 5*8 мксек.
DDRD &= ~(1<<1);
DDRD &= ~(1<<2);
DDRD |= 1<<0;
DDRD |= 1<<3;
_delay_us(5);   // Ждем 5*8 мксек.
}
}
   }      // закрывающая скобка основной программы

Исходный код компилировался в среде WinAVR, hex файл прошивался в микроконтроллер с помощью программы ponyprog2000.

2 комментария:

  1. Такие вещи на delay реализовывать как минимум нелогично. Есть таймеры для этого и аппаратный ШИМ. Чтобы получать асинхронных ШИМ, есть специальные регистры режимов работы.

    ОтветитьУдалить
    Ответы
    1. Согласен! Но делал я это давно и мало тогда знал о микроконтроллерах и лень было копаться в документациях на непонятном, по большей части, мне языке. С delay всё получилось быстро и просто. К тому же аппаратные таймеры и ШИМы есть не во всех микроконтроллерах а delay можно сделать на любом.

      Удалить