পিডাব্লুএম ফ্রিকোয়েন্সি 25 কেএইচজেড সেট করুন


12

আমি বর্তমানে নিম্নলিখিত কোড সহ চারটি পিডাব্লুএম পিন সেট করতে পারি:

void setup()
{
    TCCR1B = TCCR1B & B11111000 | B00000001; // Set PWM frequency for D9 & D10:
    pinMode(pwmPin9, OUTPUT); // Sets the pin as output
    pinMode(pwmPin10, OUTPUT); // Sets the pin as output


    TCCR2B = TCCR2B & B11111000 | B00000001; // Set PWM for D3 & D11
    pinMode(pwmPin3, OUTPUT); // Sets the pin as output
    pinMode(pwmPin11, OUTPUT); // Sets the pin as output
}

আমি এই সেটআপটি অন্য কোথাও পেয়েছি, তবে আমি জানি না যে আমি কীভাবে এই চারটি পিডাব্লুএম পিন সেট করতে পারি তার পরিবর্তে প্রায় 25 কেজি হার্জেড। কীভাবে সম্ভব?


3
আপনি কী বুঝতে পারেন যে এভিআর টাইমারগুলি কীভাবে কাজ করে?
Ignacio Vazquez-Abram


1
@ IgnacioVazquez-Abram আমি পরিচিত নই এবং আমার এই চারটি পিন শুরুতে 25kHz এর মধ্যে স্থাপন করা দরকার। আমি একটি প্রকল্প শেষ করার জন্য তাড়াতাড়ি করছি এবং আমি যে কোনও সাহায্যে খুশি হব। আমার কাছে কোডটি 31kHz এ সেট করে। আমি কি এটি 25kHz রূপান্তর করতে পারি? ডিসি মোটরগুলিতে সেই ফ্রিক্য প্রয়োজন।
ব্যবহারকারী 16307

1
@ নিকগ্যামন ধন্যবাদ তবে এ মুহূর্তে এগুলি অধ্যয়ন করার জন্য আমার সত্যিই পর্যাপ্ত সময় নেই। আপনি কি আমাকে 25kHz সেটআপ করার কোড অংশটি সরবরাহ করতে পারেন? আমি হারিয়েছি
ব্যবহারকারী 16307

2
আমার তাদের সঠিক আরপিএম টিউন করা দরকার যাতে তাদের ডিউটি ​​চক্রটি কিছুটা আলাদা হয়ে যায়। কেবল 25kHz এ 2 পিন সেট করা কীভাবে সম্ভব?
ব্যবহারকারী 16307

উত্তর:


10

আমি এই দ্বিতীয় উত্তরটি পোস্ট করছি যেহেতু আমি বুঝতে পেরেছিলাম যে একটি একক আরডুইনো ইউনোতে 161 পদক্ষেপ সহ 25 কেএইচজেডে 4 পিডব্লিউএম চ্যানেল থাকা সম্ভব। এর মধ্যে মূল ঘড়ির ফ্রিকোয়েন্সিটি 8 মেগাহার্টজ-এ পরিবর্তন করা জড়িত , যার পুরো পার্শ্ব প্রতিক্রিয়া রয়েছে কারণ পুরো প্রোগ্রামটি অর্ধেক দ্রুত চলবে। এছাড়া তিন টাইমার, যার মানে যাও Arduino সময়জ্ঞান ফাংশন loosing পুনরায় কনফিগার জড়িত ( millis(), micros(), delay()এবং delayMicroseconds())। যদি এই ট্রেড অফগুলি গ্রহণযোগ্য হয় তবে এখানে এটি কীভাবে চলে যায়:

