हार्डवेयर PWM आवृत्ति को नियंत्रित करें


21

मैं वायरिंगपीआई के साथ हार्डवेयर पीडब्लूएम आउटपुट का उपयोग कर रहा हूं। यह फ़ंक्शन pwmSetClock प्रदान करता है जो आवृत्ति को बदलना संभव बनाता है। ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ )। मेरा मानना ​​है कि चूंकि डिफॉल्ट 200 Mhz है, जो 200000000 पर विभाजक सेट कर रहा है, इसे आउटपुट फ्लैश तक एक एलईडी हुक बनाना चाहिए, लेकिन ऐसा नहीं है।

क्या इसे बदला जा सकता है?


1
मैं हार्डवेयर PWM के साथ कुछ परीक्षण कर रहा हूँ, और यह एक fiexd आवृत्ति नहीं है। इसमें स्थापित पल्स चौड़ाई के आधार पर विविध pwmWrite()। ऐसा कुछ नहीं जो मैं होने की उम्मीद
करूं

जवाबों:


25

मैंने हाल ही में पीडब्लूएम के साथ खुद को प्रयोग करना शुरू करने का कुछ कारण पाया है, और पाया कि (जैसा कि टिप्पणियों में से एक द्वारा बताया गया है) आवृत्ति चक्र - बिज़ारे के साथ बदलती है, है ना? यह पता चला है कि ब्रॉडकॉम ने पीडब्लूएम को चालू और बंद करने के लिए "संतुलित" पीडब्लूएम को लागू किया है ताकि समान रूप से वितरित किया जा सके। वे एल्गोरिथम और उनके डेटाशीट के पेज 139 पर कुछ और चर्चा का विवरण देते हैं: http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Detasheet.pdf

तो आप वास्तव में पीडब्लूएम को मार्क-स्पेस मोड में रखना चाहते हैं, जो आपको पारंपरिक (और आसानी से अनुमान लगाने योग्य) पीडब्लूएम की तलाश करेगा:

pwmSetMode(PWM_MODE_MS);

शेष उत्तर मान लेते हैं कि हम मार्क-स्पेस मोड में हैं।

मैंने कुछ मानों की स्वीकार्य सीमा के साथ प्रयोग भी किया pwmSetClock()और pwmSetRange()। जैसा कि अन्य उत्तरों में से एक में उल्लेख किया गया है, के लिए मान्य सीमा pwmSetClock()2 से 4095 तक जाती है, जबकि वैध सीमा pwmSetRange()4096 तक है (मैंने निचली सीमा खोजने का प्रयास नहीं किया था)।

रेंज और घड़ी (एक बेहतर नाम शायद भाज्य है) दोनों आवृत्ति को प्रभावित करते हैं। सीमा संकल्प को भी प्रभावित करती है, इसलिए जब यह बहुत कम मूल्यों का उपयोग करना संभव हो सकता है, तो इस बात की व्यावहारिक सीमा है कि आप शायद कितना कम जाना चाहते हैं। उदाहरण के लिए, यदि आपने 4 की सीमा का उपयोग किया है, तो आप उच्च आवृत्तियों को प्राप्त कर सकते हैं, लेकिन आप केवल 0/4, 1/4, 2/4, 3/4 या 4/4 के लिए शुल्क चक्र निर्धारित कर पाएंगे।

रास्पबेरी पाई पीडब्लूएम घड़ी की आधार आवृत्ति 19.2 मेगाहर्ट्ज है। यह आवृत्ति, जिसे तर्क द्वारा विभाजित किया गया है pwmSetClock(), वह आवृत्ति है जिस पर PWM काउंटर बढ़ा हुआ है। जब काउंटर निर्दिष्ट सीमा के बराबर मूल्य तक पहुंचता है, तो यह शून्य पर रीसेट हो जाता है। जबकि काउंटर निर्दिष्ट कर्तव्य चक्र से कम है, आउटपुट अधिक है, अन्यथा आउटपुट कम है।

इसका मतलब है, यदि आप PWM को एक विशिष्ट आवृत्ति के लिए सेट करना चाहते हैं, तो आप निम्न संबंध का उपयोग कर सकते हैं:

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.

