- بایاس کردن ورودی AC با استفاده از تقسیمکننده مقاومت و در صورت لزوم مقیاسپذیری بالا/پایین.
- نمونه برداری سریع و دقیق با استفاده از دسترسی مستقیم به ثبت های کنترل ADC و Timer1.
- هر آنچه در مرحله شماره 1 اضافه شده است را از نتیجه تبدیل آنالوگ / دیجیتال و مربع کم کنید.
- میانگین / انباشته، فیلتر کردن زیر مشخصات VU.
- Sqrt – ریشه مربع بگیرید، Log10 – تبدیل به مقیاس دسی بل.
- نمایش دادن.
1. امیدوارم، توصیه های من را دنبال کنید و بلندگوهای USB ارزان خود را هک کنید تا "front-end" آنالوگ خوب (از پیش مونتاژ شده! ) را برای این پروژه دریافت کنید. اگر نه، پس از اینکه آهن لحیم کاری خود را به کار بیاندازید، حداقل دو مقاومت و یک کلاهک لازم است، با این فرض که صفحه نمایش را از قبل با سیم وصل کرده اید.
اولین چیز در مورد اندازه گیری AC (صوت در این دسته) در میکروکنترلر Atmel خلاص شدن از شر نیم موج منفی سیگنال ورودی است و این کاری است که مدارهای جلویی باید انجام دهند. حداقل دو گزینه وجود دارد: اصلاح AC به DC قبل از اینکه ولتاژ به ورودی آنالوگ آردوینو برسد، یا سیگنال بایاس با آفست DC خارجی. اصلاح، می تواند به خوبی با کمک طراحی خاص IC، به عنوان مثال LM3914 / 15 / 16 انجام شود. اما در این مقاله، گزینه دوم را شرح میدهم، زیرا اگر از شما بخواهم بلندگوهای خود را هک کنید و به شما بگویم که یک برد دیگر را لحیم کنید کار چندان خوبی نیست. در اینجا تنظیمات من، نسخه کمی تغییر یافته از آخرین وبلاگ است:
وقتی سیگنال ورودی AC با آفست DC مخلوط می شود، بنابراین همیشه در ناحیه مثبت باقی می ماند، (به سینوس فکر کنید ، که بین -1 و +1 تعریف شده است، اگر 1+ را اضافه کنم همیشه مثبت خواهد بود)، من فقط عمر آردوینو را ذخیره می کنم. جلوگیری از تخریب آن توسط ولتاژ منفی. وقتی آردوینو ADC تبدیل از فرم آنالوگ به دیجیتال را کامل کرد، دیگر نیازی به افست DC ندارم و باید کم شود.
توجه: ولتاژ DC فقط برای عبور صدا از ADC آردوینو اضافه شده است.
2. زیرروال نمونه برداری با فرکانس 40 کیلوهرتز اجرا می شود که برای هر برنامه ای بیش از اندازه کافی است. شما می توانید نرخ نمونه برداری را کاهش دهید تا بار CPU کمتر شود، با تنظیمات فعلی، اندازه گیری VU بیش از 50٪ مصرف می کند. نرخ نمونه برداری بالاتر خطی/دقت بهتری را در باند گسترده می دهد، در همان زمان با محتوای صوتی معمولی حتی نمونه برداری 10 کیلوهرتز دقت بهتری نسبت به 1 دسی بل ارائه می دهد. تمام مراحل ثبت ورودی در زیربرنامه وقفه، که در تنظیمات پیکربندی شده است، می رود. دو کانال تایمر 1 که برای اجرای موازی پیکربندی شدهاند، "A" وظیفه دارد ساعت را روی 40 کیلوهرتز تیز نگه دارد، و آتشهای "B" رویداد تبدیل به ADC را با همان سرعت آغاز میکنند. شروع مجدد تبدیل جدید از طریق سخت افزار کمترین نویز فاز را در مقایسه با هر روش دیگری برای انجام این کار فراهم می کند.
ADCSRB = ((1<<ADTS2)| // منبع ماشه خودکار را تنظیم می کند – تایمر/شمارنده1 مقایسه مطابقت B
(0<<ADTS1)|
(1<<ADTS0));
/* تنظیم TIMER 1 – ADC sampler */
TCCR1A = ((1<<WGM11) | (1<<WGM10)); // حالت 15، PWM سریع
TCCR1B = ((1<<WGM13) | (1<<WGM12)); // حالت 15، PWM سریع
TCCR1B |= (1<<CS10); // clk/1 پیش مقیاس.
OCR1A = SMP_TMR1؛
OCR1B = SMP_TMR1؛
TIFR1 |= (1<<OCF1B);
TIMSK1 |= (1<<OCIE1B);
3 . همانطور که در کد زیر می بینید، adc_Offst از نتیجه جدید ADC کم می شود. بسیار ساده، مقدار DC offset (adc_Offst) در setup() در هنگام راهاندازی، با استفاده از Arduino IDE "analogRead" به دست آمد. تنها مشکل این راه حل ساده این است که هیچ صدایی نباید در این لحظه (راه اندازی) در ورودی وجود داشته باشد، در غیر این صورت تمام اندازه گیری ها اشتباه خواهد بود.
4. همان قطعه کد شامل الگوریتم فیلتر VU است. سعی میکردم تا حد امکان به استاندارد نزدیک شوم، اما الزامات زمانبندی سخت (25 استفاده!) اجازه نمیدهد رضایت کامل را جلب کنم. زمان حمله بسیار نزدیک به مشخصات است، 3 میلی ثانیه یا بیشتر. واپاشی، من 200 میلی ثانیه تخمین می زنم که کمتر از 650 میلی ثانیه توصیه شده برای پیک برنامه متر (PPM) و همچنین کمتر از 300 میلی ثانیه برای VU معمولی است. محدودیت ها از ریاضی 32 بیتی اعداد صحیح، از یک طرف، و نرخ نمونه برداری بالا از طرف دیگر می آیند.