به اشتراک گذاری تجربه ای کوچک در حوزه کد نویسی برای AVR

داستان از آنجایی شروع شد که میخواستم دو تا موتور سه فاز که با درایوهای تک به سه، از برق تکفاز تغذیه میشدند رو با ای وی آر کنترل کنم 

کد ها رو توی arduino ide نوشتم، روی یه آردینو اونو تست کردم و پی سی بی رو طراحی و مونتاژ کردم . پی سی بی رو هم تست کردم و مثل بنز کار میکرد.وقتی تو تابلو نصبش کردم و میخواستم ابراز رضایت کنم یه حرکت تو مخی رو شروع کرد.

موتور دائما وایمیستاد و یه سری عملگرها هم بدون دلیل کار میکردند.

نتیجه اینکه «نویز» این دشمن دیرین سراغ پی سی بی من آمده بود و اون رو مورد عنایت خاص خودش قرار داده بود.

 

کار با تست سیم ها تعویضشون و  فویل پیچ کردن و از این کارها شروع و با جا به جایی درایو از مجاورت تابلو متوقف شد 

متوجه شدیم درایو که دور میشه تعداد این خطاها خیلی کم میشه .     اممما بااازم     هست.

آخر شب شده بود و زمان خداحافظی،  به کارفرما سپردم که درایو رو فویل پیچ کن ببینیم خدا چی میخواد . خبرش رو به من بده 

اما تو چشماش خواندم که حال این کارها رو نداره.

فردا ظهرش به من زنگ زد و اعلام کرد که ایراد از کار شماست و این کارها فایده‌ای نداره

 

 

من هم که ضرر رو توی جیب شلوار لمس کردم یه بار دیگه سراغ کد ها رفتم  و مشکل رو این دیدم :

 

 

 

if(digitalRead(sensor)==1){

 

digitalWrite(invert, HIGH);

.

.

.

.

 

 

}

else {  

  

digitalWrite(invert, LOW);

digitalWrite(JACK, HIGH); 

lcd.clear();

  lcd.setCursor(0,1);

.

.

.

.

}

 

تیکه دوم بعد از else  بود که بدون کنترل تکرار می‌شد.

و اینک این else  بود که ما را در دام نویز انداخته بود:

وقتی مینویسیم else یعنی هر چیزی که if نباشه و« هر چیزی » در میکرو کنترلر معادل نویزه 

بهتر بگم وقتی else بدون شرط مهار استفاده میشه هر مقدار تصادفی غیر از شرط اصلی_ اینجا digitalRead(sensor)==1 _ که روی پایه فرمان پذیر ما میفته, شرط درست برای اجرای دستورات خودش می‌دونه و اون دستورات رو اجرا می‌کنه . 

و اینجا همون مقدار میدان مغناطیسی حاصل از فرکانس درایو کافی بود تا تعداد این مقادیر رو زیاد کنه .

 

 

به جای else  از else if و شرطی که دقیقا مد نظرتون هست استفاده کنید. میکرو رو یتیم رها نکنید 

 

if(digitalRead(sensor)==1){

 

digitalWrite(invert, HIGH);

.

.

.

 

}

else if(digitalRead(sensor)==0){  

  

digitalWrite(invert, LOW);

digitalWrite(JACK, HIGH); 

lcd.clear();

  lcd.setCursor(0,1);

.

.

.

}

 

همانا میکرو هم آدم است و اگر نداند خطا می‌کند.

 

 

دوست عزیزم آقای مهندی احسان باقری هم این نظر رو داشتند:

با طراحی یه pcb درست درمون و فیلتر روی پین های میکرو همینطور رعایت اصول طراحی تغذیه مدار و بعد از اون استفاده از فیلتر های نرم افزاری 99 درصد مشکلات مدارات الکترونیک حل میشه
اون شرط رو که توی else گذاشتید خودش شبیه به یه فیلتر داره عمل میکنه
 
جناب مهندس امین هم این نظر رو داشتند:
 
Please be sure your microcontroller's flash memory is full with watchdog reset code. For example, your code needs 512 bytes but your flash memory is 1K. In this case, it's recommended to fill the free space of your flash memory with watchdog reset codes.
Please check this application note.
Atmel AVR1610: Guide to IEC 60730 Class B Compliance
Mit Freuendlichen grüßen!
 
 
 

نویسنده:

نظر

مقالات مرتبط: