TMS320F28027 पर मल्टीफ़ेज़ पीडब्लूएम सिग्नल जनरेशन

एक बार की बात है एक दूर की दूर आकाशगंगा में मैंने टेक्सास इंस्ट्रूमेंट्स से विशेष पिकोलो नियंत्रक के बारे में एक छोटा लेख लिखा था, जो बिजली कन्वर्टर्स और इलेक्ट्रिक ड्राइव को नियंत्रित करने के लिए डिज़ाइन किए गए हैं। ये नियंत्रक कई कार्यों में बहुत शक्तिशाली विकास उपकरण हैं और मैं उनके बारे में कुछ और लिखना चाहता था ... सरल और उपयोगी।


हाल ही में, मुझे मोटर नियंत्रण के लिए एक नियंत्रक विकसित करने के लिए हैरान किया गया था और, तदनुसार, लेख के लिए एक विषय का गठन किया गया था - आज मैं मोटर नियंत्रण के लिए तीन-चरण PWM बनाने की प्रक्रिया के बारे में बात करूंगा, साथ ही साथ TMS320F284 और STM32F334, STM32G484, XMC4200 और अन्य नियंत्रकों के बीच लाभकारी अंतर के बारे में बताऊंगा।


एक स्टैंड के रूप में, मैं विकास के तहत नियंत्रक का उपयोग करूँगा, अफसोस, मैं लोहे के हिस्से के बारे में विस्तार से बात नहीं कर सकता। हालांकि, अगर मैं कहता हूं कि नियंत्रक TMS320F28027 + DRV8353RSRGZT बंडल के आधार पर बनाया गया है, तो आप ड्राइवर डेटाशीट को देख सकते हैं और सामान्य सर्किटरी अवधारणा को देख सकते हैं + इस पत्थर पर डीबगिंग है और इस पर संदर्भ डिज़ाइन खुला है।


BLDC ड्राइवर


सिद्धांत रूप में, उसी प्रकार के सर्किट्री पर बीएलडीसी मोटर्स को नियंत्रित करना संभव है जो वोल्टेज के स्तर और साधारण तीन-चरण का उपभोग करते हैं, जो पहले से ही एक साइनसॉइडल आउटपुट चाहते हैं। मैं दोनों विकल्प दिखाऊंगा, जैसा कि साइन का पथ वोल्टेज स्तरों के गठन के माध्यम से निहित है।


ऑल्ग्राम 1 नंबर


लोहे के बारे में थोड़ा


ड्राइवर के वैचारिक रूप से वैचारिक रूप से 3 आधे-पुल कन्वर्टर्स होते हैं, शायद सभी कॉप्टरों में BLDC इंजनों को नियंत्रित करने के लिए सभी चॉस्टनिक और नियंत्रक समान तरीके से बनाए जाते हैं:


तीन चरण का पुल


एक अंतर - मेरे पास इनपुट रेक्टिफायर नहीं है, क्योंकि नियंत्रक शुरू में एक स्थिर वोल्टेज द्वारा संचालित होता है। मेरे मामले में शक्ति का स्रोत 18650 कोशिकाओं के रूप में ली-आयन बैटरी की एक विधानसभा है। प्रयुक्त DRV8353RSRGZT चालक केवल 3 पावर आधा पुलों को नियंत्रित कर सकता है, पत्थर के उपयोग किए गए संस्करण में भी वर्तमान सेंसर के रूप में शंट के साथ काम करने के लिए ऑप-इन-एम्प्स का निर्माण किया गया है। dc / dc, जो 70 ... 80V तक पच सकता है और यह सब बहुत लचीले ढंग से SPI के माध्यम से कॉन्फ़िगर किया गया है। उदाहरण के लिए, ट्रांजिस्टर नियंत्रण की अधिकतम नाड़ी धारा को समायोजित करने में सक्षम होना बहुत सुविधाजनक है।


इस श्रृंखला में भी फ़ंक्शन के एक अलग सेट के साथ ड्राइवर हैं, उदाहरण के लिए, एनालॉग नियंत्रण के साथ हैं, और एसपीआई के बिना या अंतर्निहित डीसी / डीसी के बिना और ऑप-एम्प के बिना नहीं हैं। कीमत के लिए वे बहुत अलग नहीं हैं और मैंने सबसे "बोल्ड" लिया जैसा कि आप शायद पहले से ही समझ चुके हैं। यह पूरी बात बहुत सुंदर लगती है, लेकिन मैं बल्कि चालक के बंधन के डिजाइन के करीब पहुंच गया और मुझे 2 महत्वपूर्ण समस्याएं मिलीं। वास्तव में, केवल एक ही समस्या है - यह एक मजबूत ओवरहीटिंग है:


थर्मल इमेजर


