Регулирование мощности других нагрузок по этой схеме смотри ниже >>>
Ко мне в руки попал принтер Hewlett-Packard, который после включения питания выдавал ошибку "50 Service" (что означало ошибку "печки"). После активного серфенга по интернету и помощи форумчан был найден источник проблемы.
Это был контроллер печки, который управлял мощностью нагревателя по аналоговому сигналу (0...5В) из недр принтера. В качестве силового элемента был применен симмистор BCR8CM и симмисторная оптопара с "контроллем перехода через ноль"
Схему решено было заменьть на простенькую, сприменением микроконтроллера PIC12F675, так как он имеет встроеный 10-разрядный АЦП и относительно не дорогой (около 10 грн в Киеве).
Модернезированная схема показана ниже:
Диоды VD3-VD6 - защитные (от повышенного напряжения на входе и напряжения обратной полярности).
Цепь на транзисторной оптопаре DA2 предназначена для захвата "нуля" сетевого напряжения и гальванической развязки от нее. При наличии "полуволны" происходит шунтирование вывода 5 микроконтроллера на землю. Диод VD2 защищает оптопару от полуволны обратного напряжения. Резистор R1 - гасящий, мощностью 2Вт.
Алгоритм управления тиристором - фазоимпульстный, что вызывает небольшой треск (при малых мощностях) в сетевом фильтре БП.
Микроконтроллер PIC12F675 может работать как с внутренним так и внешним кварцевым резонатором.В моем варианте МК работал с внутреним генератором (4МГц). При изменении частоты необходимо подкорректировать константы (ShimShagMax та ShimShagDiv). ShimShagMax указывает количество прерываний таймера на один полупериод при частоте сети 50 Гц - 10мс. Прерывание таймера каждые 256 мкс(при частоте 4МГц), тогда константа будет иметь значение 10мкс/256мкс=39. Принимаем 40, на всякий пожарный). ShimShagDiv=255/ShimShagMax=6.375
Ниже представлена программа для PIC12F675, написанная на языке Си:
#include <12F675.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
//#FUSES INTRC_IO //Внутрішній генератор
#FUSES XT //Зовнішній
генератор
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES MCLR //Master Clear pin enabled
#FUSES PUT //Power Up Timer
#FUSES BROWNOUT //Reset when brownout detected
#byte ADCON0 = 0x1F
#byte GPIO = 0x05
#use fast_io(A) // Работа с портами без переключения
// каждый раз регистров TRIS
#use delay(clock=4000000)
#define ShimShagMax 40
// 255/ShimShagMax
#define ShimShagDiv 6.375
unsigned char Shim, ShimVal;
#int_RTCC
void RTCC_isr()
{
Shim++; //Увеличиваем зачения счетчика ШИМ
if (Shim>ShimShagMax) Shim=0;//Период ШИМ порядка 20 мс (50Гц)
if ((ShimShagMax-Shim)<ShimVal) //Провреняем, не пришло ли время
OUTPUT_HIGH(PIN_A0);//если да, то лог "1"
else
OUTPUT_LOW(PIN_A0); //если нет, то "0"
if ((input_a() & 0b00000100))
Shim=0; //Синхронизируем с ~220В.
}
void Pause255(unsigned char Ret)
{ unsigned char Pause=0;
while(Ret>0)
{
while (Pause<255) Pause++;
Pause=0;
Ret--;
}
}
void main()
{
setup_adc_ports(sAN1|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_16);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
set_adc_channel( 1 );
SET_TRIS_A(0b00000110);
ShimVal=0;
{unsigned char InpVolt;
/* float Temp; */
//стабилизация температуры
while(1)
{
Pause255(254);
// ADCON0 |= 4; // Начинаем АЦПяпить
Pause255(254);
while (ADCON0 & 0b00000010); //Ожидаем завершение преобразования
InpVolt=READ_ADC()/ShimShagDiv; //
//Плавное изменение температуры
if ((InpVolt>ShimVal)&&(ShimVal<ShimShagMax)) ShimVal++;
if ((InpVolt<ShimVal)&&(ShimVal>0)) ShimVal--;
}
}
}
Для управления другими нагрузками, схему можно модернизировать.
При использовании переменного резистора (1...10кОм), в качестве задатчика, его следует подключать крайними выводами к +5В и земеле и средний вывод подключить ко входу МК(вывод №6, при этом резистор R5 в этой цепи можно исключить).
Синхронизацию с сетью (зез гальванической развязки) можно взять из схемы коммутатора гирлянд, подав сигнал прямо на вывод № 5 МК.
Для работы с обеими полупериодами, следует транзисторную оптопару DA2 подключать через диодный мостик, чтобы иметь на выходе импульсы при любой полярности полупериода.
Прошивка, версия от 12.12.2009, HEX.
5.05.2015