اطلاعیه

Collapse
No announcement yet.

رفع نویز های adc

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    رفع نویز های adc

    سلام بر بروبچ
    دوستان من بعد از عمری کار مدام بر روی اندازه گیری ولتاژ ac و مشکلات اون امروز تصمیم گرفتم ببینم اصلا lpc چی نمونه برداری میکنه که اول 8 هزار سمپل رو گرفتم و ریختم داخل ارایه بعد ارابه رو ریختم روی مموری بعد دادم به متلب که شکل رو رسم کنه که این شد×


    قبول دارین شکل باحالی شده یا نه!!؟
    حالا همون طور میبیند در هر سیکل چندین پرش داریم و اساس برنامه نویسی من اینجوریه که میام بیشترین مقدار رو برمیدارم و استفاده میکنم که گاهی وقتا میبینید اون پرش حتی از بالاترین نقطه قله هم بلند تره!
    یعنی بی فایده!
    حالا بنظرتون چکارش کنم؟
    ورودی اصلاح باید بشه؟ یا شیوه برنامه نویسی باید عوض بشه؟

    راستی پیک ها با اسیلوسکوپ هم یکی در میون کوتا بلند هستن! کسی نمیدونه چرا؟؟
    انجام پروژه هاي برنامه نويسي اندرويد
    [glow=red,2,300]نرم افزار نقشه هاي پاور کامپيوتر اندوريد[/glow]
    http://cafebazaar.ir/app/?id=com.atxdroid

    #2
    پاسخ : رفع نویز های adc

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

    دیدگاه


      #3
      پاسخ : رفع نویز های adc

      برق 220 شهر رو اندازه گیری میکنم!
      اول با پل دیود dc بعد با مقاومت تقسیم ولتاز میزنم که میشه تقریبا 3 ولت میشه!!
      فرکانس برق شهر هم 50 هرتز بید!!!
      انجام پروژه هاي برنامه نويسي اندرويد
      [glow=red,2,300]نرم افزار نقشه هاي پاور کامپيوتر اندوريد[/glow]
      http://cafebazaar.ir/app/?id=com.atxdroid

      دیدگاه


        #4
        پاسخ : رفع نویز های adc

        در مورد پیک ها یه مقدار عجیبه اگر مداری که دارید ولتاژش stable باشه :

        من قبلنا که روی ADC خارجی بعضی موقع ها ADC رد میکرد و کانورت نمیکرد ؛ خلاصه تو بعضی نقاط چیزی را تو بافر نمیریخت و یک عدد رندم اولیه جا می موند در این صورت گاهی یه سری از این سوزنیا هم پیش میومد

        شاید هم کنارتون یک مدار هست که نویز های سنگن تولید میکنه ، اگر میشه یک ست کامل داده بگذارید اینجا , تا بشه فرکانس های مورد دارشو بیرون کشید.
        اگر هم مستقیم تو فلش مینوسید , اگر به پاسخ هایی که توابع میدن بیتوجه باشید بازم این مورد پر نشدن بافر و باقی ماندن عدد رندم پیش میاد.
        { خلاف قوانین - پاک شد }

        دیدگاه


          #5
          پاسخ : رفع نویز های adc

          نوشته اصلی توسط mahdiks
          در مورد پیک ها یه مقدار عجیبه اگر مداری که دارید ولتاژش stable باشه :

          من قبلنا که روی ADC خارجی بعضی موقع ها ADC رد میکرد و کانورت نمیکرد ؛ خلاصه تو بعضی نقاط چیزی را تو بافر نمیریخت و یک عدد رندم اولیه جا می موند در این صورت گاهی یه سری از این سوزنیا هم پیش میومد

          شاید هم کنارتون یک مدار هست که نویز های سنگن تولید میکنه ، اگر میشه یک ست کامل داده بگذارید اینجا , تا بشه فرکانس های مورد دارشو بیرون کشید.
          اگر هم مستقیم تو فلش مینوسید , اگر به پاسخ هایی که توابع میدن بیتوجه باشید بازم این مورد پر نشدن بافر و باقی ماندن عدد رندم پیش میاد.
          من از داخلی استفاده کردم!
          فقط ی اسپلیت هست و شارژر لپتاپ و چند تا لامپ این جور چیز ها!!
          من با اسکوپ نگرفتم با خود میکرو گرفتم و این پرش ها روی برق اصلی با اسکوپ دیده نمیشه!!
          ایکوپم هم دیجیتاله و قابلیت پیک فایندر هم داره!!
          نه من اول میریزم توی ارایه تا سرعت بالا باشه! بعد میریزم داخل مموری!!
          جالبه از هر مقدار حدودا 26 بار نمونه برداری میکنه! یعنی مثلا 26 تا مقدار 100 بعد 26 تا مقدار 101 و تا پبک و برمیگرده! که من دستور نوشتم که اگر تکراری بود ذخیره نکن!!
          انجام پروژه هاي برنامه نويسي اندرويد
          [glow=red,2,300]نرم افزار نقشه هاي پاور کامپيوتر اندوريد[/glow]
          http://cafebazaar.ir/app/?id=com.atxdroid

          دیدگاه


            #6
            پاسخ : رفع نویز های adc

            سلام بچها
            با برنامه نویسی اون نیز ها رو گرفتم!

            حالا ی مشکل دیگه!!
            وسط شک موج که میبینید یک سیکل کلا خراب میشه!!
            جالب اینجاست در کل نمونه گیری ها از پوینت 4500 شروع میشه!!!
            به نظرتون اشکال برنامه نویسی هست یا حافظه یا ...

            این هم کد
            کد:
            for(i=0;i<zz;)
            	{
             		
            		
            
              temp= ADC_ChannelGetData(LPC_ADC,chanal) /10;
            		for(z=0;z<15;z++)
            		{
            			temp2= ADC_ChannelGetData(LPC_ADC,chanal) /10;
            			if(temp2 < temp) temp = temp2; 
            		}
            		 
            		
            		if(temp != x[i] ) 
            		{
            			if(temp > x[i]+10 && temp < x[i]-10)
            			{
            				 
            				 x[i]= temp;
            			}
            			 else
            		  {
            				 i++;
                 x[i]= temp;
            		  }	 
            		
              }
              	 	
             }
            انجام پروژه هاي برنامه نويسي اندرويد
            [glow=red,2,300]نرم افزار نقشه هاي پاور کامپيوتر اندوريد[/glow]
            http://cafebazaar.ir/app/?id=com.atxdroid

            دیدگاه


              #7
              پاسخ : رفع نویز های adc

              temp > x[i]+10 && temp < x[i]-10
              این قسمت فکر نکنم وارد بشه، چون به نظر میاد شرطها با هم متناقض هستند.
              برای پرش از فیلتر median استفاده کنید ؛ نمونه ها رو یکنواخت بردارید وگر نه همه فرکانسها و ... به هم میریزه.

              .
              برای این بالا و پایین بودن این سینوسی ها :
              من قدرتی نیستم ولی به نظرم شما نول جایی که هستید خنثی نیست ، جریان برگشتی داره و اختمالا باعث شده این سینوس ها بالا تر بیان .
              مثل این قسمت هایی که به شیر آب و ... دست میزنید برقتون میگیره
              { خلاف قوانین - پاک شد }

              دیدگاه


                #8
                پاسخ : رفع نویز های adc

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

                دیدگاه


                  #9
                  پاسخ : رفع نویز های adc

                  نوشته اصلی توسط mahdiks
                  این قسمت فکر نکنم وارد بشه، چون به نظر میاد شرطها با هم متناقض هستند.
                  برای پرش از فیلتر median استفاده کنید ؛ نمونه ها رو یکنواخت بردارید وگر نه همه فرکانسها و ... به هم میریزه.

                  .
                  برای این بالا و پایین بودن این سینوسی ها :
                  من قدرتی نیستم ولی به نظرم شما نول جایی که هستید خنثی نیست ، جریان برگشتی داره و اختمالا باعث شده این سینوس ها بالا تر بیان .
                  مثل این قسمت هایی که به شیر آب و ... دست میزنید برقتون میگیره
                  فیلتری کی فرمودین میشه بیشتر توضیح بدین؟
                  اماده هست یا باید سر همش کرد یا ...
                  نوشته اصلی توسط aliila
                  من فکر میکنم کلا این سبک تبدیل یک موج به سیگنال دیجیتال درست نباشه .
                  کلا بهترین روش برای تبدیل - تعقیب - یک موج آنالوگ به سیگنال دیجیتال استفاده از adc های مبتی بر روش سیگما دلتا است .هم نرخ نمونه برداریش تا چند گیگ میتونه افزایش داشته باشه و هم اصلا امکان اون پرش ها رو نداره . فقط سیگنال حاصله دقیق دقیق نیست میشه گفت یک چیزی تو مایه های انتگرال گیری عددی است .
                  این adc چی هست همین adc میکرو یا باید از adc جداگانه استفاده کرد؟؟
                  انجام پروژه هاي برنامه نويسي اندرويد
                  [glow=red,2,300]نرم افزار نقشه هاي پاور کامپيوتر اندوريد[/glow]
                  http://cafebazaar.ir/app/?id=com.atxdroid

                  دیدگاه


                    #10
                    پاسخ : رفع نویز های adc

                    فیلتری کی فرمودین میشه بیشتر توضیح بدین؟
                    اول مثلا 5 نمونه بگیرید بعد عدد ها رو از کوچک به بزرگ بچینید و بعد عدد وسط رو بردارید.
                    { خلاف قوانین - پاک شد }

                    دیدگاه


                      #11
                      پاسخ : رفع نویز های adc

                      سلام
                      به نظرم قله های نامتقارن به خاطر تقسیم مقاومتیِ نامتقارن و خطای مقاومتهاست. یه دلیل دیگه می تونه وجود ولتاژ DC روی نول باشه. معمولاً نول یه ولتاژی داره.
                      و اما نویزهای تیز به نظرِ من بخاطر مبدل A/D و بخصوص زمینِ مبدل هست. شاید با یه فیلتر ساده RC سرِ راه پایه ADC مشکل رفع بشه.

                      یه موردی که توی شکلها دیدم اینه که شما تعداد نمونه هاتون توی یه سیکل خیلی زیاده. اگر کمترش کنید چیزی رو از دست نمیدید و می تونید راحت فیلترهای پایین گذر خفن رو پیاده سازی کنید. 20-30 تا نمونه توی یه سیکل سینوسی کافیه.
                      برای رفع نویزهای تیز، کافیه میانگین گیری کنید. یه پنجره میانگین گیر متحرک مثلاً 5 نقطه ای می تونه تا حد زیادی این مشکلات رو حل کنه. این قطعه کد رو هر بار که adc رو می خونی صدا بزن. خروجیش فیلتر شده ست:

                      کد:
                      #define N_AVERAGE	5
                      unsigned int average_window[N_AVERAGE]={0};
                      
                      unsigned int do_average(void)
                      {
                       unsigned int k1, sum=0;
                      
                       for(k1=1;k1<N_AVERAGE;k1++)
                       	average_window[k1-1] = average_window[k1];
                       average_window[N_AVERAGE-1] = adc_value;
                      
                       for(k1=0;k1<N_AVERAGE;k1++)
                       	sum += average_window[k1];
                      
                       return(sum/N_AVERAGE);
                      }
                      و اما پیدا کردنِ قله، دیگه کار سختی نیست. کدی که شما نوشته بودی خوب بود. حتی می تونی قله های محلی (قله های کوتاه تر) رو هم تشخیص بدی. به این صورت که هر وقت عددِ خونده شده (فیلتر شده) از یه حدی کمتر شد، عملِ پیدا کردنِ قله از نو شروع بشه.
                      بیایید با Google آشتی کنیم!

                      دیدگاه


                        #12
                        پاسخ : رفع نویز های adc

                        سلام
                        آقا یه چیزی میگم شاید به حل مشکل ارتباطی نداشته باشه
                        شما در اینجا از تابع ADC_ChannelGetData(LPC_ADC,chanal) برای خواندن هر بار مقدار آنالوگ استفاده کرده اید که درون تابعتان را ندیدم ولی حدس میزنم در مد نرم افزاری باشه. از مد سخت افزاری با فعال کردن burst استفاده کردید؟ برای این کار بهتر نیست؟ یا اگه فرکانس بالاتر باشه لازمه استفاده بشه؟
                        فيلم آموزشي ميکروکنترلر LPC1768
                        فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
                        فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
                        فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

                        دیدگاه


                          #13
                          پاسخ : رفع نویز های adc

                          نوشته اصلی توسط mzarkoob
                          سلام
                          آقا یه چیزی میگم شاید به حل مشکل ارتباطی نداشته باشه
                          شما در اینجا از تابع ADC_ChannelGetData(LPC_ADC,chanal) برای خواندن هر بار مقدار آنالوگ استفاده کرده اید که درون تابعتان را ندیدم ولی حدس میزنم در مد نرم افزاری باشه. از مد سخت افزاری با فعال کردن burst استفاده کردید؟ برای این کار بهتر نیست؟ یا اگه فرکانس بالاتر باشه لازمه استفاده بشه؟
                          این برا کانفیک کردن
                          کد:
                           ADC_Init(LPC_ADC, 200000);
                          	ADC_ChannelCmd(LPC_ADC,6,ENABLE);
                           ADC_ChannelCmd(LPC_ADC,4,ENABLE);
                           ADC_BurstCmd(LPC_ADC,ENABLE);
                          زیر برنامه خوندن هم مال کتابخانه های cmsis هست!!

                          کد:
                          /*********************************************************************//**
                          * @brief 		Get ADC result
                          * @param[in]	ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC
                          * @param[in]	channel: channel number, should be 0...7
                          * @return 		Data conversion
                          **********************************************************************/
                          uint16_t ADC_ChannelGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel)
                          {
                          	uint32_t adc_value;
                          
                          	CHECK_PARAM(PARAM_ADCx(ADCx));
                          	CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel));
                          
                          	adc_value = *(uint32_t *) ((&ADCx->ADDR0) + channel);
                          	return ADC_DR_RESULT(adc_value);
                          }
                          حالا این چه مدی بید؟؟
                          نیاز به اصلاح داره؟؟
                          انجام پروژه هاي برنامه نويسي اندرويد
                          [glow=red,2,300]نرم افزار نقشه هاي پاور کامپيوتر اندوريد[/glow]
                          http://cafebazaar.ir/app/?id=com.atxdroid

                          دیدگاه

                          لطفا صبر کنید...
                          X