فهرست مطالب:

3 فاز ژنراتور موج سینوسی بر اساس آردوینو به دلیل: 5 مرحله
3 فاز ژنراتور موج سینوسی بر اساس آردوینو به دلیل: 5 مرحله

تصویری: 3 فاز ژنراتور موج سینوسی بر اساس آردوینو به دلیل: 5 مرحله

تصویری: 3 فاز ژنراتور موج سینوسی بر اساس آردوینو به دلیل: 5 مرحله
تصویری: جلسه 6 - آموزش الکترونیک صنعتی 2024, نوامبر
Anonim
3 فاز ژنراتور موج سینوسی بر اساس آردوینو به دلیل
3 فاز ژنراتور موج سینوسی بر اساس آردوینو به دلیل

هدف از این اشتراک گذاری کمک به کسی است که سعی می کند از عملکرد بیشتر Due + عدم وجود مرجع + برگه داده های مفید استفاده کند.

این پروژه قادر است تا 3 فاز موج سینوسی @ 256 نمونه / چرخه در فرکانس پایین (<1 کیلوهرتز) و 16 نمونه / چرخه @ فرکانس بالا (تا 20 کیلوهرتز) تولید کند ، که به اندازه کافی خوب است تا با LPF های ساده و خروجی تقریبا کامل است

فایل پیوست نسخه نهایی من نبود زیرا برخی ویژگی های دیگر را اضافه کردم ، اما هسته اصلی آن یکسان است. توجه داشته باشید که نمونه ها/چرخه کمتر از دستور بالا تنظیم شده است.

از آنجا که ظرفیت CPU از طریق رویکرد نشان داده شده در فایل پیوست به حداکثر می رسد ، من از Arduino Uno به عنوان واحد کنترل استفاده کردم ، که از وقفه خارجی Arduino Due برای انتقال مقدار فرکانس به Arduino Due استفاده می کند. علاوه بر کنترل فرکانس ، Arduino Uno دامنه (از طریق متر پتانسیل دیجیتال + OpAmp) و همچنین ورودی/خروجی را کنترل می کند-فضای زیادی برای بازی وجود دارد.

مرحله 1: ایجاد آرایه داده های سینوسی

از آنجا که محاسبه زمان واقعی نیاز به CPU دارد ، یک آرایه داده سینوسی برای عملکرد بهتر مورد نیاز است

uint32_t sin768 PROGMEM =…. در حالی که x = [0: 5375] ؛ y = 127+127*(گناه (2*pi/5376/*یا برخی از # ترجیحات شما بستگی به نیاز دارد*/))

مرحله 2: فعال کردن خروجی موازی

بر خلاف Uno ، Due مرجع محدودی دارد. با این حال ، برای ایجاد موج سینوسی 3 فاز بر اساس Arduino Uno ، اول از همه ، عملکرد به دلیل MCLK پایین آن (16 مگاهرتز در حالی که علت آن 84 مگاهرتز است) قابل تحسین نیست ، دوم ، GPIO محدود آن می تواند حداکثر 2 فاز خروجی تولید کند و شما به موارد اضافی نیاز دارید مدار آنالوگ برای تولید فاز سوم (C = -AB).

پیروی از فعال سازی GPIO بیشتر بر اساس آزمون و آزمایش+برگه داده مفید SAM3X نبود

PIOC-> PIO_PER = 0xFFFFFFE؛ // PIO controller PIO Enable register (به صفحه 656 داده ATMEL SAM3X مراجعه کنید) و https://arduino.cc/fa/Hacking/PinMappingSAM3X ، Arduino Due پین 33-41 و 44-51 فعال شدند

PIOC-> PIO_OER = 0xFFFFFFE؛ // خروجی کنترل کننده PIO ثبت نام را فعال کنید ، به p657 برگه اطلاعات ATMEL SAM3X PIOC-> PIO_OSR = 0xFFFFFFFE مراجعه کنید. // ثبت وضعیت خروجی کنترل کننده PIO ، به p658 برگه اطلاعات ATMEL SAM3X مراجعه کنید

PIOC-> PIO_OWER = 0xFFFFFFE؛ // خروجی PIO نوشتن ثبت نام را فعال کنید ، به p670 برگه اطلاعات ATMEL SAM3X مراجعه کنید

// PIOA-> PIO_PDR = 0x30000000 ؛ // اختیاری به عنوان بیمه ، به نظر نمی رسد عملکرد را تحت تاثیر قرار دهد ، پین دیجیتال 10 به PC29 و PA28 متصل می شود ، پین دیجیتال 4 به PC29 و PA28 متصل می شود ، در اینجا غیرفعال کردن PIOA #28 و 29

مرحله 3: فعال کردن وقفه

