Почти год назад я написал статью о постройке самодельного твёрдотельного лазера. В той статье я упомянул, что для питания ламп накачки твёрдотельных лазеров часто применяется блок питания с дежурной дугой. О том, что это такое, как это сделать и какие преимущества получит лазер от этой дуги и будет рассказано ниже.
Под катом высокое напряжение, много картинок, схемы и видео работы твёрдотельного неодимового импульсного лазера в частотном режиме с факелами пламени, искрами от стали и хлопьями сажи от пластика. :)
Итак, зачем же вообще нужна дежурная дуга в лампе накачки лазера? На то есть несколько причин. Во-первых, при использовании дуги понижается доля ультрафиолета в спектре лампы накачки и увеличивается отдача лампы в более длинноволновом диапазоне. А это очень хорошо для граната и рубина. Во-вторых, дуга снижает нагрузку на лампу в момент вспышки. А в-третьих, лампа с дугой очень хорошо подходит для частотного режима работы лазера (вплоть до нескольких десятков вспышек в секунду). Из недостатков — лампу с дугой внутри надо охлаждать. Тут уже просто так пыхать без охлаждения не удастся.
Для охлаждения лазера я приобрёл на алиэкспресс помпу на 24 В (у меня блок питания выдаёт 24 В), расширительный бачок от ВАЗ 2101 и несколько сантехнических шлангов гибкой подводки (изначально я использовал садовый шланг, но уж очень он гибкий и легко передавливается). В бачок я залил дистиллированную воду из ближайшего автомагазина. В воду было бы неплохо добавлять 0.2% бихромата или хромата калия для ещё большего снижения доли ультрафиолета в спектре лампы, и для того, чтобы вода в квантроне не зацвела. Однако, эти соединения ядовиты и канцерогенны, а потому от их добавления я пока воздержался.
Помпа для системы охлаждения
Герметизация активного элемента осуществляется вклейкой в держатели обычным силиконовым герметиком.
Собранный контур охлаждения очень любит протекать в самых неожиданных местах. :)
В моём контуре охлаждения пока отсутствует радиатор. Но вообще-то он нужен. Вода в процессе работы лазера довольно быстро нагревается. Также советуют сразу после помпы поставить сетчатый фильтр, чтобы не забить квантрон какой-либо грязью, например, от внезапно развалившейся помпы (всякое бывает ведь).
Теперь надо понять, что там за дуга такая в лампах и как она получается.
Если на ксеноновую лампу подать высокочастотное напряжение, то разряд в лампе будет выглядеть вот так:
Очень красиво, но нам нужно немного не это. Нам нужен тонкий шнур дуги. А значит, дуга потребуется постоянного тока. Такая дуга выглядит не так зрелищно, как высокочастотная, но тоже очень красиво (и в магнитном поле интересно так изгибается и закручивается):
Дуга постоянного тока в лампе накачки лазера.
Такую дугу надо сначала зажечь повышенным напряжением, пробив разрядный промежуток лампы, а потом удержать при меньшем напряжении. Вкачивая в эту дугу напряжение батареи конденсаторов мы получим вспышку лампы и, соответственно, импульс лазера. При этом очень неплохо бы, чтобы после окончания вспышки дуга не погасла, иначе придётся зажигать дугу по новой, а это очень неудобно.
Для создания и удержания дуги применяются устройства, называемые симмерами (например, модель willmore). Их можно купить, например, на Авито. Но мы не ищем лёгких путей и экономим бюджет. :) А значит, симмер надо бы сделать самому из того, что есть под рукой, и что позволяют мои текущие знания электроники (а позволяют они не скажу, что многое). Дуга требует стабилизации тока. В схемах промышленных симмеров применялись резонансные стабилизаторы тока (вот возможная схема симмера.), а ток дуги в лампах достигает 1 А и выше. Я же в своём симмере решил стабилизировать ток дуги умножителем напряжения. Да и зажигать дугу с его же помощью. Ну и конечно, 1 А в дуге мне даже не снится. Собственно, в первой версии симмера у меня дуга внезапно погасла после нескольких десятков импульсов лазера. Пришлось поднимать напряжение и ток.
Схема блока питания лазера с дежурной дугой.
Внешний вид блока питания с дежурной дугой.
Блок питания в открытом виде.
В схеме умножителя я применил диоды 2Ц114Б — они достаточно слаботочные ( 50 мА постоянного тока и меньше ампера импульсного длительностью меньше 50 мкс, согласно справочнику — у нас как раз импульсный режим). На этот умножитель подаётся высокое напряжение с катушки, качаемой мостиком на IRFP460. Узел на IRFP460 я взял от схемы индукционного нагревателя, который я когда-то собирал, но не дособирал. Этот узел у меня уже был готовый. Его я и применил в своей конструкции. Частота работы преобразователя не должна превышать допустимую для диодов умножителя (для 2Ц114Б допустимо 10 кГц, но чем меньше, тем лучше будет диодам). Для зажигания у катушки есть дополнительная первичная обмотка с меньшим количеством витков, что позволяет кратковременно получить повышенное напряжение, достаточное для пробоя лампы ИНП3-7/80А. Так как намотка вторички у меня недостаточная (просто не хватило места на ферритовом магнитопроводе на большую катушку), то первички у меня содержат малое количество витков, а значит, ток в первичках будет велик. Поэтому последовательно с питанием первичек я поставил небольшие дроссели (на схеме ниже не показаны) на 90 мкГн. После очередного уменьшения количества витков в удерживающей дугу первичке вышло, что необходимость в зажигании дуги отдельной кнопкой возникает нечасто — дуга сама зажигается при включении. А это просто отлично.
Зарядку батареи конденсаторов больше не стоит производить от отдельного инвертора 24В в 1200 В. Это слишком долго (десятки секунд) и не позволит поиграть с лазером в частотном режиме. Поэтому был собран умножитель с питанием от сети с управлением от симистора. Этот умножитель заряжает батарею 2000 мкФ за 0.6 секунды до 800 В, что мне и надо.
Коммутация батареи в дугу осуществляется блоком мощных тиристоров с индуктивной гальванической развязкой. В процессе настройки блока было выяснено, что в момент зажигания дуги тиристоры пробивает, и импульс уходит на зарядку конденсаторной батареи, а дуга не зажигается — тиристоры ведь всего-то на 2 кВ, а поджигающий импульс гораздо больше. Пришлось поставить последовательно тиристорам блок мощных диодов, не дающий поджигающему импульсу уходить в батарею. Диоды и тиристоры нужны мощные, ведь разрядные токи могут превышать килоамперы. Кроме того, между диодам и лампой была добавлена катушка на 130 мкГн (на схеме не показана), призванная затянуть импульс вспышки и облегчить работу лампы. Такая катушка обязательно мотается без сердечника толстым проводом, так как на таких огромных токах сердечник сразу влетит в насыщение и будет бесполезен. Я хотел намотать катушку проводом ПВ-1 сечением 4 мм кв., но пожадничал и денег и места под катушку, так что пришлось намотать её проводом сечением 2.5 мм кв. И конечно, в процессе работы катушка ощутимо нагревается. Было бы странно иное.
Во всей этой конструкции ещё не хватает блока управления, который будет чередовать импульсы заряд-вспышка. Этим блоком у меня служит вольтметр для измерения напряжения на конденсаторной батарее. Он, правда, сильно инерционный, поэтому я принял решение делать зарядку батареи не по его показаниям, а по времени.
Схема вольтметра.
Этот вольтметр имеет гальваническую развязку между схемой измерения и схемой индикации (развязка там так, на всякий случай, мало ли что — напряжения и энергии очень уж опасные и лучше перестраховаться). Проект (именно вольтметра — там нет в ПО управления вспышками и зарядом, я приведу его ниже) размещён тут. Измерительные резисторы я на всякий случай залил эпоксидкой — так нет возможности их случайно потрогать в процессе настройки, модернизации или ремонта.
Для использования этого вольтметра в качестве контроллера управления вспышками требуется изменить файл lpv.c в прошивке для atmega8 (компилятор WinAVR). При этом к порту PC3 подключается тумблер на GND для включения лазера в режим вспышек, порт PC5 используется как сигнал на схему заряда (подаёт сигнал на симистор включения заряда), а порт PB2 используется как сигнал на включение вспышки лампы накачки.
//----------------------------------------------------------------------------------------------------
//подключаемые библиотеки
//----------------------------------------------------------------------------------------------------
#include "based.h"
#include "mt16s2d.h"
//----------------------------------------------------------------------------------------------------
//константы
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
//глобальные переменные
//----------------------------------------------------------------------------------------------------
extern char String[STRING_BUFFER_SIZE];//строка
volatile bool FireEnabled=false;//разрешение на вспышку
//****************************************************************************************************
//макроопределения
//****************************************************************************************************
//****************************************************************************************************
//порты обмена данными в режиме ведущего
//****************************************************************************************************
#define MISO_DDR DDRB
#define MISO_PORT PORTB
#define MISO_PIN PINB
#define MISO 4
#define MOSI_DDR DDRB
#define MOSI_PORT PORTB
#define MOSI_PIN PINB
#define MOSI 3
#define SCK_DDR DDRB
#define SCK_PORT PORTB
#define SCK_PIN PINB
#define SCK 5
#define RW_DDR DDRD
#define RW_PORT PORTD
#define RW_PIN PIND
#define RW 6
//****************************************************************************************************
//сигнал включения вспышки
//****************************************************************************************************
#define FIRE_DDR DDRB
#define FIRE_PORT PORTB
#define FIRE 2
//****************************************************************************************************
//сигнал включения зарядки
//****************************************************************************************************
#define CHARGING_DDR DDRC
#define CHARGING_PORT PORTC
#define CHARGING 5
//****************************************************************************************************
//включение лазера
//****************************************************************************************************
#define LASER_ENABLED_DDR DDRC
#define LASER_ENABLED_PORT PORTC
#define LASER_ENABLED_PIN PINC
#define LASER_ENABLED 3
//----------------------------------------------------------------------------------------------------
//прототипы функций
//----------------------------------------------------------------------------------------------------
void InitAVR(void);//инициализация контроллера
uint16_t GetData(void);//считать данные
void MOSI_Hi(void);//выставить высокий уровень на выходе MOSI
void MOSI_Lo(void);//выставить низкий уровень на выходе MOSI
void SCK_Hi(void);//выставить высокий уровень на выходе SCK
void SCK_Lo(void);//выставить низкий уровень на выходе SCK
bool GetMISOState(void);//получить значение уровня на входе MISO
void FireEnable(void);//произвести вспышку
void FireDisable(void);//отключить вспышку
void ChargingEnable(void);//произвести зарядку
void ChargingDisable(void);//отключить зарядку
bool IsLaserEnabled(void);//получить, включён ли лазер
//----------------------------------------------------------------------------------------------------
//основная функция программы
//----------------------------------------------------------------------------------------------------
int main(void)
{
InitAVR();
_delay_ms(500);
MT16S2D_Init();
float fire_u=0;
_delay_ms(100);
MT16S2D_SetTextUpLine("Вольтметр лазера");
MT16S2D_SetTextDownLine("Ожидаю ответ МК1");
ChargingDisable();
FireDisable();
while(1)
{
uint16_t value=GetData();
float v=2.56*value/1023;//напряжение на измерительном резисторе
const float r_measure=13000;//измерительный резистор
const float r_ballast=10200000;//балластный резистор
const float FIRE_U=800;//напряжение готовности к вспышке
float i=v/r_measure;//ток в цепи
float u=i*(r_measure+r_ballast);
//фильтр даёт существенную задержку, поэтому показания для готовности к вспышке фильтруем иначе
fire_u=0.5*fire_u+0.5*u;
if (fire_u>FIRE_U)
{
cli();
FireEnabled=true;
sei();
}
else
{
cli();
FireEnabled=false;
sei();
}
u=fire_u;
sprintf(String,"U,В:%i",(int)(u));
MT16S2D_SetTextUpLine(String);
const float c=2000E-6;//ёмкость батареи конденсаторов
uint32_t e=(uint32_t)(c*u*u/2);
sprintf(String,"E,Дж:%i",(int)e);
MT16S2D_SetTextDownLine(String);
_delay_ms(50);
}
return(0);
}
//****************************************************************************************************
//****************************************************************************************************
//общие функции
//****************************************************************************************************
//****************************************************************************************************
//----------------------------------------------------------------------------------------------------
//инициализация контроллера
//----------------------------------------------------------------------------------------------------
void InitAVR(void)
{
cli();
//настраиваем порты
DDRB=0;
DDRD=0;
DDRC=0;
RW_DDR|=(1<<RW);
MOSI_DDR|=(1<<MOSI);
SCK_DDR|=(1<<SCK);
MISO_DDR&=0xff^(1<<MISO);
FIRE_DDR|=(1<<FIRE);
CHARGING_DDR|=(1<<CHARGING);
LASER_ENABLED_DDR&=0xff^(1<<LASER_ENABLED);
//задаём состояние портов
PORTB=0x00;
PORTD=0x00;
PORTC=0x00;
RW_PORT&=0xff^(1<<RW);
LASER_ENABLED_PORT|=(1<<LASER_ENABLED);//подтяжка входа разрешения работы лазера
//настраиваем таймер T0
TCCR0=((0<<CS02)|(1<<CS01)|(0<<CS00));//выбран режим деления тактовых импульсов на 8
TCNT0=0;//начальное значение таймера
TIMSK=(1<<TOIE0);//прерывание по переполнению таймера (таймер T0 восьмибитный)
sei();
}
//----------------------------------------------------------------------------------------------------
//считать данные
//----------------------------------------------------------------------------------------------------
uint16_t GetData(void)
{
//отправляем сигнал, пока не получим 32 единицы после ноля
uint8_t counter=0;
bool zero=false;
while(1)
{
SCK_Hi();
_delay_ms(1);
bool state=GetMISOState();
SCK_Lo();
_delay_ms(1);
if (zero==false)
{
counter=0;
if (state==false) zero=true;
continue;
}
if (state==true) counter++;//считаем единицы
else//ошибка
{
counter=0;
zero=false;
continue;
}
if (counter==32) break;
}
//принимаем данные
uint16_t mask=(1<<0);
uint16_t value=0;
for(int16_t n=0;n<sizeof(uint16_t)*8;n++,mask<<=1)
{
SCK_Hi();
_delay_ms(1);
bool state=GetMISOState();
SCK_Lo();
_delay_ms(1);
if (state==true) value|=mask;
}
return(value);
}
//----------------------------------------------------------------------------------------------------
//выставить высокий уровень на выходе MOSI
//----------------------------------------------------------------------------------------------------
void MOSI_Hi(void)
{
MOSI_PORT|=(1<<MOSI);
}
//----------------------------------------------------------------------------------------------------
//выставить низкий уровень на выходе MOSI
//----------------------------------------------------------------------------------------------------
void MOSI_Lo(void)
{
MOSI_PORT&=0xff^(1<<MOSI);
}
//----------------------------------------------------------------------------------------------------
//выставить высокий уровень на выходе SCK
//----------------------------------------------------------------------------------------------------
void SCK_Hi(void)
{
SCK_PORT|=(1<<SCK);
}
//----------------------------------------------------------------------------------------------------
//выставить низкий уровень на выходе SCK
//----------------------------------------------------------------------------------------------------
void SCK_Lo(void)
{
SCK_PORT&=0xff^(1<<SCK);
}
//----------------------------------------------------------------------------------------------------
//получить значение уровня на входе MISO
//----------------------------------------------------------------------------------------------------
bool GetMISOState(void)
{
if (MISO_PIN&(1<<MISO)) return(true);
return(false);
}
//----------------------------------------------------------------------------------------------------
//включить вспышку
//----------------------------------------------------------------------------------------------------
void FireEnable(void)
{
FIRE_PORT|=(1<<FIRE);
}
//----------------------------------------------------------------------------------------------------
//отключить вспышку
//----------------------------------------------------------------------------------------------------
void FireDisable(void)
{
FIRE_PORT&=0xff^(1<<FIRE);
}
//----------------------------------------------------------------------------------------------------
//произвести зарядку
//----------------------------------------------------------------------------------------------------
void ChargingEnable(void)
{
CHARGING_PORT|=(1<<CHARGING);
}
//----------------------------------------------------------------------------------------------------
//отключить зарядку
//----------------------------------------------------------------------------------------------------
void ChargingDisable(void)
{
CHARGING_PORT&=0xff^(1<<CHARGING);
}
//----------------------------------------------------------------------------------------------------
//получить, включён ли лазер
//----------------------------------------------------------------------------------------------------
bool IsLaserEnabled(void)
{
if (LASER_ENABLED_PIN&(1<<LASER_ENABLED)) return(false);
return(true);
}
//----------------------------------------------------------------------------------------------------
//обработчик вектора прерывания таймера T0 (8-ми разрядный таймер) по переполнению
//----------------------------------------------------------------------------------------------------
ISR(TIMER0_OVF_vect)
{
//частота таймера 488 Гц (период 0,002048 секунды).
TCNT0=0;
static uint16_t counter=0;
if (counter>0)
{
counter--;
return;
}
typedef enum
{
MODE_WAIT,
MODE_CHARGING,
MODE_FIRE,
MODE_WAIT_FIRE
} MODE;
static MODE mode=MODE_WAIT;
if (mode==MODE_WAIT)
{
FireDisable();
if (IsLaserEnabled()==true)
{
mode=MODE_CHARGING;
ChargingEnable();
counter=300;//для напряжения 800 В нужно поставить 300
//125 =550 В
//250 =730 В
//350 =860 В
//U=1240*(1-exp(-t/295)), где t- время в тактах таймера
return;
}
}
if (mode==MODE_CHARGING)
{
//if (FireEnabled==true)
{
ChargingDisable();
mode=MODE_FIRE;
counter=5;
return;
}
}
if (mode==MODE_FIRE)
{
FireEnable();
counter=10;
mode=MODE_WAIT_FIRE;
return;
}
if (mode==MODE_WAIT_FIRE)
{
FireDisable();
if (FireEnabled==false)
{
mode=MODE_WAIT;
counter=5;
return;
}
counter=10;
mode=MODE_FIRE;
return;
}
}
С данным блоком питания мне пока удалось достигнуть частоты 1.5 Гц для 800 В на батарее конденсаторов 2000 мкФ. В видео ниже я ошибочно указал частоту 2-3 Гц, так как забыл, что задавал время заряда в программе в тактах таймера, а не в миллисекундах. Ограничивает по частоте меня блок заряда конденсаторной батареи. Увеличить частоту можно увеличив ёмкости конденсаторов умножителя блока заряда, но пока я этого не делал — и так провода проводки уже греются. :) Квант-12, например, кушает от трёхфазной сети аж 6 кВт. Это для меня будет перебор.
Ну а теперь результаты работы неодимового лазера в квантроне К-107 в частотном режиме.
Искры от стальной болванки.
К сожалению, рубиновый лазер я пока не могу запустить в частотном режиме, так как кристалл рубина у меня достаточно короткий (8.5 см) и в квантроне К-107 банально едва выпирает из отражателя. Этого выпирания достаточно для установки торцов в кристаллодержатели, но при этом полностью перекрывается доступ воды к кристаллу рубина. А это значит, что запустить его с охлаждением так просто не получится. Но, возможно, в будущем я всё-таки это сделаю.
P.S. Некоторых интересует, что будет если стрельнуть таким лазером в руку. :) Я такого опыта не проводил, но вроде как в Квант'е попадание руки в зону фокусировки ничего плохого не даёт. Как мне сообщили недавно, попадание луча рубинового лазера (с большим АЭ и накачкой около 5 кДж) ощущается как небольшое тепло и больше ничего. Сфокусированное излучение этого же рубинового лазера создаёт маленькую точку на коже и почти не ощущается.
Ну и напоследок, не забывайте о технике безопасности!
Автор:
da-nie