void setup()
{
    // Set the main system clock to 8 MHz.
    noInterrupts();
    CLKPR = _BV(CLKPCE);  // enable change of the clock prescaler
    CLKPR = _BV(CLKPS0);  // divide frequency by 2
    interrupts();

    // Configure Timer 0 for phase correct PWM @ 25 kHz.
    TCCR0A = 0;           // undo the configuration done by...
    TCCR0B = 0;           // ...the Arduino core library
    TCNT0  = 0;           // reset timer
    TCCR0A = _BV(COM0B1)  // non-inverted PWM on ch. B
        | _BV(WGM00);  // mode 5: ph. correct PWM, TOP = OCR0A
    TCCR0B = _BV(WGM02)   // ditto
        | _BV(CS00);   // prescaler = 1
    OCR0A  = 160;         // TOP = 160

    // Same for Timer 1.
    TCCR1A = 0;
    TCCR1B = 0;
    TCNT1  = 0;
    TCCR1A = _BV(COM1A1)  // non-inverted PWM on ch. A
        | _BV(COM1B1)  // same on ch. B
        | _BV(WGM11);  // mode 10: ph. correct PWM, TOP = ICR1
    TCCR1B = _BV(WGM13)   // ditto
        | _BV(CS10);   // prescaler = 1
    ICR1   = 160;

    // Same for Timer 2.
    TCCR2A = 0;
    TCCR2B = 0;
    TCNT2  = 0;
    TCCR2A = _BV(COM2B1)  // non-inverted PWM on ch. B
        | _BV(WGM20);  // mode 5: ph. correct PWM, TOP = OCR2A
    TCCR2B = _BV(WGM22)   // ditto
        | _BV(CS20);   // prescaler = 1
    OCR2A  = 160;
}

void loop()
{
    analogWrite( 3,   1);  // duty cycle = 1/160
    analogWrite( 5,  53);  // ~ 1/3
    analogWrite( 9, 107);  // ~ 2/3
    analogWrite(10, 159);  // 159/160
}

অন্য উত্তরের মতো নয়, এর কোনও সংশোধিত সংস্করণ দরকার নেই analogWrite(): মানকটি ভাল কাজ করবে। শুধুমাত্র যত্ন নেওয়া উচিত:

  1. লিখিত মানটি 0 (অর্থ সর্বদা নিম্ন) এবং 160 (সর্বদা উচ্চ) এর মধ্যে হওয়া উচিত।
  2. কেবল পিন 3, 5, 9 এবং 10 টি উপলব্ধ। analogWrite() 6 বা 11 পিনগুলিতে চেষ্টা করা কেবলমাত্র একটি পিডব্লিউএম আউটপুট সরবরাহ করতে ব্যর্থ হবে না, এটি যথাক্রমে 5 বা 3 পিনের ফ্রিকোয়েন্সিও পরিবর্তন করবে।

খুব দীর্ঘ সময় হয়ে গেছে এবং এখন আমি আরডুইনো ডিউয়ের সাথে একই জিনিসটির সাথে আটকে আছি যা অন্য প্রসেসর ব্যবহার করে। আপনি যদি এখানে কোনও ইনপুট পান তবে আমি খুশি হব arduino.stackexchange.com/questions/67053/…
ব্যবহারকারী 16307

11

আপনি পর্যায় সঠিক পিডব্লিউএম মোডে 25 কিলাহার্টজ থেকে টাইমার 1 থেকে চক্রটি কনফিগার করতে পারেন এবং এটি পিন 9 এবং 10 এর মতো দুটি আউটপুট ব্যবহার করতে পারেন:

// PWM output @ 25 kHz, only on pins 9 and 10.
// Output value should be between 0 and 320, inclusive.
void analogWrite25k(int pin, int value)
{
    switch (pin) {
        case 9:
            OCR1A = value;
            break;
        case 10:
            OCR1B = value;
            break;
        default:
            // no other pin will work
            break;
    }
}

void setup()
{
    // Configure Timer 1 for PWM @ 25 kHz.
    TCCR1A = 0;           // undo the configuration done by...
    TCCR1B = 0;           // ...the Arduino core library
    TCNT1  = 0;           // reset timer
    TCCR1A = _BV(COM1A1)  // non-inverted PWM on ch. A
           | _BV(COM1B1)  // same on ch; B
           | _BV(WGM11);  // mode 10: ph. correct PWM, TOP = ICR1
    TCCR1B = _BV(WGM13)   // ditto
           | _BV(CS10);   // prescaler = 1
    ICR1   = 320;         // TOP = 320

    // Set the PWM pins as output.
    pinMode( 9, OUTPUT);
    pinMode(10, OUTPUT);
}