برای به حداکثر رساندن عملکرد آن ، بار CPU باید تا آنجا که ممکن است کم باشد. با این حال ، به دلیل مطابقت 1-1 بین پین CPU و پین Due ، عملیات بیت ضروری است.

می توانید الگوریتم را بیشتر بهینه کنید ، اما اتاق بسیار محدود است.

void TC7_Handler (void) {TC_GetStatus (TC2، 1)؛

t = t٪ نمونه ؛ // برای جلوگیری از سرریز t از نمونه های t به جای "if" استفاده کنید

phaseAInc = (از پیش تعیین شده*t)٪ 5376؛ // از٪ 5376 برای جلوگیری از سرریز شاخص آرایه استفاده کنید

PhaseBInc = (فاز AInc+1792)٪ 5376 ؛

phaseCInc = (phaseAInc+3584)٪ 5376؛

p_A = sin768 [phaseAInc] << 1 ؛ // مراجعه به PIOC: PC1 به PC8 ، مربوط به پین Arduino Due: پین 33-40 ، بنابراین برای 1 رقم به چپ تغییر دهید

p_B = sin768 [phaseBInc] << 12؛ // به PIOC مراجعه کنید: PC12 به PC19 ، پین مربوط به Arduino Due: پین 51-44 ، بنابراین 12 رقمی را به چپ تغییر دهید

p_C = sin768 [PhaseCInc] ؛ // فاز C خروجی کارمند PIOC: PC21 ، PC22 ، PC23 ، PC24 ، PC25 ، PC26 ، PC28 و PC29 ، مربوط به پین Arduino Due: پین دیجیتال: به ترتیب 9 ، 8 ، 7 ، 6 ، 5 ، 4 ، 3 ، 10

p_C2 = (p_C & B11000000) << 22؛ // این PC28 و PC29 را تولید می کند

p_C3 = (p_C & B00111111) << 21؛ // این PC21-PC26 را تولید می کند

p_C = p_C2 | p_C3 ؛ // این خروجی موازی فاز C را تولید می کند

p_A = p_A | p_B | p_C ؛ // خروجی 32 بیتی = فاز A (8bit) | فاز B | فاز C

PIOC-> PIO_ODSR = p_A ؛ // خروجی ثبت = p_A

t ++ ؛ }

مرحله 4: R/2R DAC

ساخت 3x8bit R/2R DAC ، بارهای ref در Google.

مرحله 5: کد کامل

#تعریف _BV (x) (1 << (x)) ؛ uint32_t sin768 PROGMEM = /* x = [0: 5375] ؛ y = 127+127*(گناه (2*pi/5376))*/

uint32_t p_A ، p_B ، p_C ، p_C2 ، p_C3 ؛ // فاز A فاز B مقدار فاز C-اگرچه خروجی فقط 8 بیت است ، مقدار p_A و p_B برای تولید مقدار 32 بیتی جدید به منظور مقابله با خروجی PIOC 32 بیتی اعمال می شود.

uint16_t phaseAInc ، phaseBInc ، phaseCInc ، freq ، freqNew ؛ فاصله uint32_t ؛ نمونه های uint16_t ، از پیش تعیین شده ؛ uint32_t t = 0؛