यदि आप अधिकतम अनुमेय मूल्यों का उपयोग करते हैं pwmSetClock()और pwmSetRange(), आप ~ 1.14 हर्ट्ज की न्यूनतम प्राप्त करने योग्य हार्डवेयर पीडब्लूएम आवृत्ति के साथ समाप्त हो जाएंगे। यह निश्चित रूप से एक एलईडी के लिए एक दृश्यमान झिलमिलाहट (फ्लैश का अधिक, वास्तव में) देगा। मैंने एक आस्टसीलस्कप के साथ उपरोक्त समीकरण की पुष्टि की, और यह पकड़ लगता है। ऊपरी आवृत्ति सीमा आपके द्वारा आवश्यक संकल्प से प्रभावित होगी, जैसा कि ऊपर वर्णित है।


PwmRange पर निम्न बाउंड के संबंध में: मैंने इसे सफलतापूर्वक 2 पर सेट किया है (50% का कर्तव्य चक्र प्राप्त करने के लिए)।
टेड पुडलिक

आप किस स्रोत से जानते हैं कि pwm घड़ी की आवृत्ति 19.2 mhz है?
थि जीजी

10

इस सूत्र के अनुसार:

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange

हम सेट कर सकते हैं pwmClock=1920और pwmRange=200प्राप्त करने के लिए pwmFrequency=50Hz:

50 Hz = 19.2e6 Hz / 1920 / 200

मैं अलार्मपी पर इसका परीक्षण करता हूं:

$ pacman -S wiringpi
$ gpio mode 1 pwm
$ gpio pwm-ms
$ gpio pwmc 1920
$ gpio pwmr 200     # 0.1 ms per unit
$ gpio pwm 1 15     # 1.5 ms (0º)
$ gpio pwm 1 20     # 2.0 ms (+90º)
$ gpio pwm 1 10     # 1.0 ms (-90º)

नोट: मेरा सर्वो 50Hz सिग्नल की उम्मीद करता है।


आप कैसे आते हैं: 'gpio pwmr 200 # 0.1 ms प्रति यूनिट'
mxlian

50Hz ---> 20ms प्रति चक्र। 20ms / 200 इकाइयाँ = 0.1ms प्रति यूनिट
mxlian

5

यह वह कोड है जिसका मैं उपयोग कर रहा हूं। मैं यह देखने की कोशिश कर रहा हूं कि सेटिंग्स बदलते ही मैं क्या बदलूंगा।

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main (void)
{
  printf ("Raspberry Pi wiringPi test program\n") ;

  if (wiringPiSetupGpio() == -1)
    exit (1) ;

  pinMode(18,PWM_OUTPUT);
  pwmSetClock(2);
  pwmSetRange (10) ;
  pwmWrite (18, 5);

for (;;) delay (1000) ;
}

pwmSetClock (1); -> 2.342kHz

pwmSetClock (2); -> 4.81MHz

pwmSetClock (3); -> 3.19MHz

pwmSetClock (4); -> 2.398MHz

pwmSetClock (5); -> 1.919MHz

pwmSetClock (6); -> 1.6MHz

pwmSetClock (7); -> 1.3MHz

pwmSetClock (8); -> 1.2MHz

pwmSetClock (9); -> 1.067MHz

pwmSetClock (10); -> 959kHz

pwmSetClock (11); -> 871 kHz

pwmSetClock (20); -> 480kHz

pwmSetClock (200); -> 48kHz

pwmSetClock (500); -> 19kHz

pwmSetClock (1000); -> 9.59kHz

pwmSetClock (2000); -> 4.802kHz

pwmSetClock (4000); -> 2.401 kHz

pwmSetClock (5000); -> 10.58kHz

मैंने जो परीक्षण किया है, उससे लगता है कि भाजक 5000 से कम संख्या में 2 से जाता है। मुझे लगता है कि यह उन संख्याओं के द्विआधारी प्रतिनिधित्व के साथ कुछ करना होगा जो सीधे रजिस्टर में सेट किए जा रहे हैं। एक बार जब संख्याओं के द्विआधारी प्रतिनिधित्व में रजिस्टर की तुलना में अधिक बिट्स होते हैं, तो यह पहले बिट्स को ले सकता है और इस तरह से संख्याओं की व्याख्या करता है। यही कारण है कि 4000 से 5000 तक जाने पर अजीब व्यवहार होता है।


1
मैं कर्तव्य चक्र कैसे बदलूंगा?
noufal

आपने आवृत्तियों को कैसे मापा?
सीनैज १२
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.