السلام عليكم ورحمة الله // الاخ الفاضل حسن هادي والاخوة الزملاء المشاركون في الموضوع ..
قبل البدء بايجاد الطريقة الملائمة لابدال المقاومة المتغيرة في الدائرة وكيف يمكن التحكم بها يجب ان نعرف بعض المفاهيم البسيطة جدا عن اداء عملية الDIM >>
بما اننا نتعامل مع موجة جيبية (المصدر العمومي ) فيتم في الدائرة التقليدية كمنظم المروحة ودائرة التحكم بالاضاءة اعلاه .. يتم التحكم بزمن السماح لمرور التيار عبر الترياك اي اننا لو سمحنا بكامل الزمن كان اقرب الى الشورت سيركت ولو قطعنا جزء من زمن المرور اصبح الحمل لاياخذ الطاقة الكاملة .. كيف يتم ذالك بدائرة (فيز شفت ) وهي عبارة عن مقاومة ومكثف هنا يتم تأخير الموجة حسب قيمة المقاومة بمساعدة المكثف واعطائها للبوابة كلما زاد التاخير ( انحراف اكبر للطور ) زاد قطع المصدر المغذي للحمل على التوالي مع الترياك .
انا من رأيي استخدام احدى الطريقتين الاتيتين للتمكن من السيطرة عبر البك .
الاولى ان نستبدل المقاومة باخرى يتم السيطرة على قيمتها من خلال جهد مستمر يتغير على شكل سلم (درجات ) كما اقترحة بعض الاخوة (باستخدام فوتو رسيزستور مع مصباح مقابل لها وتتم السيطرة على جهد المصباح .
الثانية ., تحتاج الى مهارة وخبرة في التعامل مع البك . الا وهي اخذ تزامن لموجة المصدر بعد تخفيضة واخذ نموذج منه ثم خلق خرج يتاخر عن تلك الموجة طبعا بمراحل (ستيبات ) مثلا 10 مراحل لنحصل على 10 درجات مختلفة من توصيل الترياك يتم تغذية هذا الخرج الى بوابة الترياك ويفضل استخدام فوتو ترياك في هذه العملية .
|
السلام عليكم
تسلم أستاذي العزيز
لقد توصلت الى دائره مناسبه مع الكود وبالفعل نجحت الطريقه وعمل ديمر بشكل ممتاز
بس عندي مشكله وهي مقاومه 220k

مربوطه مع القنطره تسخن قليلا لاني استخدمتها ربع واط
ارجو التأكد من صحه التصميم يعني اختيار صحيح للمقاومات
وثانيا كيف أختار قدره مقاومه لكي لاتسخن
https://www.mediafire.com/?93h97p4savhh47a
الكود
كود:
bit oldstate, oldstate1;
sbit sw_inc at RB1_bit;
sbit sw_inc_dir at TRISB1_bit;
sbit sw_dec at RB2_bit;
sbit sw_dec_dir at TRISB2_bit;
sbit trigger at RB3_bit;
sbit trigger_dir at TRISB3_bit;
sbit led_check at RB4_bit;
sbit led_check_dir at TRISB4_bit;
char zero_crosing=0, ratio=50 ,x;
unsigned int time=0 , cont=0;
//Timer0
//Prescaler 1:128; TMR0 Preload = 100; Actual Interrupt Time : 19.968 ms
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x86;
TMR0 = 100;
}
void interrupt()
{
if(INTCON.INTF)
{
INTCON.INTF=0;
tmr0=100;
zero_crosing=1;
}
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 100;
//Enter your code here
}
}
void main()
{
sw_dec_dir=1; // input
sw_inc_dir=1; // input
led_check_dir=0; //output
trigger_dir=0;//output
led_check=0;//led off
oldstate=0;
oldstate1=0;
intcon=0xB0;
InitTimer0();
for( x=0;x<6;x++) {led_check=~led_check; delay_ms(500); }
while(1)
{
if(zero_crosing)
{
zero_crosing=0;
led_check=1;
time=0;
cont=ratio*100;
while(time<cont)
{
time=128*(tmr0-100);
}
led_check=0;
trigger=1;
delay_us(100);
trigger=0;
}
//Button to decrease the voltage
if(sw_dec) oldstate=1;
if(!sw_dec && oldstate)
{
if(ratio <85) ratio +=1; //
oldstate = 0;
}
//Button to increase the voltage
if(sw_inc) oldstate1=1;
if(!sw_inc && oldstate1)
{
if(ratio>5)ratio -=1;
oldstate1 = 0;
}
}
}