вот нашел пример,но он написан на си. Симмисторный регулятор мощности
Полученная схема симисторного регулятора c гальванической развязкой цепей регулирования от сетевого напряжения мощности показана ниже:
Диоды VD3-VD6 - защитные (от повышенного напряжения на входе и напряжения обратной полярности).
Цепь на транзисторной оптопаре DA2 предназначена для захвата "нуля" сетевого напряжения и гальванической развязки от нее. При наличии "полуволны" происходит шунтирование вывода 5 микроконтроллера на землю. Диод VD2 защищает оптопару от полуволны обратного напряжения. Резистор R1 - гасящий, мощностью 2Вт для питания светодиода оптопары.
Если Вы хотите применить для регилирования мощности переменный резистор, то включить его можно как указано на схеме R7. Учитывая входное сопротивление АЦП микросхемы преобразователя (10кОм) сопротивление переменного резистора желательно применить в диапазоне от 1 до 10 кОм, при этом ограничительный резистор R5 следует исключить из схемы. Также можно исключить их схемы и защитные диоды.
Вывод 4 микросхемы DD1 используется для включения и выключения микроконтроллера (регулятора). При напряжении +5В микроконтроллер включен. Если отдельный вывод включения не требуется, то правый вывод резистора R6 следует соединить с плюсом питания (+5В), при этом защитные диоды VD5, VD6 можно исключить.
Блокировочные керамические конденсаторы по 0,1мк служат для подавления пульсаций питающего напряжения.
Алгоритм управления симистором - фазоимпульстный, т.е. регирирование мощности на нагрузке выполняется изменением времени открытия симистора от начала полпериода сетевого напряжения. При мощности 100% импульс открывания симистора приходит сразу после появления сигнала от дачика перехода сетевого напряжения через "ноль", что приводит к пропусканию всей полуволны сетевого напряжения (10 мс). При мощности 10% происходит задержка включения симистора на 9 мс и в нагрузку уходит лишь оставшаяся 1 мс сетевого напряжения.
Микроконтроллер 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;
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--;
}
}
}
Для работы с обеими полупериодами, следует транзисторную оптопару DA2 подключать через диодный мостик, чтобы иметь на выходе импульсы при любой полярности полупериода.
Вот еще.
Поскольку переменное напряжение выпрямляется диодным выпрямителем, то мы получаем 100 Гц импульсной положительной полуволны. Мощность нагрузки регулируется путем отбрасывания некоторого количества положительных полуволн. Автор для расчетов выбрал базис 12 импульсов. При вычитании заданного количества целых положительных полуволн из каждых 12 импульсов сети получим регулировку мощности.
288
Глава 11
Путем выбора заданной мощности микроконтроллер отсчитывает по определенному алгоритму 12 импульсов сети, исключая некоторые полуволны в указанном порядке (см. рис. 11.5). Для повышения дискретности регулирования мощности необходимо увеличивать базис (например, выбрать минимальный шаг 1 из 25 или 1 из 100). Однако увеличение шага регулировки потребует больших ресурсов микроконтроллера. Этот метод имеет преимущество перед фазоимпульсным управлением, поскольку не создает импульсных помех в сети. Впрочем, один из недостатков подобного регулирования — это появление звуковых колебаний в нагрузке. Хотя, если тепловой элемент находится в герметичной изоляции, то звуковые колебания не слышны.