সুচিপত্র:
- ধাপ 1: সাইন ডেটা অ্যারে জেনারেট করুন
- ধাপ 2: সমান্তরাল আউটপুট সক্ষম করা
- ধাপ 3: বাধা সক্ষম করা
- ধাপ 4: R/2R DAC
- ধাপ 5: সম্পূর্ণ কোড
ভিডিও: Arduino ডিউ এর উপর ভিত্তি করে 3 ফেজ সাইন ওয়েভ জেনারেটর: 5 টি ধাপ
2024 লেখক: John Day | [email protected]. সর্বশেষ পরিবর্তিত: 2024-01-30 08:00
এই শেয়ারের উদ্দেশ্য হল এমন কাউকে সাহায্য করা যিনি ডিউ এর বৃহত্তর পারফরম্যান্স + রেফারেন্সের অভাব + অ-সহায়ক ডেটশীট ব্যবহার করার চেষ্টা করছেন।
এই প্রকল্পটি 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 ++; }
প্রস্তাবিত:
Ikea Socker- এর উপর ভিত্তি করে স্বয়ংক্রিয় ইন্ডোর গ্রিনহাউস: 5 টি ধাপ
Ikea Socker এর উপর ভিত্তি করে স্বয়ংক্রিয় ইন্ডোর গ্রীনহাউস: হাই, এটি আমার প্রথম নির্দেশযোগ্য। আমি এই সম্প্রদায়ের সাথে অনেক কিছু শিখেছি, এবং আমি মনে করি আমার নম্র ধারণাগুলি ফিরিয়ে দেওয়ার সময় এসেছে। আমি আমার ইংরেজির জন্য দু sorryখিত, দরিদ্র, কিন্তু আমি যা করতে পারি তা করব। ধারণা ছিল একটি ডেস্কপ গ্রিনহাউস তৈরি করা যা আমাকে বীজ জন্মাতে দেয় এবং
বায়ুমণ্ডলীয় চাপের উপর ভিত্তি করে অ্যালটাইমিটার (উচ্চতা মিটার): 7 টি ধাপ (ছবি সহ)
বায়ুমণ্ডলীয় চাপের উপর ভিত্তি করে অ্যালটাইমিটার (উচ্চতা মিটার): [সম্পাদনা]; ম্যানুয়ালি বেসলাইন উচ্চতা ইনপুট সহ ধাপ 6 এর সংস্করণ 2 দেখুন এটি একটি Arduino ন্যানো এবং একটি Bosch BMP180 বায়ুমণ্ডলীয় চাপ সেন্সরের উপর ভিত্তি করে একটি Altimeter (Altitude Meter) এর বিল্ডিং বর্ণনা। নকশা সহজ কিন্তু পরিমাপ
MQmax 0.7 Esp8266 এবং Arduino Mini Pro- এর উপর ভিত্তি করে একটি কম খরচে ওয়াইফাই আইওটি প্ল্যাটফর্ম: 6 টি ধাপ
MQmax 0.7 একটি কম খরচে WiFi IoT প্ল্যাটফর্ম যা Esp8266 এবং Arduino Mini Pro- এর উপর ভিত্তি করে: হ্যালো এটি আমার দ্বিতীয় নির্দেশযোগ্য (এখন থেকে আমি গণনা বন্ধ করি)। আমি এটি একটি সহজ (অন্তত আমার জন্য), সস্তা, তৈরি করা সহজ এবং রিয়েল আইওটি অ্যাপ্লিকেশনগুলির জন্য কার্যকর প্ল্যাটফর্ম তৈরি করতে তৈরি করেছি যাতে এম 2 এম কাজ অন্তর্ভুক্ত রয়েছে। এই প্ল্যাটফর্মটি esp8266 এর সাথে কাজ করে এবং
ESP8266 শিল্ডের উপর ভিত্তি করে Arduino এর জন্য সিরিয়াল UDP/IP গেটওয়ে: 8 টি ধাপ
ESP8266 শিল্ডের উপর ভিত্তি করে Arduino এর জন্য সিরিয়াল UDP/IP গেটওয়ে: আমি ইতিমধ্যে 2016 সালে এই নির্দেশযোগ্য " আপনার Arduino কে IP নেটওয়ার্কের সাথে সংযুক্ত করার জন্য আপনার নিজের ওয়াইফাই গেটওয়ে কিভাবে তৈরি করবেন " যেহেতু আমি কিছু কোড উন্নতি করেছি এবং আমি এখনও এই সমাধান ব্যবহার করছি। তবুও এখন কিছু ESP8266 ieldsাল আছে
Arduino উপর ভিত্তি করে থার্মোস্ট্যাট: 6 ধাপ
Arduino এর উপর ভিত্তি করে থার্মোস্ট্যাট: এইবার আমরা Arduino, তাপমাত্রা সেন্সর এবং রিলে এর উপর ভিত্তি করে একটি থার্মোস্ট্যাট তৈরি করতে যাচ্ছি।