void setup () {

// تنظیم PIOC خروجی موازی: Arduino Due pin33-40 به عنوان خروجی فاز A استفاده می شود در حالی که پین 44-51 برای خروجی فاز B کار می کند

PIOC-> PIO_PER = 0xFFFFFFE؛ // PIO controller PIO Enable register (به صفحه 656 داده ATMEL SAM3X مراجعه کنید) و https://arduino.cc/fa/Hacking/PinMappingSAM3X ، Arduino Due پین 33-41 و 44-51 فعال شدند

PIOC-> PIO_OER = 0xFFFFFFE؛ // خروجی کنترل کننده PIO ثبت نام را فعال کنید ، به p657 برگه اطلاعات ATMEL SAM3X مراجعه کنید

PIOC-> PIO_OSR = 0xFFFFFFE؛ // ثبت وضعیت خروجی کنترلر PIO ، به p658 برگه اطلاعات ATMEL SAM3X مراجعه کنید

PIOC-> PIO_OWER = 0xFFFFFFE؛ // خروجی PIO نوشتن ثبت نام فعال ، به p670 برگه اطلاعات ATMEL SAM3X مراجعه کنید

// PIOA-> PIO_PDR = 0x30000000 ؛ // اختیاری به عنوان بیمه ، به نظر نمی رسد عملکرد را تحت تأثیر قرار دهد ، پین دیجیتال 10 به PC29 و PA28 متصل می شود ، پین دیجیتال 4 به PC29 و PA28 متصل می شود ، در اینجا برای غیرفعال کردن غیر فعال کردن تنظیم تایمر PIOA #28 و 29 // به http مراجعه کنید: //arduino.cc/fa/Hacking/PinMappingSAM3X ،

pmc_set_writeprotect (false) ؛ // حفاظت از نوشتن رجیسترهای Power Management Control را غیرفعال کنید

pmc_enable_periph_clk (ID_TC7) ؛ // ساعت شمار ساعت محیطی را فعال کنید 7

TC_Configure (/ * clock */TC2 ،/ * channel */1، TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1) ؛ // ساعت TC 42 مگاهرتز (ساعت ، کانال ، تنظیم حالت مقایسه) TC_SetRC (TC2 ، 1 ، فاصله) ؛ TC_Start (TC2 ، 1) ؛

// فعال کردن وقفه های تایمر در تایمر TC2-> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS ؛ // IER = وقفه فعال کردن ثبت TC2-> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS؛ // IDR = وقفه غیرفعال کردن ثبت نام

NVIC_EnableIRQ (TC7_IRQn) ؛ // وقفه را در بردار تو در تو کنترل کننده وقفه فعال کنید freq = 60؛ // مقداردهی اولیه را به صورت 60Hz از پیش تعیین شده = 21 ؛ // شاخص آرایه 21 نمونه = 256 افزایش می یابد؛ // نمونه های خروجی 256/فاصله چرخه = 42000000/(نمونه های متداول*) ؛ // شمارش وقفه TC_SetRC (TC2 ، 1 ، فاصله) ؛ // شروع TC Serial.begin (9600) ؛ // به منظور آزمایش}

void checkFreq ()

{freqNew = 20000 ؛

if (freq == freqNew) {} دیگری

{freq = freqNew؛

if (freq> 20000) {freq = 20000؛ /*حداکثر فرکانس 20 کیلوهرتز*/} ؛

if (freq <1) {freq = 1؛ /*حداقل فرکانس 1Hz*/} ؛

if (freq> 999) {preset = 384؛ نمونه = 14؛} // برای فرکانس> = 1 کیلوهرتز ، 14 نمونه برای هر چرخه

else if (freq> 499) {preset = 84؛ نمونه = 64؛} // برای 500 <= فرکانس 99) {از پیش تعیین شده = 42؛ نمونه = 128؛} // برای 100Hz <= فرکانس <500Hz ، 128 نمونه/چرخه

else {از پیش تعیین شده = 21؛ نمونه = 256؛}؛ // برای فرکانس <100hz ، 256 نمونه برای هر چرخه

فاصله = 42000000/(فرکانس*نمونه) ؛ t = 0 ؛ TC_SetRC (TC2 ، 1 ، فاصله) ؛ }}

حلقه خالی () {

checkFreq ()؛ تأخیر (100) ؛ }

خالی TC7_Handler (خالی)

{TC_GetStatus (TC2 ، 1) ؛

t = t٪ نمونه ؛ // از t٪ نمونه برای جلوگیری از سرریز t مرحله AInc = (از پیش تعیین شده*t)٪ 5376 استفاده کنید؛ // از٪ 5376 برای جلوگیری از سرریز شاخص آرایه استفاده کنید

PhaseBInc = (فاز AInc+1792)٪ 5376 ؛

phaseCInc = (phaseAInc+3584)٪ 5376؛

p_A = sin768 [phaseAInc] << 1 ؛ // مراجعه به PIOC: PC1 به PC8 ، مربوط به پین Arduino Due: پین 33-40 ، بنابراین برای 1 رقم به چپ تغییر دهید

p_B = sin768 [phaseBInc] << 12 ؛ // مراجعه به PIOC: PC12 به PC19 ، مربوط به پین Arduino Due: پین 51-44 ، بنابراین 12 رقمی را به چپ تغییر دهید

p_C = sin768 [PhaseCInc] ؛ // فاز C خروجی کارمند PIOC: PC21 ، PC22 ، PC23 ، PC24 ، PC25 ، PC26 ، PC28 و PC29 ، مربوط به پین Arduino Due: پین دیجیتال: به ترتیب 9 ، 8 ، 7 ، 6 ، 5 ، 4 ، 3 ، 10

p_C2 = (p_C & B11000000) << 22؛ // این PC28 و PC29 را تولید می کند

p_C3 = (p_C & B00111111) << 21؛ // این PC21-PC26 //Serial.println(p_C3، BIN) را تولید می کند؛ p_C = p_C2 | p_C3 ؛ // این خروجی موازی فاز C را تولید می کند

p_A = p_A | p_B | p_C ؛ // خروجی 32 بیتی = فاز A (8bit) | فاز B | فاز C //Serial.println(p_A>>21 ، BIN) ؛ // PIOC-> PIO_ODSR = 0x37E00000 ؛

PIOC-> PIO_ODSR = p_A ؛ // خروجی ثبت = p_A t ++؛ }

توصیه شده: