সুচিপত্র:

Arduino ডিউ এর উপর ভিত্তি করে 3 ফেজ সাইন ওয়েভ জেনারেটর: 5 টি ধাপ
Arduino ডিউ এর উপর ভিত্তি করে 3 ফেজ সাইন ওয়েভ জেনারেটর: 5 টি ধাপ

ভিডিও: Arduino ডিউ এর উপর ভিত্তি করে 3 ফেজ সাইন ওয়েভ জেনারেটর: 5 টি ধাপ

ভিডিও: Arduino ডিউ এর উপর ভিত্তি করে 3 ফেজ সাইন ওয়েভ জেনারেটর: 5 টি ধাপ
ভিডিও: Web Apps of the Future with React by Neel Mehta 2024, জুলাই
Anonim
Arduino ডিউ এর উপর ভিত্তি করে 3 ফেজ সাইন ওয়েভ জেনারেটর
Arduino ডিউ এর উপর ভিত্তি করে 3 ফেজ সাইন ওয়েভ জেনারেটর

এই শেয়ারের উদ্দেশ্য হল এমন কাউকে সাহায্য করা যিনি ডিউ এর বৃহত্তর পারফরম্যান্স + রেফারেন্সের অভাব + অ-সহায়ক ডেটশীট ব্যবহার করার চেষ্টা করছেন।

এই প্রকল্পটি 3 ফেজ সাইন ওয়েভ @ 256 নমুনা / চক্র কম ফ্রিকোয়েন্স (<1kHz) এবং 16 টি নমুনা / চক্র @ উচ্চ ফ্রিক (20kHz পর্যন্ত) তৈরি করতে সক্ষম, যা সাধারণ এলপিএফ এবং আউটপুট প্রায় নিখুঁত।

সংযুক্ত ফাইলটি আমার চূড়ান্ত সংস্করণ ছিল না কারণ আমি কিছু অতিরিক্ত বৈশিষ্ট্য যোগ করেছি কিন্তু মূলটি একই। লক্ষ্য করুন নমুনা/চক্র উপরের বিবৃতির চেয়ে কম সেট করা হয়েছে।

যেহেতু সংযুক্ত ফাইলে দেখানো পদ্ধতির মাধ্যমে CPU ক্ষমতা সর্বাধিক করা হয়েছে, আমি একটি Arduino Uno কে কন্ট্রোল ইউনিট হিসাবে ব্যবহার করেছি, যারা Arduino Due এর বাহ্যিক বাধা ব্যবহার করে Arduino Due- এ ফ্রিকোয়েন্সি মান প্রদান করে। ফ্রিকোয়েন্সি নিয়ন্ত্রণ ছাড়াও, Arduino Uno প্রশস্ততা নিয়ন্ত্রণ করে (ডিজিটাল সম্ভাব্য-মিটার + OpAmp এর মাধ্যমে) সেইসাথে I/O --- সেখানে খেলার জন্য অনেক জায়গা থাকবে।

ধাপ 1: সাইন ডেটা অ্যারে জেনারেট করুন

যেহেতু রিয়েল-টাইম ক্যালকুলেশন হল CPU- এর চাহিদা, তাই ভালো পারফরম্যান্সের জন্য একটি সাইন ডেটা অ্যারে প্রয়োজন

uint32_t sin768 প্রোগ্রাম =….এখন x = [0: 5375]; y = 127+127*(sin (2*pi/5376/*অথবা কিছু # আপনি পছন্দ করেন প্রয়োজনের উপর নির্ভর করে*/))

ধাপ 2: সমান্তরাল আউটপুট সক্ষম করা

Uno থেকে ভিন্ন, কারণে সীমিত রেফারেন্স আছে তবে Arduino Uno- এর উপর ভিত্তি করে 3 ফেজ সাইন ওয়েভ উৎপন্ন করার জন্য, সর্বপ্রথম, কম MCLK (16MHz যখন ডিউ 84MHz) এর কারণে পারফরম্যান্স প্রশংসনীয় নয়, দ্বিতীয়, এটি সীমিত GPIO সর্বোচ্চ 2 ফেজ আউটপুট তৈরি করতে পারে এবং আপনার অতিরিক্ত প্রয়োজন phase য় পর্যায় (C = -AB) উৎপাদনের জন্য এনালগ সার্কিট।

নিম্নলিখিত GPIO সক্ষম করা বেশিরভাগই চেষ্টা এবং বিচারের উপর ভিত্তি করে+SAM3X এর সহায়ক ডেটশীট নয়

PIOC-> PIO_PER = 0xFFFFFFFE; // PIO নিয়ামক PIO নিবন্ধন সক্ষম করুন (ATMEL SAM3X ডেটশীটের p656 পড়ুন) এবং https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due pin 33-41 এবং 44-51 সক্রিয় করা হয়েছে

PIOC-> PIO_OER = 0xFFFFFFFE; // PIO কন্ট্রোলার আউটপুট রেজিস্টার সক্ষম করে, ATMEL SAM3X ডেটশীটের P657 দেখুন PIOC-> PIO_OSR = 0xFFFFFFFE; // PIO কন্ট্রোলার আউটপুট স্ট্যাটাস রেজিস্টার, ATMEL SAM3X ডেটশীটের p658 দেখুন

PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO আউটপুট রাইট এনাবল রেজিস্টার, ATMEL SAM3X ডেটশীটের p670 দেখুন

// PIOA-> PIO_PDR = 0x30000000; // বীমা হিসাবে alচ্ছিক, পারফরম্যান্সকে প্রভাবিত করে বলে মনে হয় না, ডিজিটাল পিন 10 PC29 এবং PA28 উভয়ের সাথে সংযোগ স্থাপন করে, ডিজিটাল পিন 4 PC29 এবং PA28 উভয়ের সাথে সংযোগ স্থাপন করে, এখানে PIOA #28 এবং 29 নিষ্ক্রিয় করতে

ধাপ 3: বাধা সক্ষম করা

এর কর্মক্ষমতা বাড়ানোর জন্য, CPU লোড যতটা সম্ভব কম হওয়া উচিত। তবে সিপিইউ পিন এবং ডু পিনের মধ্যে অ-1to1 চিঠিপত্রের কারণে, বিট অপারেশন প্রয়োজন।

আপনি আরও অ্যালগরিদম অপ্টিমাইজ করতে পারেন কিন্তু রুম খুব সীমিত।

অকার্যকর TC7_Handler (অকার্যকর) {TC_GetStatus (TC2, 1);

t = t%নমুনা; // টি এর ওভারফ্লো এড়াতে 'if' এর পরিবর্তে t%নমুনা ব্যবহার করুন

ফেজএআইএনসি = (প্রিসেট*টি)%5376; // অ্যারে সূচক ওভারফ্লো এড়াতে %5376 ব্যবহার করুন

phaseBInc = (phaseAInc+1792)%5376;

phaseCInc = (phaseAInc+3584)%5376;

p_A = sin768 [phaseAInc] << 1; // PIOC পড়ুন: PC1 থেকে PC8, সংশ্লিষ্ট Arduino ডিউ পিন: 33-40 পিন, অতএব 1 অঙ্কের জন্য বাম দিকে স্থানান্তর করুন

p_B = sin768 [phaseBInc] << 12; // PIOC পড়ুন: PC12 থেকে PC19, সংশ্লিষ্ট Arduino ডিউ পিন: পিন 51-44, অতএব বাম 12 অঙ্কে স্থানান্তর করুন

p_C = sin768 [phaseCInc]; // ফেজ সি আউটপুট কর্মচারী PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 এবং PC29, সংশ্লিষ্ট Arduino ডিউ পিন: ডিজিটাল পিন: 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; // এটি ফেজ সি এর সমান্তরাল আউটপুট উৎপন্ন করে

p_A = p_A | p_B | p_C; // 32 বিট আউটপুট = ফেজ এ (8 বিট) | ফেজ বি | ফেজ সি

PIOC-> PIO_ODSR = p_A; // আউটপুট রেজিস্টার = p_A

টি ++; }

ধাপ 4: R/2R DAC

3x8bit R/2R DAC তৈরি করুন, গুগলে রেফার লোড।

ধাপ 5: সম্পূর্ণ কোড

#সংজ্ঞায়িত করুন _BV (x) (1 << (x)); uint32_t sin768 প্রোগ্রাম = /* x = [0: 5375]; y = 127+127*(sin (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;

অকার্যকর সেটআপ() {

// সমান্তরাল আউটপুট PIOC সেটআপ: Arduino ডিউ pin33-40 ফেজ A আউটপুট হিসাবে নিযুক্ত করা হয় যখন পিন 44-51 ফেজ B আউটপুটের জন্য কাজ করে

PIOC-> PIO_PER = 0xFFFFFFFE; // PIO নিয়ামক PIO নিবন্ধন সক্ষম করুন (ATMEL SAM3X ডেটশীটের p656 পড়ুন) এবং https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino Due pin 33-41 এবং 44-51 সক্রিয় করা হয়েছে

PIOC-> PIO_OER = 0xFFFFFFFE; // PIO কন্ট্রোলার আউটপুট রেজিস্টার সক্ষম করে, ATMEL SAM3X ডেটশীটের p657 দেখুন

PIOC-> PIO_OSR = 0xFFFFFFFFE; // PIO কন্ট্রোলার আউটপুট স্ট্যাটাস রেজিস্টার, ATMEL SAM3X ডেটশীটের p658 দেখুন

PIOC-> PIO_OWER = 0xFFFFFFFE; // PIO আউটপুট রাইট এনাবল রেজিস্টার, ATMEL SAM3X ডেটশীটের p670 দেখুন

// PIOA-> PIO_PDR = 0x30000000; // বীমা হিসাবে optionচ্ছিক, পারফরম্যান্সকে প্রভাবিত করে বলে মনে হয় না, ডিজিটাল পিন 10 PC29 এবং PA28 উভয়ের সাথে সংযোগ স্থাপন করে, ডিজিটাল পিন 4 PC29 এবং PA28 উভয়ের সাথে সংযোগ স্থাপন করে, এখানে PIOA #28 & 29 নিষ্ক্রিয় করতে // টাইমার সেটআপ, http পড়ুন: //arduino.cc/en/Hacking/PinMappingSAM3X, pmc_set_writeprotect (মিথ্যা); // পাওয়ার ম্যানেজমেন্ট কন্ট্রোল রেজিস্টারের রাইট সুরক্ষা অক্ষম করুন

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 ঘড়ি 42MHz (ঘড়ি, চ্যানেল, তুলনা মোড সেটিং) 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; // আইডিআর = বাধা নিষ্ক্রিয় রেজিস্টার

NVIC_EnableIRQ (TC7_IRQn); // নেস্টেড ভেক্টর ইন্টারাপ্ট কন্ট্রোলারের ফ্রিকোয়েন্সি = 60; // 60Hz প্রিসেট = 21 হিসাবে ফ্রিকোয়েন্সি আরম্ভ করুন; // অ্যারে সূচক 21 নমুনা দ্বারা বৃদ্ধি = 256; // আউটপুট নমুনা 256/চক্র ব্যবধান = 42000000/(freq*নমুনা); // বাধা গণনা TC_SetRC (TC2, 1, ব্যবধান); // শুরু TC Serial.begin (9600); // পরীক্ষার উদ্দেশ্যে}

অকার্যকর চেকফ্রেক ()

{freqNew = 20000;

যদি (freq == freqNew) {} অন্য

{freq = freqNew;

যদি (freq> 20000) {freq = 20000; /*সর্বোচ্চ ফ্রিকোয়েন্সি 20kHz*/};

যদি (freq <1) {freq = 1; /*মিনিট ফ্রিকোয়েন্সি 1Hz*/};

যদি (freq> 999) {preset = 384; নমুনা = 14;} // ফ্রিকোয়েন্সি> = 1kHz, প্রতিটি চক্রের জন্য 14 টি নমুনা

অন্যথায় যদি (freq> 499) {preset = 84; নমুনা = 64;} // 500 এর জন্য <= ফ্রিকোয়েন্সি 99) {প্রিসেট = 42; নমুনা = 128;} // 100Hz এর জন্য <= ফ্রিকোয়েন্সি <500Hz, 128 নমুনা/চক্র

অন্যথায় {প্রিসেট = 21; নমুনা = 256;}; // ফ্রিকোয়েন্সি <100hz, প্রতিটি চক্রের জন্য 256 টি নমুনা

ব্যবধান = 42000000/(freq*নমুনা); t = 0; TC_SetRC (TC2, 1, ব্যবধান); }}

অকার্যকর লুপ () {

checkFreq (); বিলম্ব (100); }

অকার্যকর TC7_Handler (অকার্যকর)

{TC_GetStatus (TC2, 1);

t = t%নমুনা; // t ফেজ এআইএনসি = (প্রিসেট*টি)%5376 এর ওভারফ্লো এড়াতে t%নমুনা ব্যবহার করুন; // অ্যারে সূচক ওভারফ্লো এড়াতে %5376 ব্যবহার করুন

phaseBInc = (phaseAInc+1792)%5376;

phaseCInc = (phaseAInc+3584)%5376;

p_A = sin768 [phaseAInc] << 1; // PIOC পড়ুন: PC1 থেকে PC8, সংশ্লিষ্ট Arduino ডিউ পিন: 33-40 পিন, অতএব 1 ডিজিটের জন্য বাম দিকে সরান

p_B = sin768 [phaseBInc] << 12; // PIOC পড়ুন: PC12 থেকে PC19, সংশ্লিষ্ট Arduino ডিউ পিন: পিন 51-44, অতএব বাম 12 অঙ্কে স্থানান্তর করুন

p_C = sin768 [phaseCInc]; // ফেজ সি আউটপুট কর্মচারী PIOC: PC21, PC22, PC23, PC24, PC25, PC26, PC28 এবং PC29, সংশ্লিষ্ট Arduino ডিউ পিন: ডিজিটাল পিন: 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; // এটি ফেজ সি এর সমান্তরাল আউটপুট উৎপন্ন করে

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 ++; }

প্রস্তাবিত: