विषयसूची:

3 चरण साइन वेव जेनरेटर Arduino के आधार पर देय: 5 चरण
3 चरण साइन वेव जेनरेटर Arduino के आधार पर देय: 5 चरण

वीडियो: 3 चरण साइन वेव जेनरेटर Arduino के आधार पर देय: 5 चरण

वीडियो: 3 चरण साइन वेव जेनरेटर Arduino के आधार पर देय: 5 चरण
वीडियो: Amazing arduino project 2024, नवंबर
Anonim
3 चरण साइन वेव जेनरेटर Arduino ड्यू पर आधारित है
3 चरण साइन वेव जेनरेटर Arduino ड्यू पर आधारित है

इस शेयर का उद्देश्य किसी ऐसे व्यक्ति की मदद करना है जो ड्यू के अधिक प्रदर्शन + संदर्भ की कमी + गैर-सहायक डेटाशीट का उपयोग करने का प्रयास कर रहा है।

यह परियोजना कम आवृत्ति (<1kHz) पर 256 नमूने/चक्र @ 3 चरण साइन लहर उत्पन्न करने में सक्षम है और 16 नमूने/चक्र @ उच्च आवृत्ति (20kHz तक) उत्पन्न करने में सक्षम है, जो साधारण एलपीएफ द्वारा सुचारू होने के लिए पर्याप्त है और आउटपुट लगभग सही है।

संलग्न फ़ाइल मेरा अंतिम संस्करण नहीं था क्योंकि मैंने कुछ अतिरिक्त सुविधा जोड़ी थी लेकिन कोर उसी के समान है। ध्यान दें कि नमूने/चक्र उपरोक्त कथन से कम निर्धारित किए गए थे।

चूंकि संलग्न फ़ाइल में दिखाए गए दृष्टिकोण के माध्यम से सीपीयू क्षमता को अधिकतम किया जाता है, इसलिए मैंने एक Arduino Uno को नियंत्रण इकाई के रूप में उपयोग किया, जो Arduino Due के बाहरी व्यवधान का उपयोग Arduino Due को आवृत्ति मान पास करने के लिए करता है। आवृत्ति नियंत्रण के अलावा, Arduino Uno आयाम (डिजिटल संभावित-मीटर + OpAmp के माध्यम से) के साथ-साथ I/O को भी नियंत्रित करता है --- इसमें खेलने के लिए बहुत सी जगह होगी।

चरण 1: साइन डेटा ऐरे उत्पन्न करें

चूंकि वास्तविक समय की गणना सीपीयू की मांग है, बेहतर प्रदर्शन के लिए एक साइन डेटा सरणी की आवश्यकता होती है

uint32_t sin768 PROGMEM=….जबकि x=[0:5375]; y = १२७+१२७*(पाप(२*पीआई/5376/*या कुछ # जो आप पसंद करते हैं वह आवश्यकता पर निर्भर करता है*/))

चरण 2: समानांतर आउटपुट सक्षम करना

ऊनो के विपरीत, ड्यू का सीमित संदर्भ है। हालाँकि, Arduino Uno पर आधारित 3 चरण साइन वेव उत्पन्न करने के लिए, सबसे पहले, इसके कम MCLK (16MHz जबकि देय 84MHz) के कारण प्रदर्शन प्रशंसनीय नहीं है, दूसरा, यह सीमित GPIO अधिकतम 2 चरण आउटपुट का उत्पादन कर सकता है और आपको अतिरिक्त की आवश्यकता है तीसरे चरण (सी = -एबी) का उत्पादन करने के लिए एनालॉग सर्किट।

निम्नलिखित GPIO सक्षम करना ज्यादातर कोशिश और परीक्षण पर आधारित था + SAM3X की सहायक डेटाशीट नहीं

PIOC->PIO_PER = 0xFFFFFFFE; // पीआईओ नियंत्रक पीआईओ सक्षम रजिस्टर (एटीएमईएल एसएएम3एक्स डेटाशीट का पी656 देखें) और https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino ड्यू पिन 33-41 और 44-51 सक्षम थे

PIOC->PIO_OER = 0xFFFFFFFE; // PIO कंट्रोलर आउटपुट रजिस्टर को सक्षम करता है, ATMEL SAM3X डेटाशीट PIOC-> PIO_OSR = 0xFFFFFFFE के p657 को देखें; // PIO कंट्रोलर आउटपुट स्टेटस रजिस्टर, ATMEL SAM3X डेटाशीट के p658 को देखें

PIOC->PIO_OWER = 0xFFFFFFFE; // PIO आउटपुट राइट इनेबल रजिस्टर, ATMEL SAM3X डेटाशीट के p670 को देखें

//PIOA->PIO_PDR = 0x30000000; // बीमा के रूप में वैकल्पिक, प्रदर्शन को प्रभावित नहीं करता है, डिजिटल पिन 10 PC29 और PA28 दोनों से कनेक्ट होता है, डिजिटल पिन 4 PC29 और PA28 दोनों से कनेक्ट होता है, यहां अक्षम PIOA #28 और 29 को अक्षम करने के लिए

चरण 3: इंटरप्ट को सक्षम करना

अपने प्रदर्शन को अधिकतम करने के लिए, CPU लोड जितना संभव हो उतना कम होना चाहिए। हालांकि सीपीयू पिन और ड्यू पिन के बीच गैर-1to1 पत्राचार के कारण, बिट ऑपरेशन आवश्यक है।

आप एल्गोरिथ्म को और अधिक अनुकूलित कर सकते हैं लेकिन कमरा बहुत सीमित है।

शून्य TC7_Handler (शून्य) {TC_GetStatus (TC2, 1);

टी = टी% नमूने; // टी के अतिप्रवाह से बचने के लिए 'if' के बजाय t% नमूनों का उपयोग करें

फेजएआईएनसी = (प्रीसेट*टी)%5376; // सरणी अनुक्रमणिका अतिप्रवाह से बचने के लिए% 5376 का उपयोग करें

फेजबीआईएनसी = (फेजएआईएनसी+1792)%5376;

फेजसीआईएनसी = (फेजएआईएनसी+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]; // चरण C आउटपुट 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; // यह चरण C. के समानांतर आउटपुट उत्पन्न करता है

p_A = p_A|p_B|p_C; // 32 बिट आउटपुट = चरण ए (8 बिट) | चरण बी | चरण सी

PIOC->PIO_ODSR = p_A; // आउटपुट रजिस्टर = p_A

टी++; }

चरण 4: आर/2आर डीएसी

3x8bit R/2R DAC का निर्माण करें, Google पर रेफरी का भार।

चरण 5: पूर्ण कोड

# परिभाषित करें _BV(x) (1<<(x)); uint32_t sin768 कार्यक्रम= /* x=[0:5375]; y = १२७+१२७*(पाप(२*पीआई/५३७६)) */

uint32_t p_A, p_B, p_C, p_C2, p_C3; // चरण ए चरण बी चरण सी मूल्य - हालांकि आउटपुट केवल 8 बिट हैं, 32 बिट पीआईओसी आउटपुट के साथ मुकाबला करने के लिए पी_ए और पी_बी मान को एक नया 32 बिट मान उत्पन्न करने के लिए संचालित किया जाएगा

uint16_t PhaseAInc, PhaseBInc, PhaseCInc, freq, freqNew; uint32_t अंतराल; uint16_t नमूने, प्रीसेट; uint32_t टी = 0;

व्यर्थ व्यवस्था() {

// समानांतर आउटपुट PIOC सेटअप: Arduino ड्यू पिन33-40 को फेज ए आउटपुट के रूप में नियोजित किया जाता है जबकि पिन 44-51 फेज बी आउटपुट के लिए काम करता है

PIOC->PIO_PER = 0xFFFFFFFE; // पीआईओ नियंत्रक पीआईओ सक्षम रजिस्टर (एटीएमईएल एसएएम3एक्स डेटाशीट का पी656 देखें) और https://arduino.cc/en/Hacking/PinMappingSAM3X, Arduino ड्यू पिन 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; // बीमा के रूप में वैकल्पिक, प्रदर्शन को प्रभावित नहीं करता है, डिजिटल पिन 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(/* घड़ी */TC2, /* चैनल */1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); // टीसी घड़ी 42 मेगाहर्ट्ज (घड़ी, चैनल, मोड सेटिंग की तुलना करें) टीसी_सेटआरसी (टीसी 2, 1, अंतराल); टीसी_स्टार्ट (टीसी 2, 1);

// टाइमर TC2->TC_CHANNEL[1]. TC_IER=TC_IER_CPCS पर टाइमर इंटरप्ट सक्षम करें; // IER = व्यवधान सक्षम रजिस्टर TC2->TC_CHANNEL[1]. TC_IDR=~TC_IER_CPCS; // आईडीआर = इंटरप्ट डिसेबल रजिस्टर

NVIC_EnableIRQ (TC7_IRQn); // नेस्टेड वेक्टर इंटरप्ट कंट्रोलर freq = 60 में इंटरप्ट को सक्षम करें; // आवृत्ति को ६० हर्ट्ज प्रीसेट = २१ के रूप में प्रारंभ करें; // सरणी सूचकांक में २१ नमूनों की वृद्धि = २५६; // आउटपुट नमूने 256 / चक्र अंतराल = 42000000 / (आवृत्ति * नमूने); // व्यवधान TC_SetRC (TC2, 1, अंतराल) की गणना करता है; // टीसी सीरियल शुरू करें। शुरू (९६००); // परीक्षण के उद्देश्य के लिए}

शून्य चेकफ्रीक ()

{फ्रीकन्यू = २००००;

अगर (freq == freqNew) {} और

{ फ़्रीक = फ़्रीकन्यू;

अगर (freq>20000) {freq = 20000; /*अधिकतम आवृत्ति 20kHz*/};

अगर (freq<1) {freq = 1; /*न्यूनतम आवृत्ति 1Hz*/};

अगर (आवृत्ति> ९९९) {प्रीसेट = ३८४; नमूने = 14;} // आवृत्ति के लिए> = 1kHz, प्रत्येक चक्र के लिए 14 नमूने

और अगर (आवृत्ति> ४९९) {प्रीसेट = ८४; नमूने = ६४;} // ५०० के लिए<=आवृत्ति९९) {प्रीसेट = ४२; नमूने = 128;} // 100 हर्ट्ज के लिए <= आवृत्ति <500 हर्ट्ज, 128 नमूने / चक्र

अन्य {प्रीसेट = 21; नमूने = 256;}; // आवृत्ति के लिए<100 हर्ट्ज, प्रत्येक चक्र के लिए 256 नमूने

अंतराल = 42000000/(आवृत्ति * नमूने); टी = 0; टीसी_सेटआरसी (टीसी 2, 1, अंतराल); } }

शून्य लूप () {

चेकफ्रीक (); देरी (100); }

शून्य TC7_Handler (शून्य)

{ TC_GetStatus (TC2, 1);

टी = टी% नमूने; // टी चरण के अतिप्रवाह से बचने के लिए टी% नमूनों का उपयोग करें = (प्रीसेट * टी)% 5376; // सरणी अनुक्रमणिका अतिप्रवाह से बचने के लिए% 5376 का उपयोग करें

फेजबीआईएनसी = (फेजएआईएनसी+1792)%5376;

फेजसीआईएनसी = (फेजएआईएनसी+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]; // चरण C आउटपुट 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; // यह चरण C. के समानांतर आउटपुट उत्पन्न करता है

p_A = p_A|p_B|p_C; // 32 बिट आउटपुट = चरण ए (8 बिट) | चरण बी | चरण सी // सीरियल। प्रिंट्लन (पी_ए>> 21, बिन); // पीआईओसी-> पीआईओ_ओडीएसआर = 0x37E00000;

PIOC->PIO_ODSR = p_A; // आउटपुट रजिस्टर = p_A t++; }

सिफारिश की: