فهرست مطالب:
- مرحله 1: ایجاد آرایه داده های سینوسی
- مرحله 2: فعال کردن خروجی موازی
- مرحله 3: فعال کردن وقفه
- مرحله 4: R/2R DAC
- مرحله 5: کد کامل
تصویری: 3 فاز ژنراتور موج سینوسی بر اساس آردوینو به دلیل: 5 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:55
هدف از این اشتراک گذاری کمک به کسی است که سعی می کند از عملکرد بیشتر 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 ++؛ }
توصیه شده:
تولید برد کنترل موج سینوسی: 5 مرحله
تولید تابلو کنترل موج سینوسی: این بار یک تابلوی کنترل خارج از شبکه موج سینوسی تک فاز است ، به دنبال آن یک تابلوی کنترل خارج از شبکه موج سینوسی تک فاز ، سپس یک تابلوی کنترل خارج از شبکه موج سینوسی سه فاز ، و در نهایت یک برد کنترل شبکه خارج از شبکه موج سینوسی سه فاز. امیدواریم که
ژنراتور شکل موج آردوینو: 5 مرحله (همراه با تصاویر)
Arduino Waveform Generator: فوریه 2021 به روز رسانی: نسخه جدید را با نرخ نمونه برداری 300 برابر ، بر اساس Raspberry Pi Pico بررسی کنید. در آزمایشگاه ، اغلب نیاز به یک سیگنال تکراری با فرکانس ، شکل و دامنه مشخص است. ممکن است آزمایش تقویت کننده ، بررسی مدار ،
ایستگاه باد برای موج سواری بر اساس MQTT و AWS: 3 مرحله (همراه با تصاویر)
ایستگاه باد برای موج سواری بر اساس MQTT & AWS: در شنژن ، ساحل بسیار زیبایی وجود دارد. در روزهای تابستان ، من بیشترین ورزش را قایقرانی می دانم. برای ورزش قایقرانی ، من هنوز شروع کننده هستم ، احساس می کنم آب دریا روی صورتم را لمس می کند و بیشتر ، دوستان جدیدی با این ورزش پیدا کردم. اما برای
DIY یک NE555 برای تولید موج سینوسی انجام دهید: 6 مرحله
DIY a NE555 Circuit to Generate Wave: این آموزش به شما آموزش می دهد که چگونه NE555 را برای ایجاد موج سینوسی بسازید. این کیت های DIY مقرون به صرفه برای شما بسیار مفید است تا بفهمید که چگونه خازن ها می توانند با مقاومت ها کار کنند تا زمان شارژ و دشارژ را کنترل کنند
موج ساز سینوسی: 4 مرحله (همراه با تصاویر)
موج ساز سینوسی: می خواستم بدون کمک کامپیوتر از چیزی شبیه موج سینوسی دیدن کنم ، در اینجا نحوه استفاده از یک موج سینوسی بسیار ساده بر روی یک تار با اکثر چیزهایی که در خانه پیدا می کنید ، قابل مشاهده است. تعداد گره های موج ca