void loop()
{
    // Just an example:
    analogWrite25k( 9, 110);
    analogWrite25k(10, 210);
    for (;;) ;  // infinite loop
}

0 এর সাথে মান analogWrite25k()লিখার অর্থ পিনটি সর্বদা স্বল্প থাকে, যেখানে 320 মানে সর্বদা উচ্চ হয়। নিয়মিত প্রায় কাজ করা analogWrite() উচিত , তবে এটি 255 একই হিসাবে 320 (অর্থাত্ সর্বদা উচ্চ) হিসাবে ব্যাখ্যা করবে।

এই কোডটি একটি আরডুইনো ইউনো বা অনুরূপ বোর্ড (এটিমেগা 168 বা 328 @ 16 মেগাহার্টজ) গ্রহণ করে। এখানে ব্যবহৃত পদ্ধতিটির জন্য 16-বিট টাইমার প্রয়োজন, এবং এটি টাইমার 1 ব্যবহার করে কারণ এটি ইউনোতে একমাত্র উপলব্ধ; এজন্য মাত্র দুটি আউটপুট উপলব্ধ। পদ্ধতিটি 16-বিট টাইমার সহ অন্যান্য এভিআর ভিত্তিক বোর্ডগুলির সাথে অভিযোজিত হতে পারে। গারবেন যেমন উল্লেখ করেছেন, সেই টাইমারটির সাথে সম্পর্কিত আইসিআরএক্স রেজিস্টার থাকা উচিত। আরডুইনো মেগায় এমন 4 টি টাইমার রয়েছে, যার প্রতিটি 3 টি আউটপুট রয়েছে।


1
এটি ব্যাখ্যা করা দরকারী হতে পারে যে এই পদ্ধতিটি কেবল টাইমার 1 এর জন্য কাজ করে, কারণ অন্য টাইমারদের কোনও ICRxরেজিস্টার নেই। বেশিরভাগ ক্ষেত্রে, টাইমার 0 এবং 2 এর জন্য আপনার কেবল টাইমর পি পিডব্লিউএম পিন থাকতে পারে
গারবেন

1
@ গ্রাবেন: ১ 16-বিট টাইমারের কি এই নিবন্ধ নেই? অন্তত তারা মেগা উপর।
এডগার বোনেট

1
হ্যাঁ, তবে কেবল টাইমার 1 এটিএমটাগ 328 এ 16-বিট is বাকি 8 বিট হয়। এবং ওপি 4 পিডব্লিউএম আউটপুট চায় এবং আপনার সমাধানটি কেবল 2 সরবরাহ করে Or বা আমি ভুল করছি?
গারবেন

1
@ গ্রাবেন: না, আপনি ঠিক বলেছেন। আমি কেবল এটিই বলেছি যে আইসিআরএক্সের প্রয়োজনীয়তা টাইমারকে 16-বিট করার প্রয়োজনের সাথে অপ্রয়োজনীয় বলে মনে হচ্ছে। ইউনো এবং মেগার পক্ষে কমপক্ষে অন্যান্য এভিআর ভিত্তিক আরডুইনো সম্পর্কে নিশ্চিত নন। ওপি বুঝতে পারে এটি কেবল 2 পিডব্লিউএম চ্যানেল সরবরাহ করে: তার প্রশ্ন এবং তার উত্তর সম্পর্কে আমার মন্তব্য দেখুন।
এডগার বোনেট

2
@ টেকনিক: 1. আমার জন্য কাজ করে। হতে পারে আপনি নির্ধারণ করতে ভুলে গেছি COM4C1মধ্যে TCCR4A? ২. যদি সমস্যা না হয় তবে আমি কীভাবে একটি ভাল প্রশ্ন জিজ্ঞাসা করব? , তারপরে আপনার পুরো উত্স কোডটি অন্তর্ভুক্ত করে এবং প্রোগ্রামটি আপনার কী প্রত্যাশা করবে এবং এর পরিবর্তে কী করবে তা স্পষ্ট করে জানিয়ে আপনার প্রশ্ন আপডেট করুন ("আমি কোনও সাফল্য দেখতে পাচ্ছি না" একটি বৈধ সমস্যা বিবৃতি হিসাবে বিবেচিত হবে না)।
এডগার বোনেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.