زمان کنونی: 03-20-2019, 02:21 AM
درود مهمان گرامی! (ورودثبت نام)



New Reply 
 
مشکل نویز در مدار
10-09-2017, 07:32 PM
ارسال: #1
مشکل نویز در مدار
سلام
پروژه ای را انجام داده ام که تعداد دور موتور را با انکودر و اپتوکانتر محاسبه میکند ؛ حالا مشکل اینجاست که زمانی که موتور را روشن میکنم و قبل از اینکه به اپتوکانتر نزدیکش کنم که پالس ها رو شمارش کند اپتوکانتر پالس میفرستد به سمت میکرو و بر روی ال سی دی rpm مقداری را دارد خودم حدس میزنم به خاطر نویز برگشتی موتور در مدار است حال نمیدانم چگونه این مشکل را حل کنم، لطفا راهنماییم کنید.
کد php:
                #include "headers.h"



                
ulong counter ;

                
void speedControl(void)
                {    
                
counter++;
                }


                
uint32_t RPM ;
                
uint32_t RPS ;

                
void    Speed_Motor (void)
                {
                
RPS = ( (counter 12) / );
                
RPM = ((RPS)* 60 );
                
counter0;

                }    



                
int main()
                { 
                
vusb_enable()    ;
                    
                
KEYPAD keypad(P5,P6,P7,P8,P9,P10,P11,P12);
                
uint8_t   num ;
        
uint8_t  val;
                
LiquidCrystal lcd(P40,P39,P38,P37,P36,P35);
                
lcd.begin(162);
                
lcd.setCursor(20);    
                
lcd.print("S  A  L  A  M");
                
delay.ms(1500);
                
lcd.clear();
                
lcd.setCursor(00);
                
lcd.print("RPS= ");
                
lcd.setCursor(01);    
        
lcd.print("RPM= ");
                    
                
pwm.init(50,100);
                
pwm.setRange(0,100);
                
pwm.enable(P23);

                
eint.attachISR(P13,speedControl,FALLING);
                
eint.enable();

                
timer1.init(2000000,true);
                
timer1.attachISR(Speed_Motor);



                while(
true)
                {

                
//        cdc.print("SPEED(RPS) = ");     cdc.println(RPS); 
                //       cdc.print("SPEED(RPM) = ");     cdc.println(RPM);
                //        cdc.println();                  cdc.println();
      
if(keypad.scan() != 255)
        {
//            lcd.clear();
            
lcd.setCursor(140);
            
            
num keypad.scan();
          
delay.ms(200);
          while (
keypad.scan() != 255);
          
        
//         lcd.print(num);
        

//             if(num==1 )
//            { 
//                lcd.setCursor(12, 0);
//              lcd.print("10% ");
//              pwm.set(P23 ,10);                    
//            }    
//            else if(num==2)
//            { 
//                lcd.setCursor(12, 0);
//              lcd.print("20% ");
//              pwm.set(P23 ,20);                    
//            }    
//            else if(num==3)
//            { 
//                lcd.setCursor(12, 0);
//              lcd.print("30% ");
//              pwm.set(P23 ,30);                    
//            }
//            else if(num==4)
//            { 
//                lcd.setCursor(12, 0);
//              lcd.print("40% ");
//              pwm.set(P23 ,40);                    
//            }
       
if(num==1)
            {                     
                    
lcd.setCursor(110);
                    
lcd.print("10%  ");
                    
delay.ms(500);
                while( 
keypad.scan() == 255 );
               if(
keypad.scan()==10)
                 {
                        
lcd.setCursor(110);
                        
lcd.print("10%ok");
                        
pwm.set(P23 ,10);                    
               }
        }
            else if(
num==2)
            {                     
                    
lcd.setCursor(110);
                
lcd.print("20%  ");
                
delay.ms(500);
            while( 
keypad.scan() == 255 )
               if(
keypad.scan()==10)
                 {
                        
lcd.setCursor(120);
                        
lcd.print("20%ok");
                        
pwm.set(P23 ,20);                    
               }
        }
            else if(
num==3)
            { 
                    
lcd.setCursor(110);
                
lcd.print("30%  ");
                
delay.ms(500);
                  while( 
keypad.scan() == 255 )
               if(
keypad.scan()==10)
                 {
                        
lcd.setCursor(110);
                        
lcd.print("30%ok");
                        
pwm.set(P23 ,30);                    
               }
        }
            else if(
num==4)
            { 
                    
lcd.setCursor(110);
                
lcd.print("40%  ");
                
delay.ms(500);
            while( 
keypad.scan() == 255 )
               if(
keypad.scan()==10)
                 {
                        
lcd.setCursor(110);
                        
lcd.print("40%ok");
                        
pwm.set(P23 ,40);                    
               }
        }
            else if(
num==5)
            {
                
lcd.setCursor(110);                    
                
lcd.print("50%  " );
            
             while ( 
keypad.scan() == 255 ) ;
                 
               if(
keypad.scan()==10)
                 {
                        
lcd.setCursor(110);
                        
lcd.print("50%ok");
                        
pwm.set(P23 ,50);                    
               }
        }
                else if(
num==6)
            {     
                    
lcd.setCursor(110);
                
lcd.print("60%  ");
                
delay.ms(500);
             while( 
keypad.scan() == 255 )
               if(
keypad.scan()==10)
                 {
                        
lcd.setCursor(110);
                        
lcd.print("60%ok");
                        
pwm.set(P23 ,60);                    
               }
        }    
        
                else if(
num==7)
            {         
                    
lcd.setCursor(110);
                
lcd.print("70%  ");
                
delay.ms(500);
             while( 
keypad.scan() == 255 )
               if(
keypad.scan()==10)
                 {
                        
lcd.setCursor(110);
                        
lcd.print("70%ok");
                        
pwm.set(P23 ,70);                    
               }
        }
                    else if(
num==8)
            {     
                    
lcd.setCursor(110);
                
lcd.print("80%  ");
                
delay.ms(500);
             while( 
keypad.scan() == 255 )
               if(
keypad.scan()==10)
                 {
                        
lcd.setCursor(110);
                        
lcd.print("80%ok");
                        
pwm.set(P23 ,80);                    
               }
        }
                else if(
num==9)
            { 
                    
lcd.setCursor(110);
                
lcd.print("90%  ");
                
delay.ms(500);
             while( 
keypad.scan() == 255 )
               if(
keypad.scan()==10)
                 {
                        
lcd.setCursor(110);
                        
lcd.print("90%ok ");
                        
pwm.set(P23 ,90);                    
               }
        }    
                        else if(
num==0)
            { 
                
lcd.setCursor(110);
                
lcd.print("100% ");
                
delay.ms(500);
             while( 
keypad.scan() == 255 )
               if(
keypad.scan()==10)
                 {
                        
lcd.setCursor(110);
                        
lcd.print("100%ok");
                        
pwm.set(P23 ,99);                    
               }
        }    
                
            else if(
num==11)
             { 
                
lcd.setCursor(110);
              
lcd.print("stop ");
              
pwm.set(P23 ,0);                    
            }
        }
                
lcd.setCursor(40);            
                
lcd.print(RPS);     

                
lcd.setCursor(41);
          
lcd.print(RPM); 

                
delay.ms(250);
        
        
lcd.setCursor(40);            
                
lcd.print("   ");     

                
lcd.setCursor(41);
          
lcd.print("     "); 

        
                } 
/* while */
                
/* main */ 
Quote
10-10-2017, 03:58 PM
ارسال: #2
RE: مشکل نویز در مدار
بی زحمت کد رو هم نگاه کنید ببنید مشکلی داره؟
Quote
10-12-2017, 01:25 PM (آخرین ویرایش در این ارسال: 10-12-2017 01:28 PM، توسط Sharin.)
ارسال: #3
RE: مشکل نویز در مدار
سلام.

از اونجایی که برنامه نویسی ادوات سخت افزاری، مستقیما در ارتباط با سخت افزار هست، 2 بخش برنامه نویسی و سخت افزار باید با همدیگه هماهنگ باشند. جهت راهنمایی شدن بهتر یک شماتیک از سخت افزاری که بستید هم نیاز هست همراه با کد ارائه بدید.

جهت حذف نویز بخشی از اقدامات اساسی بایستی در سخت افزار در نظر گرفته بشه و بخش باقیمانده در نرم افزار، منتها اولویت اول با سخت افزار هست.

زمانی که در حال استفاده از وقفه خارجی هستید، حتما حتما حتما از مقاومت های بالا و یا پایین کش بایستی استفاده کنید. در حال حاضر کد شما حساس به لبه ی پایین رونده هست، پس روی پایه وقفه ی خارجی باید یک مقاومت بالا کش لحاظ شود. مقدار 10K جهت شروع مناسب هست.

استفاده از 2 منبع تغذیه ی جدا گانه جهت بخش آنالوگ و دیجیتال بهترین راه حل هست. در این حالت 2 زمین در اختیار دارید.
1. زمین آنالوگ، که مربوط به موتور و ... ها می شود.
2. زمین دیجیتال : که مربوط به میکرو و ... ها می شود.

بدیهیست که در نهایت این 2 زمین باید به یکدیگر متصل شوند منتها نه به صورت مستقیم. در اینجا سیگنال هایی که بین مدار دیجیتال و آنالوگ مشترک هستند باید به واسطه اپتوکوپلر به یکدیگر متصل شوند.

3. استفاده از خازن های 100nf در دو سر VCC و GND قطعات در نزدیک ترین فاصله، یکی از موثر ترین روش های حذف نویز است که معادل اتصال کوتاه جهت فرکانس های بالاست.
4. همینطور استفاده از خازن های دکوپلاژ، که خازن های ظرفیت بالا در دو سر تغذیه ی IC ها هستند مانع افت جریان و ولتاژ لحظه ای بر اثر جریان کشی های عظیم لحظه ای در مدار می شود و تا جای ممکن باید نزدیک به پایه های تغذیه قرار گیرند.

5. در طراحی خطوط تغذیه باید دقت شود که اگر امکان استفاده از 2 تغذیه ی جداگانه جهت مدار میسر نیست، زمین های آنالوگ و دیجیتال تنها در یک نقطه بایستی به هم بپیوندند و نه بیشتر و اکیدا از ایجاد حلقه هایی در زمین باید خود داری شود.

6. و ...

در این رابطه مقاله های زیادی وجود دارد که به ویژه در زمان طراحی PCB باید به آنها توجه ویژه داشت و اگر PCB بدطراحی شود، خود عامل ایجاد نویز می شود.

البته بسته به فرکانس کاری مدار و شرایط پروژه ، بعضی نویزها و مشکلات را تنها روی PCB نهایی می توان برطرف کرد.

-------------------

کد شما از آنجا که به گفته ی خودتان کار می کند، پس درست است، اما لزوما خوب و یا بهینه نیست!
ویژگی های اصلی یک کد خوب:
1.خوانایی (Readability)
2. قابلیت استفاده مجدد. (Reusability)
3. انعطاف پذیری بالا. (Flexibillity)
4. قابلیت دست کاری جهت آینده هست. (Maintenance)

در نظر داشته باشید هرچه خواسته مدنظر را بتوانید ساده تر و با تعداد خطوط کمتری بر روی میکرو پیاده سازی کنید، کد شما ارزشمندتر خواهد بود.

اگر جایی از کدهاتون موارد تکراری به چشم می خوره، پس به بهینه و مناسب بودن آن شک کنید. تمام کدهای تکراری باید حذف شوند و در عوض در قالب یک تابع مشترک تعریف شوند و در برنامه ی اصلی فقط باید فراخوانی شوند.

مورد دیگه زمان سنجی شما 2 ثانیه است، و ...
قطعا اگر بیشتر روی الگوریتم پروژه کار کنید، به نتایج خیلی بهتری می تونید برسید.

با آرزوی موفقیت

[تصویر:  telegram_icon.png] کانال رسمی EasyMCU در تلگرام
.
.
Quote
10-31-2017, 03:38 PM
ارسال: #4
RE: مشکل نویز در مدار
با عرض سلام و خسته نباشید
متوجه طریقه استفاده از خازن نشدم اگر امکانش وجود دارد بصورت شماتیکی نشان دهید
Quote
11-02-2017, 05:43 PM
ارسال: #5
RE: مشکل نویز در مدار
سلام.

موارد ذکر شده جهت اعمال در طرح PCB هستند، ملزومات طراحی خوب PCB هستند. این موارد بسیار حساس هستند و نیاز به خواندن مقاله و پیگیری بیشتر دارند و به ویژه کسب تجربه. یک راه حل مشخص برای همه ی مدارات وجود ندارد، منتها موثر ترین و ابتدایی ترین مواردی که باید در نظر گرفته شوند در پست قبلی ذکر شدند. گستردگی موارد به حدی هست که در قالب یک پست قابل بیان نیست و چه بهتر که شروع به تحقیق و یادگیری بیشتر از طریق سرچ در اینترنت کنید. بلاخص منابع زبان اصلی.

با آرزوی موفقیت.

[تصویر:  telegram_icon.png] کانال رسمی EasyMCU در تلگرام
.
.
Quote
New Reply 


پرش به انجمن:

تماس با ما | EasyMCU | بایگانی | پیوند سایتی RSS
بازگشت به بالا
Persian Translation by MyBBIran.com - Ver: 4.6
Powered by MyBB, © 2002-2019 MyBB Group.
Designed by Escalate Internet. Icons by dAKirby309.

ورود
نام کاربری:
گذرواژه‌:



Lost your password?