হার্ডওয়্যার PWM ফ্রিকোয়েন্সি নিয়ন্ত্রণ করুন


21

আমি ওয়্যারিংপি সহ হার্ডওয়্যার পিডব্লিউএম আউটপুট ব্যবহার করছি। এটি pwmSetClock ফাংশন সরবরাহ করে যা ফ্রিকোয়েন্সি পরিবর্তন করা সম্ভব করে তোলে। ( https://projects.drogon.net/raspberry-pi/wiringpi/funifications/ )। আমি বিশ্বাস করি যেহেতু ডিফল্টটি 200 মেগাহার্জ হয় 200000000 তে বিভাজকটি সেট করে আউটপুট ফ্ল্যাশ পর্যন্ত দৃশ্যমানভাবে একটি এলইডি হুক করা উচিত, তবে এটি তেমন নয়।

এটি কি পরিবর্তন করা যায়?


1
আমি হার্ডওয়্যার পিডাব্লুএম এর সাথে কিছু পরীক্ষা করছি, এবং এটি ফিক্সড ফ্রিকোয়েন্সি বলে মনে হচ্ছে না। এটি পালস প্রস্থ সেট ইন এর উপর ভিত্তি করে পরিবর্তিত হয় pwmWrite()। এমন কিছু নয় যা আমি প্রত্যাশা করবো
TheMeaningfulEngineer

উত্তর:


25

আমি সম্প্রতি পিডব্লিউএম নিজেই পরীক্ষা-নিরীক্ষার কিছু কারণ পেয়েছি এবং দেখেছি যে (কোনও একটি মন্তব্যে দেখানো হয়েছে) দায়িত্ব চক্রের সাথে ফ্রিকোয়েন্সি আলাদা বলে মনে হচ্ছে - বিজার, তাই না? দেখা যাচ্ছে যে পিডাব্লুএম ডালগুলি যথাসম্ভব সমানভাবে বিতরণ করার জন্য ব্রডকম "ভারসাম্যপূর্ণ" পিডাব্লুএমএম প্রয়োগ করেছে। তারা তাদের ডাটাশিটের ১৩৯ পৃষ্ঠায় অ্যালগরিদমের বিবরণ এবং আরও কিছু আলোচনার বিবরণ দেয়: http://www.element14.com/commune/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf

সুতরাং আপনি যা চান তা হ'ল পিডব্লিউএমকে মার্ক-স্পেস মোডে স্থাপন করা যা আপনাকে যে theতিহ্যবাহী (এবং সহজেই অনুমানযোগ্য) পিডাব্লুএম খুঁজছেন তা দেবে:

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 সেট করতে চান তবে আপনি নীচের সম্পর্কটি ব্যবহার করতে পারেন:

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

আপনি যদি এর জন্য সর্বাধিক অনুমতিযোগ্য মানগুলি ব্যবহার করেন pwmSetClock()এবং pwmSetRange()আপনি সর্বনিম্ন অর্জনযোগ্য হার্ডওয়্যার PWM ফ্রিকোয়েন্সিটি ~ 1.14 Hz এর সাথে শেষ করবেন। এটি অবশ্যই একটি এলইডিকে একটি দৃশ্যমান ঝাঁকুনি দেবে (সত্যিই আরও বেশি ফ্ল্যাশ করবে)। আমি ওসিলোস্কোপের সাহায্যে উপরের সমীকরণটি নিশ্চিত করেছিলাম এবং এটি মনে হয়। উপরের বর্ণনা অনুসারে আপনার প্রয়োজনীয় রেজোলিউশন দ্বারা উপরের ফ্রিকোয়েন্সি সীমাটি প্রভাবিত হবে।


পিডব্লিউএমরেঞ্জের নিম্ন সীমাটি সম্পর্কিত: আমি সফলভাবে এটি 2 এ নির্ধারণ করেছি (50% শুল্ক চক্র পেতে)।
টেড পুডলিক

আপনি কোন উত্স থেকে জানেন যে পিডব্লিউএম ঘড়ির ফ্রিকোয়েন্সি 19.2 মেগাহার্টজ আছে?
থি জিজি

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º)

দ্রষ্টব্য: আমার servo 50Hz সংকেত আশা করে ।


আপনি কীভাবে আসবেন: 'gpio pwmr 200 # 0.1 ms per ইউনিট'
এমএক্সলিয়ান

50Hz ---> প্রতি চক্র 20 মিমি। 20ms / 200 ইউনিট =
0.1 মিটার

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); -> 871kHz

pwmSetClock (20); -> 480kHz

pwmSetClock (200); -> 48kHz

pwmSetClock (500); -> 19kHz

pwmSetClock (1000); -> 9.59kHz

pwmSetClock (2000); -> 4.802kHz

pwmSetClock (4000); -> 2.401kHz

pwmSetClock (5000); -> 10.58kHz

আমি যা যা পরীক্ষা করেছি, এটি থেকে বিভাজকটি 2 থেকে 5000 এর চেয়ে কম সংখ্যায় চলে গেছে বলে মনে হয়। সংখ্যার বাইনারি উপস্থাপনার সাথে এটির কিছু আছে যা প্রত্যক্ষভাবে রেজিস্টারে সেট করা হচ্ছে। একবার বাইনারি উপস্থাপনার রেজিস্ট্রারের চেয়ে বেশি বিট থাকলে এটি প্রথম বিট গ্রহণ করে এবং সংখ্যাকে সেভাবে ব্যাখ্যা করে। 4000 থেকে 5000 এ যাওয়ার সময় কেন অদ্ভুত আচরণটি আসে ts


1
আমি কীভাবে দায়িত্ব চক্র পরিবর্তন করব?
নফাল

আপনি কীভাবে ফ্রিকোয়েন্সিগুলি পরিমাপ করলেন?
Seanny123
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.