Здравствуйте!
Я делал управление плавное 5-ю тенами...
один на 12 ампер (20 пусковых - лампы мощные) остальные - типа плитки - оочень инерционные и мощность полтора киловатта
делал алгоритм брезенхема, шагом брал положительную полуволну через оптопару на прерывание...
силовая - симистор BTA26-800 и даташитная схема включения MOC3063.
получается полная гальваническая развязка и радиатора и управления.
брезенхем сделан по классической схеме
Код:
|
typedef struct
{
signed char Ena;
signed char MAXPOWER;
signed char Delta;
signed char Target;
signed char Phase_number;
signed char Out;
unsigned int curr_Step;
unsigned int Divider;
} brez;
brez b[maxBrez]; |
Код:
|
void UpdPhase()
{
char n=0;
for(n = 0; n ‹ maxBrez ; n++)
{
if(b[n].Ena==1)
{
// текущий брезенхем включен - считаем надо ли его включить
if(++b[n].curr_Step›b[n].Divider)
{
b[n].curr_Step=0;
b[n].Delta+=b[n].Target;
if(b[n].Delta›0)
{
b[n].Delta -= b[n].MAXPOWER;
b[n].Out = 1;
}
else
b[n].Out = 0;
if(--b[n].Phase_number==0)
{
b[n].Phase_number = b[n].MAXPOWER;
b[n].Delta = (-(b[n].MAXPOWER/2));
}
}
}
}
} |
Код:
|
void brezinit()
{
char n=0;
for(n = 0 ; n ‹ maxBrez;n++)
{
b[n].Ena = 1;
b[n].MAXPOWER = 100;
b[n].Phase_number = 100;
b[n].Delta = -50;
b[n].Out = 0;
b[n].Target = 0;
b[n].curr_Step = 0;
b[n].Divider = 0;
if(n==2)
b[n].Divider = 50;
}
} |
n==2 - прописано для очень мощного нагревателя духовки на 4 киловата - чтоб он моргал раз в секунду на 50% а не выдавал трели на весь дом 25 герцами. Делитель указывает какое кол-во шагов сети пропустить до изменения состояния/прокручивания брезенхема.
вызов происходик по спадающему фронту прерывания ( когда в сети примерно +120 вольт - оптопара замыкает ногу на + питания)
Код:
|
interrupt [EXT_INT7] void ext_int7_isr(void)
{
// Place your code here
//PhState=1;
//Rel1=!Rel1;
UpdPhase();
Rel1 = b[0].Out;
Rel2 = b[1].Out;
Rel3 = b[2].Out;
Rel4 = b[3].Out;
Rel5 = b[4].Out;
PhState=0;
} |
А так задавать нужную мощность.
Код:
|
switch(a)
{
case 3: b[4].Target = ADOUT[3];
break;
case 4: b[3].Target = ADOUT[4];
break;
case 5: b[1].Target = ADOUT[5];
break;
case 6: b[0].Target = ADOUT[6];
break;
case 7: b[2].Target = ADOUT[7];
break;
} |
a - номер канала ацп ну а свич сделан для сопоставления канала ацп каналу брезенхема.
в программе устроен делитель...например для очень мощной нагрузки можно применить контактор и что он не так часто клацал - поставить делитель 50 - минимальный импульс будет 1 секунда
![Улыбка](images/smilies/icon_smile.gif)
- у меня так сделано для ламп - они всёравно не светят а создают излучение ... в квартире от них мОргают все лампочки обычные ...потому удобнее сделать период в 100 секунд полного цикла брезенхема....впрочем никто не запрещает и кол-во градаций уменьшать...все задаётся в структуре
П.С. MOC-и и симисторы надо шунтировать 30 оммами и кондером на 0.01 микрофарад....иначе оно ловит ложные срабатывания даже от включающейся ЛДС-ки!!
Для тех кто не может разобраться - вот проект регулятора на 5 каналов со схемой печаткой и исходниками.
https://www.dropbox.com/s/ouio7swphy...plita.rar?dl=0