लेकिन यह समस्या 2 कारणों से हुई। वास्तव में समस्या का सार चालक के स्वयं को अधिक गरम करना है। थर्मोग्राम पर, चालक को 5 ए की धारा के साथ लोड किया जाता है (उसके लिए यह लगभग बेकार है) और कुछ नहीं बल्कि चालक और एमके खुद को थोड़ा गर्म कर रहे हैं। ट्रांजिस्टर भी दिखाई नहीं दे रहे हैं, उनके पास एक पीसीबी तापमान है, 5 ए में घिनौनी गर्मी के नुकसान हैं।


  • त्रुटि संख्या १
    मुझे मेरे एक दोस्त ने संकेत दिया, ईमानदारी से, मैंने इसे अंतिम चीज़ के रूप में सोचा होगा - ड्राइवर में एक अंतर्निहित डीसी / डीसी है, जो एमके, तर्क, तुलनित्रों और परिचालन एम्पलीफायरों को शक्ति प्रदान करने के लिए 3.3 ... 50V इनपुट और आउटपुट 3.3V देता है। ऐसा लगता है कि मेरी परियोजनाओं में अलग-अलग माइक्रोचिप्स के रूप में LM5008 और LM5017 माइक्रोचिप्स हैं और मैंने 100-150 mA के करंट पर ध्यान देने योग्य हीटिंग के बिना 60V से 3.3V को कम कर दिया, लेकिन सबकुछ पेचीदा हो गया - कनवर्टर की समग्र दक्षता एक मौजूदा समय में लगभग 65-70% हो गई। 300 mA! तथ्य यह है कि कनवर्टर स्वयं 3.3V दे सकता है, लेकिन दक्षता कम हो जाएगी, यह आउटपुट वोल्टेज 10-10-15V सेट करने के लिए इष्टतम है। जब आउटपुट 12V 100 mA था, तो मेरे ड्राइवर ने व्यावहारिक रूप से गर्म करना बंद कर दिया और दक्षता 88% तक पहुंच गई। समस्या का हल इनपुट 15 ... 50 वी से 12 वी के साथ बिल्ट-इन डीसी / डीसी को कम करना है, और फिर इसे 12 वी से 3.3 वी तक पहले से ही सस्ते बाहरी डीसी / डीसी के साथ कम करना है।


  • त्रुटि संख्या २
    दूसरी गलती अधिक स्पष्ट है और पहली चीज जिस पर मैं पाप कर सकता था। तथ्य यह है कि QFN पैकेज में चिप्स के लिए मुख्य गर्मी "पेट" के माध्यम से हटा दी जाती है, यह आमतौर पर GND पर बैठता है और, कई vias (माध्यम से) के माध्यम से जमीन पर चिपक जाता है और सभी गर्मी शांति से वहां पहुंच जाती है। प्रारंभ में, मैंने बड़े वोल्टेज अंतर के साथ अंतर्निहित डीसी / डीसी की अल्प दक्षता को ध्यान में नहीं रखा था, इसलिए यह मुझे परेशान नहीं करता था कि थर्मल परत ("बेली") आंतरिक परत पर एक ठोस जीएनडी बहुभुज से चिपकी हुई थी, बाहरी परत पर मेरे पास एक बहुभुज के रूप में पेट के नीचे तांबा नहीं था। GND। नतीजतन, यह पता चला कि ~ 0.5 डब्ल्यू गर्मी चिप पर जारी की जाती है, और यह बोर्ड की आंतरिक परत में फैल जाती है, अर्थात दक्षता बहुत खराब है। समस्या का समाधान यह है कि आपको बाहरी परत (निचला परत) पर पृथ्वी परीक्षण मैदान बनाने की आवश्यकता है और ऐसा न करें:

सर्किट बोर्ड


नतीजतन, लोहे के दूसरे संशोधन में, इन त्रुटियों को ठीक किया गया था: एक बाहरी डीसी / डीसी कनवर्टर 12-3.3V जोड़ा गया था और जीएनडी बहुभुज इसके अलावा नीचे की परत पर भरा गया था और चिप पैड को उस पर लगाया गया था + आंतरिक ठोस जमीन बहुभुज को संरक्षित किया गया था। इस तरह के सुधारों के बाद, निरंतर संचालन में तापमान +82 से घटकर +43 o C हो गया:


thermogram


जैसा कि आप देख सकते हैं, घाटे में कमी के कारण, तापमान समान परिस्थितियों में काफी कम हो गया है, साथ ही गर्मी अब बोर्ड क्षेत्र पर समान रूप से वितरित की जाती है और स्थानीय रूप से या तो चालक या माइक्रोकंट्रोलर को ज़्यादा गरम नहीं करता है। सिद्धांत रूप में, सब कुछ लोहा था, अधिक दिलचस्प कुछ भी नहीं हुआ और दृढ़ता से काम किया। नतीजतन, वे DRV8353 ड्राइवर का उपयोग करने की सिफारिश कर सकते हैं।


120 के एक हार्डवेयर चरण बदलाव का कार्यान्वयन


तीन-चरण नेटवर्क की एक विशेषता यह है कि चरणों में वर्तमान समकालिक नहीं है, लेकिन पड़ोसी के सापेक्ष 120 द्वारा स्थानांतरित किया जाता है। यह सामान्य रूप से 120 चरण की पारी क्या है? सरल शब्दों में, यह पीरियड के 1/3 द्वारा पीढ़ी के प्रारंभ बिंदु की एक पारी है। गणितीय दृष्टिकोण से, सिग्नल की अवधि 2 view है, जिसका अर्थ है कि दूसरे सिग्नल को 2π / 3 और तीसरे को 4 the / 3 से स्थानांतरित करना होगा। इलेक्ट्रॉनिक दृष्टिकोण से, अवधि हमारे टाइमर की उलटी गिनती अवधि द्वारा निर्धारित की जाती है। उदाहरण के लिए, 60 मेगाहर्ट्ज पर क्लॉक करते समय, हम 50 kHz की आवृत्ति के साथ एक PWM प्राप्त करना चाहते हैं, जिसका अर्थ है कि टाइमर उलटी गिनती की अवधि 0 से 1200 (60 000 000 हर्ट्ज / 50 000 हर्ट्ज = 1200) तक होगी। अब, 120 o की शिफ्ट के साथ 3 चरणों को प्राप्त करने के लिए , हमें 1 चरण को छूने की आवश्यकता नहीं है, दूसरे चरण के लिए वर्तमान मान में +400 जोड़कर, वर्तमान चरण में +800 जोड़ दें।


यदि हम कॉर्टेक्स कोर पर माइक्रोकंट्रोलर्स का उपयोग करते हैं, तो हम गणितीय फॉर्मूला लिखकर या इवेंट सिंक्रोनाइज़ेशन का उपयोग करके शिफ्ट को लागू कर सकते हैं। मेरे लिए यह हमेशा आश्चर्यजनक था कि एसटी, एनएक्सपी और अन्य ने केवल रजिस्टर नहीं किया जहां शिफ्ट मूल्य लिखा जाएगा। सौभाग्य से, टीआई ने अपनी TMS320F28xxx में यह बदलाव किया, शिफ्ट सेट करने के लिए, बस एक रजिस्टर लिखें! मैं आपको यह नहीं बताने जा रहा हूं कि सॉफ़्टवेयर समाधान इष्टतम क्यों नहीं है, मैं सिर्फ इतना कहूंगा कि यह एमके फ़ार्मुलों को बहुत जल्दी नहीं मानता है। घटनाओं से सिंक्रनाइज़ेशन के साथ प्रो पहले से ही पर्याप्त है और एसटीएम पर मैं बस यही करूंगा, लेकिन यह विकल्प मक्खी पर चरण मान को बदलने की अनुमति नहीं देता है, अर्थात, कुछ चरण-शिफ्ट किए गए पुल के लिए फिर से केवल सॉफ्टवेयर संस्करण रहता है। क्या चरण हार्डवेयर को नियंत्रित करने की क्षमता का लाभ है? यह तय करना आपके ऊपर है, मेरा काम आपको यह बताना है कि यह संभव है। मेरे लिए, यह एक स्पष्ट प्लस है जब हम तीन चरण के आउटपुट के साथ इलेक्ट्रिक ड्राइव या वोल्टेज इनवर्टर को नियंत्रित करने के बारे में बात करते हैं।


अब हम PWM संकेतों की पीढ़ी को मृत समय और चरण बदलाव के साथ 3 पूरक जोड़े के रूप में कॉन्फ़िगर करते हैं। अब तक एक साइन के बिना। मैं निम्नलिखित जोड़ियों का उपयोग करूंगा: EPWM1A + EPWM1B, EPWM2A + EPWM2B और EPWM4A + EPWM4B। ये सिग्नल हैं जो माइक्रोकंट्रोलर से ड्राइवर तक जाते हैं।


  • चरण 1
    यह आवश्यक है कि GPAM मल्टीप्लेक्स को GPAMUX रजिस्टर का उपयोग करके PWM के साथ काम करें और आउटपुट के पुल-अप को बिजली की आपूर्ति के लिए बंद करें, ताकि जब आप सभी पैरों को चालू करें, तो लॉग 1 न हो और कुंजियाँ न खुलें। वर्तमान सुरक्षा निश्चित रूप से बचाएगी, लेकिन ऐसा न करना बेहतर है। यह भी याद रखने योग्य है कि सेटअप रजिस्टरों को एक्सेस करने के लिए, आपको इसे EALLOW कमांड से प्राप्त करना होगा और फिर EDIS कमांड के साथ ओवरराइट प्रोटेक्शन को वापस करना होगा।

