- PWM (पल्स चौड़ाई मॉडुलन)
- ARM7-LPC2148 में PWM पिन
- ARM7-LPC2148 में PWM रजिस्टर
- अवयव आवश्यक
- सर्किट आरेख और कनेक्शन
- PWM के लिए ARM7-LPC2148 प्रोग्रामिंग
- PWM और ADC के लिए LPC2148 प्रोग्रामिंग में शामिल कदम
जैसा कि हम जानते हैं कि माइक्रोकंट्रोलर एनालॉग सेंसर से एनालॉग इनपुट लेते हैं और उन संकेतों को संसाधित करने के लिए एडीसी (एनालॉग से डिजिटल कनवर्टर) का उपयोग करते हैं। लेकिन क्या हो अगर कोई माइक्रोकंट्रोलर एनालॉग संचालित उपकरणों जैसे सर्वो मोटर, डीसी मोटर आदि को नियंत्रित करने के लिए एक एनालॉग सिग्नल का उत्पादन करना चाहता है? माइक्रोकंट्रोलर 1 वी, 5 वी जैसे आउटपुट वोल्टेज का उत्पादन नहीं करते हैं, इसके बजाय वे एनालॉग उपकरणों के संचालन के लिए पीडब्लूएम नामक तकनीक का उपयोग करते हैं। पीडब्लूएम का एक उदाहरण हमारे लैपटॉप का कूलिंग फैन (डीसी मोटर) है जिसे तापमान के अनुसार गति नियंत्रित करने की आवश्यकता होती है, और इसे मदरबोर्ड में पल्स चौड़ाई मॉडुलन (पीडब्लूएम) तकनीक का उपयोग करके लागू किया जाता है।
इस ट्यूटोरियल में हम ARM7-LPC2148 माइक्रोकंट्रोलर में PWM का उपयोग करके एक एलईडी की चमक को नियंत्रित करेंगे ।
PWM (पल्स चौड़ाई मॉडुलन)
पीडब्लूएम डिजिटल मूल्य का उपयोग करने वाले एनालॉग उपकरणों को नियंत्रित करने का एक अच्छा तरीका है जैसे मोटर की गति, एक एलईडी की चमक आदि को नियंत्रित करना। हालांकि पीडब्लूएम शुद्ध एनालॉग आउटपुट प्रदान नहीं करता है, लेकिन यह एनालॉग डिवाइसेस को नियंत्रित करने के लिए सभ्य एनालॉग दालों को उत्पन्न करता है। पीडब्लूएम वास्तव में आयताकार पल्स तरंग की चौड़ाई को नियंत्रित करता है ताकि परिणामी लहर के औसत मूल्य में भिन्नता प्राप्त हो सके।
PWM का कर्तव्य चक्र
समय का प्रतिशत जिसमें PWM सिग्नल उच्च रहता है (समय पर) को कर्तव्य चक्र कहा जाता है। यदि सिग्नल हमेशा चालू रहता है तो यह 100% शुल्क चक्र में होता है और यदि यह हमेशा बंद रहता है तो यह 0% शुल्क चक्र है।
ड्यूटी साइकिल = समय चालू करें / (समय चालू करें + बंद समय चालू करें)
ARM7-LPC2148 में PWM पिन
नीचे दी गई छवि ARM7-LPC2148 के PWM आउटपुट पिन को इंगित करती है । PWM के लिए कुल छह पिन हैं।
PWM चैनल |
LPC2148 पोर्ट पिंस |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
ARM7-LPC2148 में PWM रजिस्टर
हमारे प्रोजेक्ट में आने से पहले हमें LPC2148 में PWM रजिस्टरों के बारे में जानना होगा।
यहाँ PWM के लिए LPC2148 में प्रयुक्त रजिस्टरों की सूची दी गई है
1. पीडब्लूएमपीआर: पीडब्लूएम प्रेस्केल रजिस्टर
उपयोग: यह एक 32-बिट रजिस्टर है। इसमें पीडब्लूएम टाइमर काउंटर (यह वास्तव में प्रीस्केल काउंटर का अधिकतम मूल्य रखता है) बढ़ाने से पहले पीसीएलके (शून्य से 1) की संख्या होनी चाहिए।
2. पीडब्लूएमसीसी: पीडब्लूएम प्रीस्कूलर काउंटर
उपयोग: यह एक 32-बिट रजिस्टर है । इसमें इंक्रीमेंटिंग काउंटर वैल्यू शामिल है। जब यह मान PR मान प्लस 1 के बराबर होता है, तो PWM टाइमर काउंटर (TC) बढ़ जाता है।
3. PWMTCR: PWM टाइमर कंट्रोल रजिस्टर
उपयोग: इसमें काउंटर सक्षम, काउंटर रीसेट और पीडब्लूएम सक्षम नियंत्रण बिट्स शामिल हैं। यह एक 8-बिट रजिस्टर है।
7: 4 |
३ |
२ |
1 |
० |
आरक्षित |
PWM सक्षम है |
आरक्षित |
COUNTER RESET |
COUNTER सक्षम है |
- PWM सक्षम करें: (बिट -3)
0- PWM अक्षम
1- PWM सक्षम
- काउंटर सक्षम: (बिट -0)
0- काउंटरों को अक्षम करें
1- काउंटर सक्षम करें
- काउंटर रीसेट: (बिट -1)
0- कुछ भी न करें।
1- पीसीएलके के पॉजिटिव किनारे PWMTC और PWMPC को रीसेट करें।
4. PWMTC: PWM टाइमर काउंटर
उपयोग: यह एक 32-बिट रजिस्टर है। इसमें पीडब्लूएम टाइमर को बढ़ाने का वर्तमान मूल्य है। जब प्रिस्क्लर काउंटर (पीसी) प्रिस्क्रेलर रजिस्टर (पीआर) मान प्लस 1 तक पहुंचता है, तो यह काउंटर बढ़ जाता है।
5. PWMIR: PWM इंटरप्ट रजिस्टर
उपयोग: यह एक 16-बिट रजिस्टर है। इसमें PWM मैच चैनल्स के 0-6 के लिए इंटरप्ट फ्लैग हैं। एक बाधा ध्वज तब सेट किया जाता है जब उस चैनल (MRx Interrupt) के लिए एक व्यवधान उत्पन्न होता है जहां X चैनल नंबर (0 से 6) है।
6. PWMMR0-PWMMR6: PWM मैच रजिस्टर
उपयोग: यह एक 32-बिट रजिस्टर है । दरअसल मैच चैनल समूह 6 सिंगल-एज नियंत्रित या 3 डबल-किनारे नियंत्रित PWM आउटपुट सेट करने की अनुमति देता है। आप PWMPCR में अपनी आवश्यकताओं के अनुरूप इन PWM आउटपुट को कॉन्फ़िगर करने के लिए सात मैच चैनल्स को संशोधित कर सकते हैं।
7. PWMMCR: PWM मैच कंट्रोल रजिस्टर
उपयोग: यह एक 32-बिट रजिस्टर है। इसमें इंटरप्ट, रीसेट और स्टॉप बिट्स हैं जो चयनित मिलान चैनल को नियंत्रित करते हैं। PWM मैच रजिस्टर और PWM टाइमर काउंटरों के बीच एक मैच होता है।
31:21 |
२० |
१ ९ |
१। |
।। |
५ |
४ |
३ |
२ |
1 |
० |
आरक्षित |
PWMMR6S |
PWMMR6R |
PWMMR6I |
।। |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
यहाँ x 0 से 6 तक है
- PWMMRxI (बिट -0)
सक्षम या अक्षम पीडब्लूएम में रुकावट आती है
0- PWM मैच को बाधित करता है।
1- PWM मैच इंटरप्ट को सक्षम करें।
- PWMMRxR: (बिट -1)
RESET PWMTC - टाइमर काउंटर मान जब भी यह PWMRx से मेल खाता है
0- कुछ न करें।
1- PWMTC को रीसेट करता है।
- PWMMRxS: (बिट 2)
PWMTC और PWMPC जब PWMTC मैच रजिस्टर मूल्य तक पहुँचते हैं
0- PWM स्टॉप सुविधा को अक्षम करें।
1- पीडब्लूएम स्टॉप सुविधा को सक्षम करें।
8. PWMPCR: PWM कंट्रोल रजिस्टर
उपयोग: यह एक 16-बिट रजिस्टर है। इसमें बिट्स होते हैं जो पीडब्लूएम आउटपुट 0-6 को सक्षम करते हैं और प्रत्येक आउटपुट के लिए सिंगल-एज या डबल-एज कंट्रोल का चयन करते हैं।
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
अप्रयुक्त |
PWMENA6-PWMENA1 |
अप्रयुक्त |
PWMSEL6-PWMSEL2 |
अप्रयुक्त |
- PWMSELx (x: 2 से 6)
- PWMx के लिए सिंगल एज मोड
- 1- PWMx के लिए डबल एज मोड।
- PWMENAx (x: 1 से 6)
- PWMx अक्षम।
- 1- PWMx सक्षम।
9. PWMLER: PWM लैच इनेबल रजिस्टर
उपयोग: यह एक 8-बिट रजिस्टर है। इसमें प्रत्येक मैच चैनल के लिए मैच x लैच बिट्स हैं।
31: 7 |
६ |
५ |
४ |
३ |
२ |
1 |
० |
अप्रयुक्त |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 से 6):
0- नए मैच वैल्यू की लोडिंग को डिसेबल करें
1- टाइमर रीसेट होने पर नए मैच वैल्यू (PWMMRx) PWMMatch रजिस्टर से लोड करें।
अब एआरएम माइक्रोकंट्रोलर में पल्स चौड़ाई मॉड्यूलेशन को प्रदर्शित करने के लिए हार्डवेयर सेटअप का निर्माण शुरू करते हैं।
अवयव आवश्यक
हार्डवेयर
- ARM7-LPC2148 माइक्रोकंट्रोलर
- 3.3V वोल्टेज नियामक आईसी
- 10k पोटेंशियोमीटर
- एलईडी (कोई भी रंग)
- एलसीडी (16x2) प्रदर्शन मॉड्यूल
- ब्रेड बोर्ड
- तारों को जोड़ना
सॉफ्टवेयर
- कील uVision5
- फ्लैश मैजिक टूल
सर्किट आरेख और कनेक्शन
एलसीडी और ARM7-LPC2148 के बीच कनेक्शन
ARM7-LPC2148 |
एलसीडी (16x2) |
P0.4 |
रुपये (पंजीकरण चुनें) |
P0.6 |
ई (सक्षम) |
P0.12 |
D4 (डेटा पिन 4) |
P0.13 |
D5 (डेटा पिन 5) |
P0.14 |
D6 (डेटा पिन 6) |
P0.15 |
D7 (डेटा पिन 7) |
GND |
वीएसएस, आर / डब्ल्यू, के |
+ 5 वी |
वीडीडी, ए |
एलईडी और ARM7-LPC2148 के बीच कनेक्शन
LED का ANODE LPC2148 के PWM आउटपुट (P0.0) से जुड़ा है, जबकि LED का CATHODE पिन LPC2148 के GND पिन से जुड़ा है।
3.3V वोल्टेज नियामक के साथ ARM7-LPC2148 और पोटेंशियोमीटर के बीच कनेक्शन
3.3V वोल्टेज नियामक आईसी |
पिन समारोह |
एआरएम -7 एलपीसी 2148 पिन |
1. टाईट पिन |
- जीएनडी से वे |
जीएनडी पिन |
2.कंपनी पिन |
विनियमित + 3.3V आउटपुट |
LPC2148 के P0.28 को पोटेंशियोमीटर इनपुट और पोटेंशियोमीटर के आउटपुट के लिए |
3. राइट पिन |
+ वी 5 वी से इनपुट |
+ 5 वी |
ध्यान देने योग्य बात
1. 3.3V के एक वोल्टेज नियामक को LPC2148 के ADC पिन (P0.28) के अनुरूप इनपुट मूल्य प्रदान करने के लिए यहां उपयोग किया जाता है और क्योंकि हम 5V शक्ति का उपयोग कर रहे हैं, हमें 3.3V के वोल्टेज नियामक के साथ वोल्टेज को विनियमित करने की आवश्यकता है।
2. LPC2148 पिन P0.28 को एनालॉग इनपुट (ADC) प्रदान करने के लिए (0V से 3.3V) के बीच वोल्टेज को अलग करने के लिए एक पोटेंशियोमीटर का उपयोग किया जाता है।
PWM के लिए ARM7-LPC2148 प्रोग्रामिंग
ARM7-LPC2148 प्रोग्राम करने के लिए हमें keil uVision और Flash Magic टूल की आवश्यकता है। हम माइक्रो यूएसबी पोर्ट के माध्यम से ARM7 स्टिक को प्रोग्राम करने के लिए USB केबल का उपयोग कर रहे हैं। हम Keil का उपयोग करके कोड लिखते हैं और एक हेक्स फ़ाइल बनाते हैं और फिर HEX फाइल को फ्लैश मैजिक का उपयोग करते हुए ARM7 स्टिक में लाते हैं। काइल uVision और फ्लैश मैजिक को स्थापित करने के बारे में अधिक जानने के लिए और उनका उपयोग कैसे करें लिंक का पालन करें ARM7 LPC2148 माइक्रोकंट्रोलर के साथ शुरुआत करें और इसे Keil uVision का उपयोग करके प्रोग्राम करें।
इस ट्यूटोरियल में हम एलईडी की चमक को नियंत्रित करने के लिए ADC और PWM तकनीक का उपयोग करेंगे। यहां LPC2148 को ADC इनपुट पिन P0.28 के माध्यम से एनालॉग इनपुट (0 से 3.3V) दिया जाता है, फिर इस एनालॉग इनपुट को डिजिटल वैल्यू (0 से 1023) में बदल दिया जाता है। फिर यह मान फिर से डिजिटल मूल्य (0 - 255) में परिवर्तित हो जाता है क्योंकि LPC2148 के PWM आउटपुट में केवल 8-बिट रिज़ॉल्यूशन (2 8) है। एलईडी PWM पिन P0.0 से जुड़ा है और एलईडी की चमक को पोटेंशियोमीटर का उपयोग करके नियंत्रित किया जा सकता है। एआरएमसी के बारे में अधिक जानने के लिए ARM7-LPC2148 लिंक का पालन करें।
PWM और ADC के लिए LPC2148 प्रोग्रामिंग में शामिल कदम
चरण 1: - घड़ी की पीढ़ी के लिए PLL को कॉन्फ़िगर करने के लिए सबसे पहली बात यह है कि यह सिस्टम घड़ी और LPC2148 के परिधीय घड़ी को सेट करता है जैसा कि प्रोग्रामर को चाहिए होता है। LPC2148 के लिए अधिकतम घड़ी आवृत्ति 60Mhz है। PLL घड़ी पीढ़ी को कॉन्फ़िगर करने के लिए निम्नलिखित पंक्तियों का उपयोग किया जाता है।
शून्य initilizePLL (शून्य) // फ़ंक्शन का उपयोग घड़ी की पीढ़ी के लिए PLL का उपयोग करने के लिए { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; जबकि (((PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
चरण 2: - अगली बात पिनसेल रजिस्टर का उपयोग करके LPC2148 के PWM पिन और PWM फ़ंक्शन का चयन करना है। हम PINSEL0 का उपयोग करते हैं क्योंकि हम L02148 के PWM आउटपुट के लिए P0.0 का उपयोग करते हैं।
PINSEL0 = 0x00000002; // PWM आउटपुट के लिए पिन P0.0 सेट करना
चरण 3: - अगला हमें PWMTCR (टाइमर कंट्रोल रजिस्टर) का उपयोग करके टाइमर को रीसेट करने की आवश्यकता है।
PWMTCR = (1 << 1); // काउंटर रीसेट के रूप में पीडब्लूएम टाइमर कंट्रोल रजिस्टर सेट करना
और फिर, निर्धारित मूल्य निर्धारित करें जो पीडब्लूएम के संकल्प को तय करता है। मैं इसे शून्य पर सेट कर रहा हूं
PWMPR = 0X00; // पीडब्लूएम प्रेस्केल मूल्य निर्धारित करना
चरण 4: - इसके बाद हमें PWMMCR (PWM मैच कंट्रोल रजिस्टर) को सेट करने की आवश्यकता है क्योंकि यह रीसेट की तरह संचालन सेट करता है, PWMMR0 के लिए व्यवधान डालता है।
PWMMCR = (1 << 0) - (1 << 1); // PWM मैच कंट्रोल रजिस्टर सेट करना
चरण 5: - पीडब्लूएम चैनल की अधिकतम अवधि पीडब्लूएमआरआर का उपयोग करके निर्धारित की गई है।
PWMMR0 = PWMvalue; // पीडब्लूएम मान देने से अधिकतम मूल्य
हमारे मामले में अधिकतम मूल्य 255 है (अधिकतम चमक के लिए)
चरण 6: - इसके बाद हमें PWMLER का उपयोग करके संबंधित मैच रजिस्टरों को Latch Enable सेट करना होगा
PWMLER = (1 << 0); // एनाल्बे पीडब्लूएम कुंडी
(हम PWMMR0 का उपयोग करते हैं) इसलिए PWMLER में 1 सेट करके संबंधित बिट को सक्षम करें
चरण 7: - PWM आउटपुट को पिन में सक्षम करने के लिए हमें PWMTCR का उपयोग करने के लिए PWM टाइमर काउंटर और PWM मोड को सक्षम करने की आवश्यकता है।
PWMTCR = (1 << 0) - (1 << 3); // PWM और PWM काउंटर को सक्षम करना
चरण 8: - अब हमें ADC पिन P0.28 से PWM के कर्तव्य चक्र को स्थापित करने के लिए पोटेंशियोमीटर मान प्राप्त करने की आवश्यकता है। तो हम ADC मान (0 से 1023) के लिए पोटेंशियोमीटर एनालॉग इनपुट (0 से 3.3V) को परिवर्तित करने के लिए LPC2148 में ADC मॉड्यूल का उपयोग करते हैं।
यहाँ हम 0-1023 से 0-255 तक मानों को परिवर्तित कर रहे हैं , इसे 4 के साथ विभाजित करके LPC2148 के PWM में 8-बिट रिज़ॉल्यूशन (2 8) है ।
चरण 9: - LPC2148 में ADC पिन P0.28 का चयन करने के लिए , हम उपयोग करते हैं
PINSEL1 = 0x01000000; // P0.28 को ADC INPUT AD0CR के रूप में सेट करना = (((14) << 8) - (1 << 21)); // सेटिंग घड़ी और पीडीएन ए / डी रूपांतरण के लिए
निम्न लाइनें एनालॉग इनपुट (0 से 3.3V) पर कब्जा करती हैं और इसे डिजिटल मूल्य (0 से 1023) में परिवर्तित करती हैं। और फिर इस डिजिटल मानों को उन्हें (0 से 255) में बदलने के लिए 4 से विभाजित किया गया है और अंत में LPC2148 के P0.0 पिन में PWM आउटपुट के रूप में खिलाया गया है, जिस पर एलईडी जुड़ा हुआ है।
AD0CR - = (1 << 1); // ADC रजिस्टर डिलेटाइम (10) में AD0.1 चैनल का चयन करें ; AD0CR - = (1 << 24); // ए / डी रूपांतरण शुरू करते समय ((AD0DR1 और (1 << 31)) == 0); // ADC डेटा रजिस्टर adcvalue = (AD0DR1 >> 6) और 0x3ff में पूर्ण बिट की जाँच करें ; // ADC डेटा रजिस्टर dutycycle = adcvalue / 4 से रिजल्ट प्राप्त करें; // (0 से 255) पीडब्लूएमआर 1 = ड्यूटिकाइकल से ड्यूटिकाइकल मान प्राप्त करने का सूत्र ; // सेट dutycycle मान को PWM मैच रजिस्टर PWMLER - = (1 << 1); // dutycycle मान के साथ PWM आउटपुट सक्षम करें
चरण 10: - अगला हम उन मूल्यों को एलसीडी (16X2) डिस्प्ले मॉड्यूल में प्रदर्शित करते हैं। तो हम एलसीडी डिस्प्ले मॉड्यूल को इनिशियलाइज़ करने के लिए निम्नलिखित पंक्तियों को जोड़ते हैं
शून्य LCD_INITILIZE (शून्य) // एलसीडी तैयार करने के लिए फ़ंक्शन { IO0DIR = 0x0000FF00; // सेट पिन P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 के रूप में OUTPUT देरी (20); LCD_SEND (0x02); // प्रारंभिक एलसीडी को ऑपरेशन के 4-बिट मोड में LCD_SEND (0x28); // 2 लाइनें (16X2) LCD_SEND (0x0C); // LCD_SEND (0x06) पर कर्सर पर प्रदर्शन ; // ऑटो इंक्रीमेंट कर्सर LCD_SEND (0x01); // स्पष्ट LCD_SEND (0x80) प्रदर्शित करें ; // पहली पंक्ति पहली स्थिति }
जैसा कि हमने एलपीसी 2148 के साथ 4-बिट मोड में एलसीडी को कनेक्ट किया है, हमें निबल (ऊपरी निबल और लोअर नीबबल) द्वारा प्रदर्शित होने के लिए मान भेजने की आवश्यकता है। तो निम्नलिखित पंक्तियों का उपयोग किया जाता है।
void LCD_DISPLAY (चार * संदेश) // एक { uint8_t i = 0 द्वारा भेजे गए वर्णों को मुद्रित करने का कार्य ; जबकि (संदेश! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((संदेश और 0xF0) << 8)); // अपर निबल IO0SET = 0x00000050 भेजता है ; // RS उच्च और सक्षम डेटा IO0CLR = 0x00000020 मुद्रित करने के लिए उच्च ; // आरडब्ल्यू कम लिखें मोड विलंब (2); IO0CLR = 0x00000040; // एन = 0, आरएस और आरडब्ल्यू अपरिवर्तित (यानी आरएस = 1, आरडब्ल्यू = 0) विलंब (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((संदेश और 0x0F) << 12)); // लोअर निबल IO0SET = 0x00000050 भेजता है ; // RS & EN हाई IO0CLR = 0x00000020; देरी (2); IO0CLR = 0x00000040; देरी (5); मैं ++; } }
उन एडीसी और पीडब्लूएम मूल्यों को प्रदर्शित करने के लिए हम इंट मेन () फ़ंक्शन में निम्नलिखित लाइनों का उपयोग करते हैं।
LCD_SEND (0x80); स्प्रिंटफ (डिस्प्लेडेक, "एडक्वाल्यू =% एफ", एडक्वाल्यू); LCD_DISPLAY (displayadc); // प्रदर्शन ADC मान (0 से 1023) LCD_SEND (0xC0); स्प्रिंटफ़ (एलईडीआउटपुट, "पीडब्लूएम ओपी =%। 2 एफ", चमक); LCD_DISPLAY (ledoutput); // (0 से 255 तक) ड्यूटिसाइकल मान प्रदर्शित करें
ट्यूटोरियल का पूरा कोड और वीडियो विवरण नीचे दिया गया है।