اطلاعیه

Collapse
No announcement yet.

نویز شدید در خروجی adc میکرو LPC1768

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

    #31
    پاسخ : نویز شدید در خروجی adc میکرو LPC1768

    نوشته اصلی توسط اشکان غفارزاده نمایش پست ها
    همین جوری نمیان یه سیگنال رو نمونه برداری کنن بعد همون رو بدون هیچ فیلتر نرم افزاری یا سخت افزاری استفاده کنن.
    برای نمونه برداری باید قسمت فیلتر و رفرنس ADC متناسب با استفاده مورد نظر باشه.
    سینگنال ورودی دارای فیلتر باشه!!!
    بعد از نمونه برداری مقادیر فیلتر نرم افزاری بشن....
    بعد از بازسازی سیگنال و پردازش اون و اعمال به خروجی میکروکنتر توسط فیلتر باز هم هارمونیک ها و سیگنال های مزاحم فیلتر و سینگنال نهایی بافر بشه....
    از همه مهم تر برنامه و مدار کالیبره بشن و مقادیر توسط یک دستگاه اندازه گیری مرجع که کالیبره هست بررسی بشه نه با یک دستگاه 100تومنی بیایم انتظار بی جا داشته باشیم....
    بخش تغذیه هم جای خود داره!!!
    شما خروجی ,ولتاژ یک پورت USB رو با یک اسیلوسکپ خوب مانیتور کن بعد بگو پاور نویز نداره!!! اصلا ماهیت نویز رو خبر ندارید هی دارید میگید که بیایم "سرکوبش" کنیم
    هر موقع این موارد رو انجام دادید بیاید و بگید که نمیدونم میکرو مشکل داره یا برد!!!

    این هم نمونه برداری و بازسازی برق شهری که مربوط به برق یک مجتمع تجاری با انواع اقسام مصرف کننده در واحد های مختلف هست . تنها فیلتر اعمالی حذف نمونه های غیر معقول سری هست که با ترکیب PID و تابع SIN صورت گرفته.(نمونه پیشرفته روش کاربر Faateh )
    بدون هیچ گونه نویز . lpc1768 ADC & DAC
    تغذیه خود برد هم از USB گرفتم که با رگواتور AMS117 به 3.3ولت برا تغذیه میکرو تبدیل شده . خازن های دیکوپلینگ و فیلتر LC هم بر سر راه رفرنس و تغذیه ADC قرار گرفته.




    سلام
    بله،مسلما داده ها نیاز به پردازش دارن
    در این میان پیش پا افتاده ترین و همه گیر ترین روشی که همه به ذهنشون میرسه و معمولا استفاده میکنن میانگین گیری هست
    اما فکر میکنم روش های خیلی بهتری هم برای این کار باشه
    الان همین روشی که خودتون گفتین چی هست؟
    در کل ممنون میشم دوستان هر کسی روشی برای میانگین گیری میشناسه معرفی کنن تا ما هم اشنا بشیم
    بنده غیر از روش میانگین گیری عادی،یه روش دیگه دیدم که توی پروتکل TCP/IP برای تخمین زمان رسیدن پاسخ بسته استفاده میشه
    تو این روش داریم:
    Value_K=(1-a)Value_K-1 + a*ADC_Value
    یعنی مقدار میانگیری شده برابر است با (مقدار قبلی میانگین گیری شده ضربدر( یک منهای یک ضریب مشخص )) بعلاوه (مقدار جدید قرائت شده از ADC ضربدر یک ضریب مشخص)
    که هر چقدر این ضریب بزرگتر باشه،تاثیر نمونه های جدید بیشتر و تاثیر نمونه های قبلی کمتر میشه
    ................Fx7SAM................

    دیدگاه


      #32
      پاسخ : نویز شدید در خروجی adc میکرو LPC1768

      نوشته اصلی توسط antipa نمایش پست ها
      سلام - سلام مهندسین عزیز . من هم همین مشکل را داشتم . بعد از بررسی های و آزمایش های مختلف به این نتیجه رسیدم این نویز برق شهر هست . و همچنین نویز پورت لبتاب . اگه می خوای این نویز حذف بشه یک ) از باتری به جای برق شهر استفاده کن - دو ) برای استفاده ازکارت اسکوپتون یک USB ایزوله تهیه ک - یا دیتاتو تبدیل کن به یوزارت و توسط ای سی 6N137 دیتاتو ایزوله کن و تو کامپیوتر با نرم افزار سی شارپ یک اسکوپ درست کن د
      بخش ایزولاسیون خیلی در ایران کم کار شده؛ کلی از مدارات مشکل ایزولاسیون دارند ولی درک سخت و قیمت زیاد ایزولاسیون در ایران باعث میشود در مدارت کمتر دیده بشود.
      یکی از مشکلاتی که من خیلی زیاد دیدم ، بحث اختلاف ولتاژ بین earth و نول هست، این به دلیل بالانس نبودن خطوط ایجاد میشود و کلی مشکل دیگر در سیم کشی ها باعث می شود مدارات نمونه برداری به خوبی کار نکنند و نویزشان زیاد باشد.

      دیدگاه


        #33
        پاسخ : نویز شدید در خروجی adc میکرو LPC1768

        نوشته اصلی توسط اشکان غفارزاده نمایش پست ها
        همین جوری نمیان یه سیگنال رو نمونه برداری کنن بعد همون رو بدون هیچ فیلتر نرم افزاری یا سخت افزاری استفاده کنن.
        از همه مهم تر برنامه و مدار کالیبره بشن و مقادیر توسط یک دستگاه اندازه گیری مرجع که کالیبره هست بررسی بشه نه با یک دستگاه 100تومنی بیایم انتظار بی جا داشته باشیم....
        بخش تغذیه هم جای خود داره!!!
        شما خروجی ,ولتاژ یک پورت USB رو با یک اسیلوسکپ خوب مانیتور کن بعد بگو پاور نویز نداره!!! اصلا ماهیت نویز رو خبر ندارید هی دارید میگید که بیایم "سرکوبش" کنیم
        هر موقع این موارد رو انجام دادید بیاید و بگید که نمیدونم میکرو مشکل داره یا برد!!!
        این هم نمونه برداری و بازسازی برق شهری که مربوط به برق یک مجتمع تجاری با انواع اقسام مصرف کننده در واحد های مختلف هست . تنها فیلتر اعمالی حذف نمونه های غیر معقول سری هست که با ترکیب PID و تابع SIN صورت گرفته.(نمونه پیشرفته روش کاربر Faateh )
        بدون هیچ گونه نویز . lpc1768 ADC & DAC
        دوست عزیز همین جوری نمیان برای فیلتر کردن سیگنال ورودی صد رقم کد مختلف رو بنویسن و صد رقم نمونه بگیرن بهتره کل پروژه یکجا بررسی شه
        برای میکرو LPC که نهایت سرعت نمونه برداری 200 هزار داره با این روش نمیشه روی سیگنال های صدا کار کرد . با این فیلتر نرم افزاری که شما گفتی
        سرعت نمونه های خروجی به شدت پایین میاد .!!!!
        ضمنا قرار نیست حتما اسکپ های خوب و درجه 1 مثل اون چیزی که شما دارید رو استفاده کرد . . . بنابراین نباید انتظار داشت برای یه مانیتورینگ از یه شکل موج
        یه اسکپ همه چی تموم برداریم بیاریم چون انتظار بی جایی هست
        کل پروژه فقط یه نمونه برداری ساده نیست که با چند تا فیلتر نرم افزاری مشکل حل بشه بره پی کارش !!!!!
        بهر حال چیزی که مشخصه اینه که به طرز عجیبی در اندازه گیری ADC نویزهای بسیار زیاد و قوی وجود داره مطابق اون چه که نگاه کردید . . .
        که البته این مسئله برای دوستان دیگه هم پیش اومده که در تاپیک ذکر کردند

        حالا اگه بازم مشکلی بود میتونید راهنمایی کنید.
        دوست عزیز شما برید ابتدای تاپیک رو بخونید ببینید بحث سر چی بوده بعد بیاید بگید باید فیلتر نرم افزاری و توابع . . . رو اجرا کرد که البته دارم میگم حرف بنده و دیگر دوستان اینه که
        چیکار بایدکرد که اصلا این نویز در اندازه گیری ADC به حداقل برسه نه این که بریم با صد رقم کد مختلف سرعت میکرو رو بگیریم که میخوایم یه فیلتر درست کنیم !!!!!
        یادم نمیاد با میکرو AVR به چنین مسئله ای برخورده باشم برای همین اصرار دارم که این مسئله ریشه ای حل شه نه این که بیایم ماس مالی کنیم بره پی کارش . . . !!!
        بعد از همه اینا میشه به کار روی فیلتر های نرم افزاری که شما دوست عزیز پیشنهاد دادید فکر کرد . . .
        با تشکر به خاطر وقتی که میزارید .

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

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

        آرزوی سرافرازی برای ایران عزیز . . .


        دیدگاه


          #34
          پاسخ : نویز شدید در خروجی adc میکرو LPC1768

          سلام
          تا به جال دیباگ کردید ببینید مقادیری که فرمودید 72 مگ و 9 مگ درست هستند
          در ضمن شما که زحمت کشیدید تصویر گذاشتید
          کد برنامه رو هم می گذاشتید شاید دوستانی که برنامه نویسی قوی تری دارند و تجربه بیش تری دارند علت رو در این قسمت پیدا کنند شاید رجیستری به خوبی تنظیم نشده باشد
          من خودم خیلی وقته با 1768 کار نکردم ولی قبلا با همین هدربردی که شما گذاشته بودید کار کردم و مشکلی نداشتم
          اللهم صل علی محمد و ال محمد و عجل فرجهم
          پیامبر اکرم(ص):زکات علم نشر آن است.
          در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

          دیدگاه


            #35
            پاسخ : نویز شدید در خروجی adc میکرو LPC1768

            دوستان به نظرم مشکل اصلی رو تا حد زیادی پیدا کردم
            قبلا فکر میکردم مشکل از میکرو هست البته بعضی دوستان همین رو اذعان داشتن . . .
            آقا من تغذیه هدر برد LPC1768 رو از پورت usb کامپیوتر گرفتم ضمنا از ماژول pl2303 برای ارتباطات سریال استفاده کردم که تغذیه این ماژول هم از پورت usb گرفته میشه
            حالا اتفاقی فهمیدم که این ماژول نویز بسیار عجیبی مطابق عکس های قرار داده شده در پست های قبلی تولید میکنه که روی اندازه گیری adc تاثیر میزاره
            اومدم کلا ماژول رو برداشتم ( تغذیه ماژول رو قطع کردم ) تا حد بسیار زیادی نویز ها برطرف شدن
            حالا که دوباره وصلش میکنم دوباره نویز ها سرو کلشون پیدا میشه !!!!
            این مسئله یکم عجیبه چون تغذیه ماژول و هدر برد هر کدوم از یه پورت جداگانه گرفته میشه نه این که دوتای اینا رو به هم وصل کرده باشم
            یعنی ماژول هیچ ارتباطی با مدار نداره و فقط به خاطر این که تغذیه وصل میشه نویز های عجیبی به وجود میاد که تو مقدار خروجی ADC تاثیر میزاره و وقتی رو DAC مقادیر رو میزارم
            و میدم به آمپلی فایر تو اسپیکر صداشون مشخصه . . . !!!!!!

            فقط یه سوال ؟؟؟؟
            چرا وقتی ولتاژ پایه ورودی adc رو مانیتور میکنم و یا یه نمونه میگیرم میدم به آمپلی فایر هیچ نویزی نه تو اسکپ مشخصه نه از اسپیکر هیچ نویزی شنیده میشه .
            اما نویز در مقادیر اندازه گیری شده adc ظاهر میشه !!!! ؟؟؟؟

            دقت کنید دوباره میگم
            عرض کردم وقتی سیگنال صدایی که به ورودی adc وصله رو مانیتور میکنم هیچ نویزی نیست ( یه سیگنال سینوسی خالص دادم ) و حتی وقتی یه نمونه میگیرم
            به آمپلی فایر میدم هیچ نویزی در اسپیکر نیست اما در خروجی اندازه گیری شده adc نویز به وجود میاد !!!!!!
            این مسئله که خروجی adc همراه با نویز هست تایید شده قبلا یعنی میخوام بگم مشکل از dac نیست
            الان صدایی که به میکرو دادم رو از dac دارم میگیرم بیشتر نویز ها با قطع تغذیه ماژ ول pl2303 برطرف شده اما همچنان نویز های کمی به گوش میرسه که
            از قماش همون نویز های قبلی هست
            بنابراین مشکل اصلی رو پیدا کردم اما همچنان نویز هایی وجود داره که باید اونا هم برطرف بشه
            ضمنا از فیلتر های نرم افزاری استفاده کردم اما هم تعداد نمونه های خروجی کم شد هم اخر سر نتیجه دلخواه رو به من نداد . . .

            بنابراین باید همین نویز های کمی هم که وجود داره رو برطرف کرد . . .
            نمونه کد ها رو قرار میدم دوستان راهنمایی کنن
            کد:
            [FONT=Yekan] // clock frequency is set to  ... 72 MHZ ...[/FONT] 
            [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=include"]#include[/URL] "LPC17xx.h"
            
            
             uint32_t read_adc(void)
               {
               uint32_t i;
               LPC_ADC->ADCR|=0x01000000;   //start conversion
               while((LPC_ADC->ADDR4 & 0x80000000) == 0);  // wait for end of conversion check DONE bit
                
                i=LPC_ADC->ADDR4;      // read AD data register
                return (i>>4);
               }
                
             main (void)
              {
                uint32_t value,str_value;
            
            
                LPC_SC->PCONP |=(1<<12);              // TURN ADC ON
                LPC_PINCON->PINSEL3=0x30000000;     // set pin1.30 as input adc(4)
                LPC_SC->PCLKSEL0|=0x01000000;       // perigheral clk = cpu clk/1
                LPC_ADC->ADCR=0x00200510;           //select adc(4)
                
                LPC_SC->PCLKSEL0|=0x00C00000;  
                LPC_PINCON->PINSEL1|=0x00200000; //select AOUT for p0.26
                
                //*************************************************************
                
                while(1)
                {
                 
                   value=read_adc();
                   str_value=value/4;   // value resolusion change to 10 bit
                
                   LPC_DAC->DACR= (str_value)<<6;
                }
            [FONT=Yekan] }[/FONT]

            دوستان الان که بررسی کردم دیدم همون یه ذره نویر هایی هم که وجود داشتن از کارت اسکپی بود که استفاده میکنم
            یعنی با وصل کردن تنها و تنها یکی از سیم های ورودی اسکپ حتی به زمین مدار ( چه سیم زمین اسکپ چه سیم ورودی اسکپ ) اون نویز ها به وجود میان

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

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

            نتیجه گیری :

            حتی با وجود این که تغذیه مدار رو به طور کامل از باتری میگیرم ( 4 تا باتری 1.5 ولت سری شدن و وصل شدن به ورودی 5 ولت هدر LPC1768 )
            به محض وصل کردن تنها تغذیه ماژول PL2303 به پورت USB جلو کیس کامپیوتر (در حالی که ماژول از مدار کاملا جدا هست ) باعث تولید
            نویز های زیادی میشه که کاملا محسوس هست حالا ماژول رو به پورت پشتی کیس متصل کردم دیگه خبری از نویز نیست
            الانم که دوباره امتحان میکنم بازم همینه
            حالا دلیل : من خروجی سیگنال سینوسی رو از جک خروجی جلو کیس گرفتم و به ورودی ADC میکرو دادم
            همین که مازول رو به پورت USB وصل میکنم نویزها دوباره میاد یعنی ماژول نویزی رو به دلیل مجاور بودن جک خروجی جلو کیس و پورت USB جلو کیس
            روی جک خروجی صدا میندازه . . . این یه مشکل که برطرف شد.


            نکته ی دیگه به محض اتصال ورودی کارت اسکپ حتی به زمین مدار بله به زمین مدار باعث تولید نویز هایی میشه که اونم محسوس هست
            کارت اسکپ از طریق پورت USB به پشت کیس متصل هست .

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

            مثلا چرا وقتی سیم ورودی اسکپ رو به زمین مدار وصل میکنم نویزهاییی شنیده میشه ؟؟؟؟؟!!!!!


            حالا دوستانی که دلیلش رو میدونن بیان و به این ابهام ها پاسخ بدن . . .

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

            سپاس از همگی
            جدیدترین ویرایش توسط rezamajdi; ۱۴:۵۲ ۱۳۹۷/۰۴/۰۹.
            آرزوی سرافرازی برای ایران عزیز . . .


            دیدگاه


              #36
              پاسخ : نویز شدید در خروجی adc میکرو LPC1768

              به نظرم از این مدل کد زدن بپرهیزید و سعی کنید از CMSIS و هدر های استاندارد استفاده کنید. خواندن این کدها سخت است.
              به ظاهر شما فرکانسی که ADC دادید برابر فراکانس سیستم هست یعنی 72 مگ
              در حالی که دیتا شیت در صفحه 66 ماکسیمم فرکانس ورودی را 13 مگ در نظر گرفته است.

              در صفحه 53 هم در یکی ازتست های استانداد که جریان را اندازه گیری کرده
              کاندیشن تست
              PCLK = 12 MHz for CCLK = 12 MHzand 48 MHz; PCLK = 12.5 MHz forCCLK = 100 MHz
              یعنی PCLKبیشتر از 12 مگ نداده، احتمالا برای شما ADC میکرو به شدت به هم ریخته!

              دیدگاه


                #37
                پاسخ : نویز شدید در خروجی adc میکرو LPC1768

                نوشته اصلی توسط Faateh نمایش پست ها
                به نظرم از این مدل کد زدن بپرهیزید و سعی کنید از CMSIS و هدر های استاندارد استفاده کنید. خواندن این کدها سخت است.
                به ظاهر شما فرکانسی که ADC دادید برابر فراکانس سیستم هست یعنی 72 مگ
                در حالی که دیتا شیت در صفحه 66 ماکسیمم فرکانس ورودی را 13 مگ در نظر گرفته است.

                در صفحه 53 هم در یکی ازتست های استانداد که جریان را اندازه گیری کرده
                کاندیشن تست
                PCLK = 12 MHz for CCLK = 12 MHzand 48 MHz; PCLK = 12.5 MHz forCCLK = 100 MHz
                یعنی PCLKبیشتر از 12 مگ نداده، احتمالا برای شما ADC میکرو به شدت به هم ریخته!
                دوست عزیز کلاکی که به ADC دادم دقیقا 12 مگا هرتز هست و الان مدار و برنامه بدون هیچ مشکلی کار میکنن
                یعنی کلاکی که به ADC دادم میشه 72 که بر عدد 5+1 تقسیم شده ( رجیستر ADCR )
                سپاس از توجهی که دارید
                جدیدترین ویرایش توسط rezamajdi; ۱۴:۵۸ ۱۳۹۷/۰۴/۰۹.
                آرزوی سرافرازی برای ایران عزیز . . .


                دیدگاه


                  #38
                  پاسخ : نویز شدید در خروجی adc میکرو LPC1768

                  اگر 72 درست باشه این حرف شما درست هست.
                  یک نکته برای تابع read adc ، بیت اورران را چک کنید. احتمال دارد مشکل اورران ADC باشد
                  و خروجی را حتما با 0xfff ،د ANDکنید.
                  AD_last = (LPC_ADC->ADGDR >> 4) & 0xFFF; /* Store converted value */

                  فعلا برای تست فرکانس را پایین تر بیاورید مثلا 2 مگ که در مرز ها نباشد، اگر ممکن هست با چنین فرکانسی بیبینید نویز دارد یا نه؟

                  دیدگاه


                    #39
                    پاسخ : نویز شدید در خروجی adc میکرو LPC1768

                    نوشته اصلی توسط Faateh نمایش پست ها
                    اگر 72 درست باشه این حرف شما درست هست.
                    یک نکته برای تابع read adc ، بیت اورران را چک کنید. احتمال دارد مشکل اورران ADC باشد
                    و خروجی را حتما با 0xfff ،د ANDکنید.
                    AD_last = (LPC_ADC->ADGDR >> 4) & 0xFFF; /* Store converted value */

                    فعلا برای تست فرکانس را پایین تر بیاورید مثلا 2 مگ که در مرز ها نباشد، اگر ممکن هست با چنین فرکانسی بیبینید نویز دارد یا نه؟
                    سلام

                    بیت OVERRUN که مال مد BURST هست . شاید منظورتون بیت DONE باشه که پس از تکمیل عملیات تبدیل 1 میشه و با خوندنش به طور خودکار پاک میشه
                    ؟؟؟؟؟؟
                    دلیل این که باید خروجی رو با 0xfff اد کنم چیه ؟؟؟ یعنی ممکنه غیر این 12 بیت بیتهای دیگه هم 1 شده باشن ؟؟؟!!!!
                    قاعدتا نباید این طوری باشه ببینید درست شده که البته تست کردم فرقی نداشت
                    کد:
                     uint32_t read_adc(void)   {
                       uint32_t i;
                       LPC_ADC->ADCR|=0x01000000;   //start conversion
                       while((LPC_ADC->ADDR4 & 0x80000000) == 0);  // wait for end of conversion check DONE bit
                        
                    	i=LPC_ADC->ADDR4;	  // read AD data register
                    	return ((i>>4)&0xFFF);
                    
                       }[FONT=Yekan][/FONT]


                    جدیدترین ویرایش توسط rezamajdi; ۱۶:۱۴ ۱۳۹۷/۰۴/۰۹.
                    آرزوی سرافرازی برای ایران عزیز . . .


                    دیدگاه


                      #40
                      پاسخ : نویز شدید در خروجی adc میکرو LPC1768

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

                      دیدگاه


                        #41
                        پاسخ : نویز شدید در خروجی adc میکرو LPC1768

                        من کد adc_poling_test.c که مال CMSIS هست رو تغییر دادم و یک سینوسی از DAC تولید کردم و با ADC آن را اندازه گرفتم هیچ نویزی وجود ندارد!
                        پایه P0.25 به ADC وP0.26 به DACمتصل است. و در سخت افزار من دو را به هم متصل کردم تا مقادیر خروجی DAC با ADC اندازه گیری شود.
                        کد:
                        /**********************************************************************
                        * $Id$        adc_polling_withDAC_test.c            2010-05-21
                        *//**
                        * @file        adc_polling_withDAC_test.c
                        * @brief    This example describes how to use ADC conversion in
                        *             polling mode
                        * @version    2.0
                        * @date        21. May. 2010
                        * @[URL="https://www.eca.ir/forums/member.php?u=19064"]autho[/URL]r    NXP MCU SW Application Team
                        *
                        * Copyright(C) 2010, NXP Semiconductor
                        * All rights reserved.<div style="text-align: center"></div>
                        *
                        ***********************************************************************
                        * Software that is described herein is for illustrative purposes only
                        * which provides customers with programming information regarding the
                        * products. This software is supplied "AS IS" without any warranties.
                        * NXP Semiconductors assumes no responsibility or liability for the
                        * use of the software, conveys no license or title under any patent,
                        * copyright, or mask work right to the product. NXP Semiconductors
                        * reserves the right to make changes in the software without
                        * notification. NXP Semiconductors also make no representation or
                        * warranty that such application will be suitable for the specified
                        * use without further testing or modification.
                        * Permission to use, copy, modify, and distribute this software and its
                        * documentation is hereby granted, under NXP Semiconductors'
                        * relevant copyright in the software, without fee, provided that it
                        * is used in conjunction with NXP Semiconductors microcontrollers.  This
                        * copyright, permission, and disclaimer notice must appear in all copies of
                        * this code.
                        **********************************************************************/
                        #include "lpc17xx_adc.h"
                        #include "lpc17xx_libcfg.h"
                        #include "lpc17xx_pinsel.h"
                        #include "debug_frmwrk.h"
                        #include "lpc17xx_dac.h"
                        #include "lpc17xx_gpdma.h"
                        #include "stdio.h"
                        
                        
                        /* Example group ----------------------------------------------------------- */
                        /** @defgroup ADC_Polling    Polling
                         * @ingroup ADC_Examples
                         * @{
                         */
                        
                        
                        
                        
                        //**************************function decleration/**************************/
                        int dac_config(void);
                        
                        
                        /************************** PRIVATE MACROS *************************/
                        /** DMA size of transfer */
                        #define DMA_SIZE        60
                        #define NUM_SINE_SAMPLE    60
                        #define SINE_FREQ_IN_HZ    60
                        #define PCLK_DAC_IN_MHZ    25 //CCLK divided by 4
                        
                        
                        /************************** PRIVATE VARIABLES *************************/
                        GPDMA_Channel_CFG_Type GPDMACfg;
                        
                        
                        int fputc(int ch, FILE *f)
                        {
                             return (ITM_SendChar(ch));
                        }
                        
                        
                        
                        
                        /************************** PRIVATE DEFINITIONS ***********************/
                        #define MCB_LPC_1768
                        //#define IAR_LPC_1768
                        
                        
                        #ifdef MCB_LPC_1768
                        #define _ADC_INT            ADC_ADINTEN2
                        #define _ADC_CHANNEL        ADC_CHANNEL_2
                        #elif defined (IAR_LPC_1768)
                        #define _ADC_INT            ADC_ADINTEN5
                        #define _ADC_CHANNEL        ADC_CHANNEL_5
                        #endif
                        
                        
                        /************************** PRIVATE VARIABLES *************************/
                        uint8_t menu1[] =
                        "********************************************************************************\n\r"
                        "Hello NXP Semiconductors \n\r"
                        " ADC demo \n\r"
                        "\t - MCU: LPC1768 \n\r"
                        "\t - Core: ARM CORTEX-M3 \n\r"
                        "\t - Communicate via: UART0 - 115200 bps \n\r"
                        " Use ADC with 12-bit resolution rate of 200KHz, read in polling mode\n\r"
                        " To get ADC value and display via UART0\n\r"
                        " Turn the potentiometer to see how ADC value changes\n\r"
                        "********************************************************************************\n\r";
                        
                        
                        
                        
                        /************************** PRIVATE FUNCTION *************************/
                        void print_menu(void);
                        
                        
                        /*-------------------------PRIVATE FUNCTIONS------------------------------*/
                        /*********************************************************************//**
                         * @brief        Print menu
                         * @[URL="https://www.eca.ir/forums/member.php?u=17545"]para[/URL]m[in]    None
                         * @return         None
                         **********************************************************************/
                        void print_menu(void)
                        {
                            _DBG(menu1);
                        }
                        
                        
                        
                        
                        /*-------------------------MAIN FUNCTION------------------------------*/
                        /*********************************************************************//**
                         * @brief        c_entry: Main ADC program body
                         * @[URL="https://www.eca.ir/forums/member.php?u=17545"]para[/URL]m[in]    None
                         * @return         int
                         **********************************************************************/
                        uint32_t j=0;
                        
                        
                        uint32_t adc_value[2000];
                        int c_entry(void)
                        {
                            uint32_t tmp;
                            int i;
                            
                            while(1)
                            {
                                for(i=0; i < 2000; i++)
                                {
                                    // Start conversion
                                    ADC_StartCmd(LPC_ADC,ADC_START_NOW);
                                    //Wait conversion complete
                                    while (!(ADC_ChannelGetStatus(LPC_ADC,_ADC_CHANNEL,ADC_DATA_DONE)));
                                    adc_value[i] = ADC_ChannelGetData(LPC_ADC,_ADC_CHANNEL);
                                }
                                
                                
                                for(i=0; i < 2000; i++)
                                {
                                    //printf("%d\n\r",adc_value[i]);
                                }
                                
                                //Display the result of conversion on the UART0
                                //printf("%d\n\r",adc_value[0]);
                                //_DBG("ADC value on channel 2: ");
                                //_DBD32(adc_value[0]);
                                //_DBG_("");
                                //delay
                                //j ++;
                                for(tmp = 0; tmp < 1000000; tmp++);
                            }
                        }
                        int dac_single_entry(void);
                        /* Support required entry point for other toolchain */
                        int main (void)
                        {
                            PINSEL_CFG_Type PinCfg;    
                        
                        
                            /* Initialize debug via UART0
                             * – 115200bps
                             * – 8 data bit
                             * – No parity
                             * – 1 stop bit
                             * – No flow control
                             */
                            debug_frmwrk_init();
                        
                        
                            // print welcome screen
                            print_menu();
                        
                        
                            /* Initialize ADC ----------------------------------------------------*/
                        
                        
                            /*
                             * Init ADC pin connect
                             * AD0.2 on P0.25
                             */
                            PinCfg.Funcnum = 1;
                            PinCfg.OpenDrain = 0;
                            PinCfg.Pinmode = 0;
                            PinCfg.Pinnum = 25;
                            PinCfg.Portnum = 0;
                            PINSEL_ConfigPin(&PinCfg);
                            ADC_Init(LPC_ADC, 20000);
                            ADC_IntConfig(LPC_ADC,_ADC_INT,DISABLE);
                            ADC_ChannelCmd(LPC_ADC,_ADC_CHANNEL,ENABLE);
                            
                            //**************************DAC Config/**************************/
                            //config dac for sine generation
                            dac_config();
                            
                            //Run and log DAC
                            return c_entry();
                        }
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        /*-------------------------DAC FUNCTION------------------------------*/
                        /*********************************************************************//**
                         * @brief        dac_config: Main DAC program body
                         * @[URL="https://www.eca.ir/forums/member.php?u=17545"]para[/URL]m[in]    None
                         * @return         int
                         **********************************************************************/
                        int dac_config(void)
                        {
                            PINSEL_CFG_Type PinCfg;
                            DAC_CONVERTER_CFG_Type DAC_ConverterConfigStruct;
                            GPDMA_LLI_Type DMA_LLI_Struct;
                            uint32_t tmp;
                            uint32_t i;
                            uint32_t sin_0_to_90_16_samples[16]={\
                                    0,1045,2079,3090,4067,\
                                    5000,5877,6691,7431,8090,\
                                    8660,9135,9510,9781,9945,10000\
                            };
                            uint32_t dac_sine_lut[NUM_SINE_SAMPLE];
                            /*
                             * Init DAC pin connect
                             * AOUT on P0.26
                             */
                            PinCfg.Funcnum = 2;
                            PinCfg.OpenDrain = 0;
                            PinCfg.Pinmode = 0;
                            PinCfg.Pinnum = 26;
                            PinCfg.Portnum = 0;
                            PINSEL_ConfigPin(&PinCfg);
                        
                        
                            //Prepare DAC sine look up table
                            for(i=0;i<NUM_SINE_SAMPLE;i++)
                            {
                                if(i<=15)
                                {
                                    dac_sine_lut[i] = 512 + 512*sin_0_to_90_16_samples[i]/10000;
                                    if(i==15) dac_sine_lut[i]= 1023;
                                }
                                else if(i<=30)
                                {
                                    dac_sine_lut[i] = 512 + 512*sin_0_to_90_16_samples[30-i]/10000;
                                }
                                else if(i<=45)
                                {
                                    dac_sine_lut[i] = 512 - 512*sin_0_to_90_16_samples[i-30]/10000;
                                }
                                else
                                {
                                    dac_sine_lut[i] = 512 - 512*sin_0_to_90_16_samples[60-i]/10000;
                                }
                                dac_sine_lut[i] = (dac_sine_lut[i]<<6);
                            }
                            //Prepare DMA link list item structure
                            DMA_LLI_Struct.SrcAddr= (uint32_t)dac_sine_lut;
                            DMA_LLI_Struct.DstAddr= (uint32_t)&(LPC_DAC->DACR);
                            DMA_LLI_Struct.NextLLI= (uint32_t)&DMA_LLI_Struct;
                            DMA_LLI_Struct.Control= DMA_SIZE
                                                    | (2<<18) //source width 32 bit
                                                    | (2<<21) //dest. width 32 bit
                                                    | (1<<26) //source increment
                                                    ;
                        
                        
                            /* GPDMA block section -------------------------------------------- */
                            /* Initialize GPDMA controller */
                            GPDMA_Init();
                        
                        
                            // Setup GPDMA channel --------------------------------
                            // channel 0
                            GPDMACfg.ChannelNum = 0;
                            // Source memory
                            GPDMACfg.SrcMemAddr = (uint32_t)(dac_sine_lut);
                            // Destination memory - unused
                            GPDMACfg.DstMemAddr = 0;
                            // Transfer size
                            GPDMACfg.TransferSize = DMA_SIZE;
                            // Transfer width - unused
                            GPDMACfg.TransferWidth = 0;
                            // Transfer type
                            GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_M2P;
                            // Source connection - unused
                            GPDMACfg.SrcConn = 0;
                            // Destination connection
                            GPDMACfg.DstConn = GPDMA_CONN_DAC;
                            // Linker List Item - unused
                            GPDMACfg.DMALLI = (uint32_t)&DMA_LLI_Struct;
                            // Setup channel with given parameter
                            GPDMA_Setup(&GPDMACfg);
                        
                        
                            DAC_ConverterConfigStruct.CNT_ENA =SET;
                            DAC_ConverterConfigStruct.DMA_ENA = SET;
                            DAC_Init(LPC_DAC);
                            /* set time out for DAC*/
                            tmp = (PCLK_DAC_IN_MHZ*1000000)/(SINE_FREQ_IN_HZ*NUM_SINE_SAMPLE);
                            DAC_SetDMATimeOut(LPC_DAC,tmp);
                            DAC_ConfigDAConverterControl(LPC_DAC, &DAC_ConverterConfigStruct);
                        
                        
                            // Enable GPDMA channel 0
                            GPDMA_ChannelCmd(0, ENABLE);
                            i = 100000;
                            while (i>1)
                            {i--;};
                            
                            return 0;
                        }
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        #ifdef  DEBUG
                        /*******************************************************************************
                        * @brief        Reports the name of the source file and the source line number
                        *                 where the CHECK_PARAM error has occurred.
                        * @[URL="https://www.eca.ir/forums/member.php?u=17545"]para[/URL]m[in]    file Pointer to the source file name
                        * @[URL="https://www.eca.ir/forums/member.php?u=17545"]para[/URL]m[in]    line assert_param error line source number
                        * @return        None
                        *******************************************************************************/
                        void check_failed(uint8_t *file, uint32_t line)
                        {
                            /* User can add his own implementation to report the file name and line number,
                             ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
                        
                        
                            /* Infinite loop */
                            while(1);
                        }
                        #endif
                        
                        
                        /*
                         * @}
                         */
                        جدیدترین ویرایش توسط Faateh; ۱۷:۵۶ ۱۳۹۷/۰۴/۱۰.

                        دیدگاه


                          #42
                          پاسخ : نویز شدید در خروجی adc میکرو LPC1768

                          سلام
                          پس تا این جا به این شکل شد
                          تغذیه هدر برد از USB پشت کیس
                          اتصال کارت اسکوپ به USB پشت کیس
                          ماژول pl2303 هم به پشت کیس متصل هستند
                          درسته ؟؟؟
                          اللهم صل علی محمد و ال محمد و عجل فرجهم
                          پیامبر اکرم(ص):زکات علم نشر آن است.
                          در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

                          دیدگاه


                            #43
                            پاسخ : نویز شدید در خروجی adc میکرو LPC1768

                            نوشته اصلی توسط rezamajdi نمایش پست ها
                            دوستان به نظرم مشکل اصلی رو تا حد زیادی پیدا کردم
                            قبلا فکر میکردم مشکل از میکرو هست البته بعضی دوستان همین رو اذعان داشتن . . .
                            آقا من تغذیه هدر برد LPC1768 رو از پورت usb کامپیوتر گرفتم ضمنا از ماژول pl2303 برای ارتباطات سریال استفاده کردم که تغذیه این ماژول هم از پورت usb گرفته میشه
                            حالا اتفاقی فهمیدم که این ماژول نویز بسیار عجیبی مطابق عکس های قرار داده شده در پست های قبلی تولید میکنه که روی اندازه گیری adc تاثیر میزاره
                            اومدم کلا ماژول رو برداشتم ( تغذیه ماژول رو قطع کردم ) تا حد بسیار زیادی نویز ها برطرف شدن
                            حالا که دوباره وصلش میکنم دوباره نویز ها سرو کلشون پیدا میشه !!!!
                            این مسئله یکم عجیبه چون تغذیه ماژول و هدر برد هر کدوم از یه پورت جداگانه گرفته میشه نه این که دوتای اینا رو به هم وصل کرده باشم
                            یعنی ماژول هیچ ارتباطی با مدار نداره و فقط به خاطر این که تغذیه وصل میشه نویز های عجیبی به وجود میاد که تو مقدار خروجی ADC تاثیر میزاره و وقتی رو DAC مقادیر رو میزارم
                            و میدم به آمپلی فایر تو اسپیکر صداشون مشخصه . . . !!!!!!

                            فقط یه سوال ؟؟؟؟
                            چرا وقتی ولتاژ پایه ورودی adc رو مانیتور میکنم و یا یه نمونه میگیرم میدم به آمپلی فایر هیچ نویزی نه تو اسکپ مشخصه نه از اسپیکر هیچ نویزی شنیده میشه .
                            اما نویز در مقادیر اندازه گیری شده adc ظاهر میشه !!!! ؟؟؟؟

                            دقت کنید دوباره میگم
                            عرض کردم وقتی سیگنال صدایی که به ورودی adc وصله رو مانیتور میکنم هیچ نویزی نیست ( یه سیگنال سینوسی خالص دادم ) و حتی وقتی یه نمونه میگیرم
                            به آمپلی فایر میدم هیچ نویزی در اسپیکر نیست اما در خروجی اندازه گیری شده adc نویز به وجود میاد !!!!!!
                            این مسئله که خروجی adc همراه با نویز هست تایید شده قبلا یعنی میخوام بگم مشکل از dac نیست
                            الان صدایی که به میکرو دادم رو از dac دارم میگیرم بیشتر نویز ها با قطع تغذیه ماژ ول pl2303 برطرف شده اما همچنان نویز های کمی به گوش میرسه که
                            از قماش همون نویز های قبلی هست
                            بنابراین مشکل اصلی رو پیدا کردم اما همچنان نویز هایی وجود داره که باید اونا هم برطرف بشه
                            ضمنا از فیلتر های نرم افزاری استفاده کردم اما هم تعداد نمونه های خروجی کم شد هم اخر سر نتیجه دلخواه رو به من نداد . . .

                            بنابراین باید همین نویز های کمی هم که وجود داره رو برطرف کرد . . .
                            نمونه کد ها رو قرار میدم دوستان راهنمایی کنن
                            کد:
                            [FONT=Yekan] // clock frequency is set to  ... 72 MHZ ...[/FONT] 
                            [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=include"]#include[/URL] "LPC17xx.h"
                            
                            
                             uint32_t read_adc(void)
                               {
                               uint32_t i;
                               LPC_ADC->ADCR|=0x01000000;   //start conversion
                               while((LPC_ADC->ADDR4 & 0x80000000) == 0);  // wait for end of conversion check DONE bit
                                
                                i=LPC_ADC->ADDR4;      // read AD data register
                                return (i>>4);
                               }
                                
                             main (void)
                              {
                                uint32_t value,str_value;
                            
                            
                                LPC_SC->PCONP |=(1<<12);              // TURN ADC ON
                                LPC_PINCON->PINSEL3=0x30000000;     // set pin1.30 as input adc(4)
                                LPC_SC->PCLKSEL0|=0x01000000;       // perigheral clk = cpu clk/1
                                LPC_ADC->ADCR=0x00200510;           //select adc(4)
                                
                                LPC_SC->PCLKSEL0|=0x00C00000;  
                                LPC_PINCON->PINSEL1|=0x00200000; //select AOUT for p0.26
                                
                                //*************************************************************
                                
                                while(1)
                                {
                                 
                                   value=read_adc();
                                   str_value=value/4;   // value resolusion change to 10 bit
                                
                                   LPC_DAC->DACR= (str_value)<<6;
                                }
                            [FONT=Yekan] }[/FONT]

                            دوستان الان که بررسی کردم دیدم همون یه ذره نویر هایی هم که وجود داشتن از کارت اسکپی بود که استفاده میکنم
                            یعنی با وصل کردن تنها و تنها یکی از سیم های ورودی اسکپ حتی به زمین مدار ( چه سیم زمین اسکپ چه سیم ورودی اسکپ ) اون نویز ها به وجود میان

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

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

                            نتیجه گیری :

                            حتی با وجود این که تغذیه مدار رو به طور کامل از باتری میگیرم ( 4 تا باتری 1.5 ولت سری شدن و وصل شدن به ورودی 5 ولت هدر LPC1768 )
                            به محض وصل کردن تنها تغذیه ماژول PL2303 به پورت USB جلو کیس کامپیوتر (در حالی که ماژول از مدار کاملا جدا هست ) باعث تولید
                            نویز های زیادی میشه که کاملا محسوس هست حالا ماژول رو به پورت پشتی کیس متصل کردم دیگه خبری از نویز نیست
                            الانم که دوباره امتحان میکنم بازم همینه
                            حالا دلیل : من خروجی سیگنال سینوسی رو از جک خروجی جلو کیس گرفتم و به ورودی ADC میکرو دادم
                            همین که مازول رو به پورت USB وصل میکنم نویزها دوباره میاد یعنی ماژول نویزی رو به دلیل مجاور بودن جک خروجی جلو کیس و پورت USB جلو کیس
                            روی جک خروجی صدا میندازه . . . این یه مشکل که برطرف شد.


                            نکته ی دیگه به محض اتصال ورودی کارت اسکپ حتی به زمین مدار بله به زمین مدار باعث تولید نویز هایی میشه که اونم محسوس هست
                            کارت اسکپ از طریق پورت USB به پشت کیس متصل هست .

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

                            مثلا چرا وقتی سیم ورودی اسکپ رو به زمین مدار وصل میکنم نویزهاییی شنیده میشه ؟؟؟؟؟!!!!!


                            حالا دوستانی که دلیلش رو میدونن بیان و به این ابهام ها پاسخ بدن . . .

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

                            سپاس از همگی

                            سلام
                            میشه بگی سیمی که به کارت اوسکوپ متصله ار چه نمونه ای هست
                            ببین این قسمت EMI داره یا نه ساده هست.
                            با کارت اوسکوپ تست کن اگه با سیم ساده باشه نوئیز زیادی دار
                            جدیدترین ویرایش توسط sepehr63; ۱۱:۵۵ ۱۳۹۷/۰۴/۱۱.

                            دیدگاه


                              #44
                              پاسخ : نویز شدید در خروجی adc میکرو LPC1768

                              نوشته اصلی توسط seyed saeed نمایش پست ها
                              سلام
                              پس تا این جا به این شکل شد
                              تغذیه هدر برد از USB پشت کیس
                              اتصال کارت اسکوپ به USB پشت کیس
                              ماژول pl2303 هم به پشت کیس متصل هستند
                              درسته ؟؟؟
                              سلام
                              دوست عزیز تغذیه هدر برد lpc1768 و ماژول pl2303 از جلو میگرفتم که باعث میشد نویز از طریق تغذیه وارد مدار میشد

                              تغذیه کارت اسکپ از پشت کیس . . .
                              جدیدترین ویرایش توسط rezamajdi; ۱۲:۰۲ ۱۳۹۷/۰۴/۱۱.
                              آرزوی سرافرازی برای ایران عزیز . . .


                              دیدگاه


                                #45
                                پاسخ : نویز شدید در خروجی adc میکرو LPC1768

                                میدونم .
                                متوجه منظور شما شدم . ولی شما تست کن ببین با این سیم چقدر از نوئیز باز کم میشه .

                                دیدگاه

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