void InitGPIOforPWM (void) { EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1; // Disable pull-up on GPIO0 (EPWM1A) GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1; // Disable pull-up on GPIO1 (EPWM1B) GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // Configure GPIO1 as EPWM1B GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1; // Disable pull-up on GPIO2 (EPWM2A) GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1; // Disable pull-up on GPIO3 (EPWM2B) GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // Configure GPIO2 as EPWM2A GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; // Configure GPIO3 as EPWM2B GpioCtrlRegs.GPAPUD.bit.GPIO6 = 1; // Disable pull-up on GPIO6 (EPWM4A) GpioCtrlRegs.GPAPUD.bit.GPIO7 = 1; // Disable pull-up on GPIO7 (EPWM4B) GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; // Configure GPIO6 as EPWM4A GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 1; // Configure GPIO7 as EPWM4B EDIS; } 

  • चरण 2
    PWM सिग्नल जनरेशन सेट अप करें। 50 kHz की आवृत्ति और 120 o की एक चरण शिफ्ट प्राप्त करना आवश्यक है। इस मामले में, मैं सामान्य PWM का उपयोग करता हूं, क्योंकि इस नियंत्रक में HRPWM भी है, यह याद रखना महत्वपूर्ण है। पीडब्लूएम मॉड्यूल को कोर आवृत्ति पर देखा जाता है, अर्थात 60 मेगाहर्ट्ज, मैंने दिखाया कि टीएमएस 320 पर पहले लेख में पीएलएल आवृत्ति कैसे सेट करें, मैं इसे नहीं दोहराऊंगा, लेकिन लेख के अंत में कोड के साथ एक संग्रह होगा और वहां झांकना संभव होगा।

  void InitPWM (void) { // EPWM Module 1 config EPwm1Regs.TBPRD = 600; // Set priod EPwm1Regs.TBPHS.half.TBPHS = 0; // Set phase EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Symmetrical mode EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Master enable EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync down-stream module EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable dead-time module EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active Hi complementary EPwm1Regs.DBFED = 20; // dead-time on 20 tick EPwm1Regs.DBRED = 20; // dead-time off 20 tick // EPWM Module 2 config EPwm2Regs.TBPRD = 600; EPwm2Regs.TBPHS.half.TBPHS = 400; // Set phase = 400/1200 * 360 = 120 deg EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // Slave enable EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN; // Count DOWN on sync (=120 deg) EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // sync flow-through EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; EPwm2Regs.DBFED = 20; EPwm2Regs.DBRED = 20; // EPWM Module 4 config EPwm4Regs.TBPRD = 600; EPwm4Regs.TBPHS.half.TBPHS = 400; EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm4Regs.TBCTL.bit.PHSDIR = TB_UP; EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm4Regs.AQCTLA.bit.CAU = AQ_SET; EPwm4Regs.AQCTLA.bit.CAD = AQ_CLEAR; EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; EPwm4Regs.DBFED = 20; EPwm4Regs.DBRED = 20; } 

अब, थोड़ा और विस्तार ... टीबीपीआरडी रजिस्टर में, अवधि, या बल्कि, "अवधि / 2" लिखें, क्योंकि हम दोनों दिशाओं में टाइमर पर विचार करते हैं, यह पता चला है कि 600 की अवधि पूरक युग्म मोड में 50 kHz के आउटपुट PWM सिग्नल की आवृत्ति से मेल खाती है। टीबीपीएचएस रजिस्टर में हम चरण मूल्य लिखते हैं जिसके द्वारा हमें स्थानांतरित करने की आवश्यकता होती है, इस मामले में 600 में से 400, जो 2 3/3 से मेल खाती है। यह ध्यान देने योग्य है कि हम 1 चरण को स्थानांतरित नहीं कर रहे हैं, इसलिए इसके लिए शिफ्ट 0 है, दूसरे चरण के लिए शिफ्ट क्रमशः 400 है, लेकिन तीसरे चरण के लिए 800 लिखना मुश्किल होगा, लेकिन 800 में से 800 किसी भी तरह से लिखना वास्तव में नहीं ... इसलिए वे शिफ्ट को पहले चरण के सापेक्ष नहीं लिखते हैं, लेकिन पिछले एक के सापेक्ष, अर्थात 2। नतीजतन, हमें लगता है कि तीसरे चरण में हम 400 लिखते हैं और यह चरण 2 और 3 के बीच 2 3/3 से मेल खाता है, और चूंकि 2 पहले से ही स्थानांतरित हो गया है, तो चरण 1 और 3 के बीच "2π / 3 + 2/3 = 4π होगा।" / 3 "और इलेक्ट्रॉनिक्स के दृष्टिकोण से सब कुछ तार्किक लगता है।


चरणों के लिए यह समझने के लिए कि कौन किसके सापेक्ष आगे बढ़ रहा है, एक बॉस की आवश्यकता है, इसलिए EPWM1 ​​को PHSEN बिट से मास्टर मोड और EPWM2 और EPWM4 क्रमशः गुलाम के रूप में सेट किया गया है। SYNCOSEL बिट्स का उपयोग करते हुए , सिंक्रनाइज़ेशन "बिंदु" भी सेट किया जाता है, अर्थात जहां से शिफ्ट को पढ़ना है। EPWM1 ​​टाइमर की शुरुआत के साथ सिंक्रनाइज़ है, अर्थात शून्य अवधि के साथ, और EPWM2 और EPWM4 पहले से ही पिछले चैनल के सिग्नल किनारे के सापेक्ष सिंक्रनाइज़ किए गए हैं: EPWM2 के लिए पिछला चैनल EPWM1 ​​है, और EPWM4 के लिए यह EPWM2 है।


अब यह पूरक जोड़े को चालू करने और मृत-समय अवधि निर्धारित करने के लिए बनी हुई है। POLSEL बिट्स का उपयोग करते हुए , हम एक गैर-व्युत्क्रम PWM सेट करते हैं, अर्थात, तुलनित्र (संदर्भ) के सेट मान तक पहुंचने पर, आउटपुट पर एक लॉग उत्पन्न होता है। 1. OUT_MODE में हम डेड-टाइम जनरेशन को किनारे पर और सिग्नल के गिरने पर सेट करते हैं। तदनुसार, रजिस्टरों में डीबीएफईडी और डीबीआरईडी टिकों में मृत समय की अवधि लिखते हैं।


  • चरण 3
    अब यह प्रत्येक चैनल के अनुरूप CMPA रजिस्टर में ड्यूटी फैक्टर वैल्यू लिखने के लिए रहता है और आप परिणाम देख सकते हैं।

  EPwm1Regs.CMPA.half.CMPA = 300; // duty for output EPWM1A EPwm2Regs.CMPA.half.CMPA = 300; // duty for output EPWM2A EPwm4Regs.CMPA.half.CMPA = 300; // duty for output EPWM4A 

तीन चरण PWM


देखा! आस्टसीलस्कप जांच चालक उत्पादन से जुड़े होते हैं। पीला चैनल हमारा ईपीडब्ल्यूएम 1 है, यानी मास्टर। ब्लू चैनल EPWM2 है और इसे पीले चैनल के सापेक्ष 2 3/3 (या 400 नमूने) स्थानांतरित किया गया है, और ग्रीन चैनल को अन्य 400 नमूनों को स्थानांतरित किया गया है। इस प्रकार हमें 3 चरण मिलते हैं, जहाँ प्रत्येक चरण को 120 o द्वारा स्थानांतरित किया जाता है।


आइए अब आस्टसीलस्कप जांच को पावर ब्रिज के आउटपुट से कंट्रोल सिग्नलों में स्थानांतरित करते हैं जो कि माइक्रोकंट्रोलर से बाहर आते हैं और पूरक जोड़ी के अंदर डेड-टाइम की जांच करते हैं:


ऑल्ग्राम नंबर 2


जैसा कि आप देख सकते हैं, सेट डेड टाइम असली से मेल खाता है। एक नमूने की अवधि 1 / 60,000,000 हर्ट्ज = 16.6 एनएस है और हमें 20 नमूने मिलते हैं, जो कि मृत समय 20.6 16 एनएस = 332 एनएम के बराबर है, * जो लगभग ऑसिलोग्राम पर देखा गया है।


वास्तव में यह कहाँ काम आ सकता है, इस रूप में कि यह अब है। सबसे स्पष्ट विकल्प मल्टीफ़ेज़ dc / dc कन्वर्टर्स है, जो उन लोगों के लिए है जो इंटरलेसीड डीसी / डीसी कनवर्टर के इच्छुक हैं। यह एक अत्यंत रोचक तकनीकी समाधान है जो बिजली के आवृत्तियों के आकार को काफी कम कर सकता है, कैपेसिटर के आउटपुट समाई को कम कर सकता है, और दक्षता भी बढ़ा सकता है। एक साधारण TMS320F28027 पर, आप एक 4-चरण कनवर्टर को लागू कर सकते हैं और यह सब कोड में और केवल हार्डवेयर में लागू किया जाएगा।


हम तीन-चरण की बारी वोल्टेज का उत्पादन करते हैं


कई समस्याओं में, आउटपुट पर 0 या VCC के असतत मान प्राप्त करने के लिए यह पर्याप्त नहीं होगा, एक साइन लहर की आवश्यकता है। मेरे पास एक लेख है जो एकल-चरण वैकल्पिक वोल्टेज के गठन के बारे में बात करता है और "सारणीबद्ध" विधि का उपयोग वहां किया जाता है, अर्थात, साइन लहर के मूल्यों की शुरुआत में गणना की गई थी। सिद्धांत रूप में, यह तीन-चरण के लिए भी किया जा सकता है, लेकिन मैं एक वैकल्पिक विकल्प दिखाना चाहता हूं, अर्थात् वास्तविक समय में या उड़ान पर कर्तव्य मूल्य की गणना।


एक विशेषता है। इस मामले में PWM की आवृत्ति भी 50 kHz है और चरण संकेत इस संकेत की अवधि के बीच सेट है। तदनुसार, जब हम 50 हर्ट्ज की आवृत्ति के साथ एक साइनसॉइड को संशोधित करते हैं, तो हार्डवेयर चरण शिफ्ट "खो" जाएगा, यह अभी भी पीडब्लूएम के बीच मौजूद होगा, लेकिन साइनसॉइड के अंदर नहीं, इसलिए इसे सॉफ्टवेयर करना होगा। त्रिकोणमिति TMS320F28027 के लिए एक भारी चीज है, लेकिन यह मेरे साथ बहुत व्यस्त नहीं है, इसलिए इसे गिनने दें। यदि आपके पास एक कार्य है जिसमें बहुत अधिक गणनाओं की आवश्यकता होती है, तो आपको टीएमयू और एफपीयू के साथ एक नियंत्रक की आवश्यकता होती है, उदाहरण के लिए, टीएमएस 320 एफ 280049, जो गणित को बहुत तेजी से बदल सकता है।


पीडब्लूएम में कर्तव्य मूल्यों को लोड करने के लिए, हमें एक टाइमर की आवश्यकता होती है, जिसकी अवधि नमूना आवृत्ति निर्धारित करेगी। मुझे 20 एमएस (1/50 हर्ट्ज = 20 मिसे) की अवधि की आवश्यकता है और एक साइनसॉइड में चरणों की संख्या लें, चलो 20 को कहते हैं, परिणामस्वरूप, 0.02 s / 20 = 0.001 ms = 1 हर्ट्ज की आवृत्ति के साथ एक बाधा उत्पन्न की जानी चाहिए और इस रुकावट में मैं PWM को मान लिखूंगा । सादगी के लिए, मैं एक नियमित रूप से CPU0 टाइमर ले और इसे कॉन्फ़िगर करेगा:


 void InitTimer0ForGenerator (void) { EALLOW; PieVectTable.TINT0 = &cpu_timer0_isr; EDIS; InitCpuTimers(); ConfigCpuTimer(&CpuTimer0, 60, 1000); CpuTimer0Regs.TCR.bit.TIE = 1; CpuTimer0Regs.TCR.bit.TSS = 0; IER |= M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // Enable TINT0 in the PIE: Group 1 interrupt 7 EINT; // Enable Global interrupt INTM ERTM; // Enable Global real-time interrupt DBGM } __interrupt void cpu_timer0_isr (void) { CpuTimer0.InterruptCount++; /* *   -  . ... */ PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge this interrupt to receive more interrupts from group 1 } 

InitCpuTimers और ConfigCpuTimer फ़ंक्शंस मानक हैं, सभी सेटिंग्स उनमें हैं, हमें बस कोर फ़्रीक्वेंसी (60 MHz) और माइक्रोसेकंड में गिनती की अवधि (1000 μs = 1 ms) को स्थानांतरित करने की आवश्यकता है, जो 1 kHz के बराबर है, और हमें इसकी आवश्यकता है। तो जहां कॉन्फ़िगरेशन फ़ंक्शन में हम बाधा डालते हैं और हमारे बीच के हैंडलर के पते को पास करते हैं, जहां सब कुछ होगा।


अब साइन सूत्र को फिर से "आविष्कार" करना आवश्यक है, इसके लिए आपको स्कूल त्रिकोणमिति और उस सबका ज्ञान होना चाहिए। और इसलिए ... हमारे पास एक फ़ंक्शन है y = sin (x) चलो इस फ़ंक्शन को प्लॉट करें:


y = पाप (x)


जैसा कि आप ग्राफ पर देख सकते हैं, y का आयाम -1 से 1 तक भिन्न होता है, लेकिन हम 0 से 1 तक चाहते हैं, क्योंकि न्यूनतम आयाम के साथ हमारे पास 0 वी है, और अधिकतम (1 के बराबर) के साथ हमारे पास + वीसीसी है। "-1" + + 1 ड्रा करने के लिए हमें द्विध्रुवी पोषण की आवश्यकता होती है, लेकिन यह नहीं है। आपको चार्ट को एक सकारात्मक दिशा में स्थानांतरित करने की आवश्यकता है। यदि हम इसे ऊपर उठाते हैं, तो यह 0 से +2 तक हो जाएगा, और हम केवल +1 तक कर सकते हैं। तो आपको 2 और केवल कुछ से विभाजित करने की आवश्यकता है! आइए बस y = (पाप (x) / 2) के लिए विभाजन और साजिश रचने से शुरू करें :


y = (पाप (x) / 2)


अहा! अब ग्राफ की सीमा -0.5 से +0.5 तक है, यानी आयाम 1 है। यह पहले से बेहतर है, लेकिन हमें अभी तक नकारात्मक मूल्यों से छुटकारा नहीं मिला है, तो चलिए ग्राफ को 0.5 तक स्थानांतरित करते हैं, इसके लिए हमें केवल इस मान को परिणाम में जोड़ने और सूत्र प्राप्त करने की आवश्यकता है y = 0.5 + (sin (x) / 2) और इस फंक्शन के लिए ग्राफ प्लॉट करें:


y = 0.5 + (पाप (x) / 2)


अब सब कुछ बिल्कुल सही हो गया है: साइनसॉइड में 0 से 1 तक का आयाम है, नकारात्मक मूल्य अनुपस्थित हैं। सूत्र y = 0.5 + (पाप (x) / 2) पहले चरण का वर्णन करता है, अब चरण 2 और 3 प्राप्त करने के लिए एक चरण बदलाव जोड़ना आवश्यक है। ऐसा करने के लिए , क्रमशः x से 2π / 3 और 4π / 3 घटाएं, और शेष के लिए सूत्र प्राप्त करें। चरण y = 0.5 + (पाप (x-2 3/3) / 2) और y = 0.5 + (sin (x-4 / / 3) / 2)। हम 3 ग्राफ बनाते हैं और देखते हैं कि क्या यह सच की तरह दिखता है:


3 चरण


बुरा नहीं है! जब वे तीन चरण के नेटवर्क या अतुल्यकालिक मोटर्स के बारे में बात करते हैं तो तस्वीर आमतौर पर इलेक्ट्रिकल इंजीनियरिंग पाठ्यपुस्तकों में चित्रित होती है। वैसे, 2.0943 2π / 3 है, और 4.1866 क्रमशः 4 3/3 है, मैंने अभी उन्हें अभी गिना है और वे मेरे कोड में दिखाई देते हैं। कुल हमारे पास 3 समीकरण हैं:


  • चरण A - y = 0.5 + (पाप (x) / 2)
  • चरण बी - y = 0.5 + (पाप (x-2 3/3) / 2)
  • चरण C - y = 0.5 + (पाप (x-4 3/3) / 2)

गणित की ओर से, सब कुछ सरल और स्पष्ट प्रतीत होता है, लेकिन अब इसे माइक्रोकंट्रोलर वास्तविकताओं के लिए अनुकूलित करने की आवश्यकता है। हमारी साइन वेव एनालॉग नहीं है, लेकिन इसमें "स्टेप्स" हैं, यानी यह असतत है, क्योंकि हम अपने मामले में केवल वोल्टेज या 0V या + 15V (VCC) सेट कर सकते हैं। इससे पहले, मैंने लिखा था कि मेरे पास 20 कदम होंगे, इसलिए 1 अवधि के लिए मेरे पास 20 गणनाएं होंगी।


सबसे पहले, आइए फैसला करें कि x का विकल्प क्या है। हमारे साइनसॉइड की अवधि 2π है , जिसका अर्थ है कि नमूना चरण 2 20/20 होगा। तदनुसार, साइनसॉइड में 20 बिंदु शामिल होंगे, जैसे कि हम बिंदुओं पर एक ग्राफ बना रहे हैं, और उनके बीच अनुमानित है। नतीजतन, पहले चरण में मूल्य पाप होगा (2 (* (1/20), दूसरे चरण में पाप (2/ * (2/20)), तीसरे चरण में पाप (2π (3/20)) और इसी तरह, जब हम यदि यह 20/20 तक पहुंच जाता है, तो इसका मतलब अवधि समाप्त हो जाएगा और फिर से गिनती शुरू करना आवश्यक होगा। प्राप्त आंकड़ों के आधार पर, सूत्रों को सही करें:


  • चरण A - y = 0.5 + (पाप (2 - * (n / N)) / 2)
  • चरण B - y = 0.5 + (पाप (2 - * (n / N) -2 3/3) / 2)
  • चरण C - y = 0.5 + (पाप (2 - * (n / N) -4 3/3) / 2)

अब, हम अब ग्राफ पर प्रत्येक विशिष्ट बिंदु पर साइन मूल्य पर विचार करते हैं। तदनुसार, एन वर्तमान चरण है, एन कुल चरण (20) है। इन फॉर्मूलों के बाद, हमें 0 से 1 तक मान मिलता है, लेकिन वास्तव में हम एक अमूर्त आयाम के साथ काम नहीं कर रहे हैं। हमारे मामले में आयाम कर्तव्य चक्र पर निर्भर करता है, क्योंकि ड्यूटी ० से ६०० (पीडब्लूएम सेटिंग्स से) भिन्न होती है, फिर ० से ० होती है, और १ से ६०० के बराबर होती है। इसके आधार पर, आइए इसे वास्तविक फॉर्मूले में पुनर्गणना करें जो सीएमपीए पीडब्लूएम रजिस्टर में लोड किया जाएगा:


  • चरण ए - कर्तव्य 1 = ए (0.5 + (पाप (2 n (एन / एन)) / 2))
  • चरण बी - ड्यूटी 2 = ए (0.5 + (पाप (2 n (एन / एन) -2 3/3) / 2))
  • चरण सी - ड्यूटी 4 = ए (0.5 + (पाप (2 n (एन / एन) -4 3/3) / 2))

तदनुसार, आयाम का अधिकतम मूल्य है, अर्थात 600, एन वर्तमान चरण है, एन चरणों की कुल संख्या (20) है। ड्यूटी 1, ड्यूटी 2, ड्यूटी 4 के मूल्य कर्तव्य कारक के परिवर्तित वास्तविक मूल्य हैं, जिसे सीएमपीए में लोड किया जाता है अब अद्यतन बाधित हैंडलर के लिए कोड लिखें और सभी आवश्यक चर घोषित करें:


 float activeStep = 0.0; float amplitude = 600.0; float allStep = 20.0; const float pi = 3.1415; // π const float piTwo = 6.2831; // 2π const float phaseShifted120deg = 2.0943; // 2π/3 const float phaseShifted240deg = 4.1866; // 4π/3 __interrupt void cpu_timer0_isr (void) { if (activeStep >= allStep) {activeStep = 0;} activeStep++; EPwm1Regs.CMPA.half.CMPA = ((uint16_t)(amplitude * (0.5 + (sinf(piTwo * (activeStep / allStep)) / 2)))); EPwm2Regs.CMPA.half.CMPA = ((uint16_t)(amplitude * (0.5 + (sinf(piTwo * (activeStep / allStep) - phaseShifted120deg) / 2)))); EPwm4Regs.CMPA.half.CMPA = ((uint16_t)(amplitude * (0.5 + (sinf(piTwo * (activeStep / allStep) - phaseShifted240deg) / 2)))); PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge this interrupt to receive more interrupts from group 1 } 

कोड, जैसा कि आप देखते हैं, सबसे सरल है, यदि आप समझते हैं कि समस्या को हल करने के लिए क्या करना चाहिए था और गणित को सरल करना था। हर बार इंटरप्ट कहा जाता है, हम सक्रिय स्टेप चर को बढ़ाते हैं, जिसमें चरण संख्या होती है, यह 0 से 20 तक बदलता है और फिर रीसेट होता है। यह पता चला है कि एक अवधि में हम प्रत्येक चरण के लिए 20 चरणों और 20 गणना करते हैं। हर समय सूत्र में 2π / 3 और 4 not / 3 की गणना नहीं करने के लिए, मैंने उन्हें स्थिरांक के रूप में उपयोग करने के लिए तुरंत गिना।


गणना न्यूनतम निकली, इस एमके के लिए यह बिल्कुल कुछ भी नहीं है। यदि वांछित है, तो अंकों की संख्या में काफी वृद्धि हो सकती है, उदाहरण के लिए, 200 तक। यह सब कार्य पर निर्भर करता है। पीडब्लूएम आवृत्ति को बदलना बाधा कॉल आवृत्ति और चरणों की संख्या को बदलकर होता है। आप चर आयाम भी बदल सकते हैं और बिजली कनवर्टर के आउटपुट में वोल्टेज बदल सकते हैं।


माइक्रोकंट्रोलर को कोड डाउनलोड करने के बाद, आपको संबंधित चित्र मिलेगा:


ऑल्ग्राम 1 नंबर


यदि आप वाई के साथ ग्राफ को बढ़ाते हैं , तो सिग्नल के दोषों को देखना बेहतर हो जाता है। यह छोटी संख्या में नमूनाकरण चरणों का एक परिणाम है, एक सशर्त नियम लागू होता है: अधिक अंक, सिग्नल जितना सुंदर होगा।


ऑल्ग्राम नंबर 3


निष्कर्ष


आज मैंने मल्टीफ़ेज़ सिस्टम में चरण बदलाव के गठन की प्रक्रिया के बारे में बात की, सिद्धांत रूप में, कुछ भी जटिल नहीं है, खासकर जब टीएमएस 320 एफ 28 का उपयोग किया जाता है। बाकी एल्गोरिदम पर निर्भर है, सिद्धांत रूप में, इंटरनेट पर, कई लेख हैं जहां चबाने वाले नियंत्रण और ब्रशलेस मोटर्स, और अतुल्यकालिक और अन्य सभी प्रकार के हैं, आप केवल तर्क को स्थानांतरित कर सकते हैं।


मुझे उम्मीद है कि यह सामग्री उपयोगी होगी और पढ़ने के लिए विशेष रूप से उबाऊ नहीं होगी। हमेशा की तरह, स्रोत संलग्न है:


कोड संगीतकार स्टूडियो के लिए परियोजना के साथ पुरालेख

Source: https://habr.com/ru/post/hi457548/


All Articles