AVR ATMEGA / ATTINY টাইমার মিররযুক্ত আউটপুট বুঝতে সহায়তা প্রয়োজন


10

আমি আড়মালো AVR মাইক্রোকন্ট্রোলারের টাইমার 1 ব্যবহার করার চেষ্টা করছি, এটিআরডিনো বা এটিটিইনি 85 তে ব্যবহৃত হিসাবে এটিএমবেগা 328, দুটি ঘড়ির সংকেত যা একে অপরের মিরর চিত্র are আমি যে ফ্রিকোয়েন্সিটি উত্পন্ন করার চেষ্টা করছি সেটি হল একটি ভেরিয়েবল 1 মেগাহার্জ থেকে 2 মেগাহার্টজ বা তার বেশি যা আপনার নিয়ামকটিতে অন্য কিছু না করতে চাইলে আউটপুট পিনগুলি টগল করতে কোড ব্যবহার করে এটি করা খুব বেশি। তাই আমি সরাসরি সম্পর্কিত পিনগুলিতে টাইমার আউটপুটটি ব্যবহার করতে চাই। আমি জিসিসি টুলচেইন ব্যবহার করছি তাই আরডুইনো লাইব্রেরি বা ভাষার দ্বারা সীমাবদ্ধ নয়।

আতমেগা 328 এর টাইমার 1 এর সাথে দুটি পিন যুক্ত রয়েছে এবং এর মধ্যে আমি দুটি অভিন্ন 1MHz থেকে 2MHz সংকেত পেতে পারি। যদিও ডেটাশিটটি বলে মনে হচ্ছে আমি একটি উল্টানো তরঙ্গরূপ পেতে পারি, এটি আমাকে বিভ্রান্ত করছে। আমি টাইমার 1 এর সাথে পিডব্লিউএম সেটিংস ব্যবহার করে 1 মেগাহার্টজ-এ পৃথক শুল্ক চক্রের দুটি সংকেত পেতে সক্ষম হয়েছি, তবে উভয় সংকেত একই সাথে উচ্চতর হয়, সংক্ষিপ্তটি আগে কম যায়। এটি আমার প্রকল্পের কাজ করে না। আমার পিডাব্লুএম ডাল প্রস্থের প্রকরণের প্রয়োজনও নেই, আমার কেবল বিপরীত পর্বের দুটি অভিন্ন "ঘড়ি" টাইপ সংকেত প্রয়োজন, এগুলিই।

এটি করার জন্য আমি কারও কাছে কোড লিখতে বলছি না, টাইমারটির সাথে সম্পর্কিত দুটি পিনের মধ্যে একটির মোড় / ফ্ল্যাগগুলি আমাকে কী একটি সাধারণ ইনভার্টেড ওয়েভফর্ম দিতে হবে তা বলার জন্য আমার কেবল কারও প্রয়োজন। সম্ভব হলে আমি আউটপুটগুলির মধ্যে একটির জন্য একটি বাহ্যিক ইনভার্টিং সার্কিট ব্যবহার করা এড়াতে চাই যদি না এটি কেবল বিকল্প হয়।

এটিটিটাইনে যদি একেবারেই সম্ভব হয় তবে এটি আরও ভাল। এটিটিইনেও একটি টাইমারের সাথে 2 টি পিন যুক্ত রয়েছে, তবে এটিএমটিগার মতো একই বিকল্প রয়েছে বলে আমি নিশ্চিত নই।

আমার ইতিমধ্যে একটি 20 মেগাহার্জ স্ফটিক এবং পিসিবিতে সংযুক্ত ক্যাপাসিটার রয়েছে এবং 20 মেগাহার্টজ ঘড়ি এটিএমইগ 328 এ নির্ভরযোগ্যভাবে কাজ করছে। এটিটিআই 85 পিসিবিতে আমার কাছে একটি 8 মেগাহার্টজ স্ফটিক রয়েছে এবং এটি নির্ভরযোগ্যভাবেও কাজ করছে is

সাহায্য করুন. ধন্যবাদ.


আপডেট : উত্তর এবং মন্তব্যে এখনও অবধি কিছু অবৈধ অনুমান রয়েছে সম্ভবত আমার স্পষ্ট করা উচিত: নোট করুন যে আমার মূল পোস্টে আমি বলেছি যে আমি 8 মেগাহার্জ নয় , 20 মেগাহার্জ ঘড়ি ব্যবহার করছি এবং আমারও পিডব্লিউএমের দরকার নেই

একমাত্র মোড যা একটি উচ্চ পর্যায়ে আউটপুট ফ্রিকোয়েন্সি দেয় তা সিটিসি মোড বলে মনে হয় কারণ পিডব্লিউএম মোডগুলি 2 মেগাহার্টজ আউটপুট জন্য কাজ করছে না। সিটিসি মোডে টাইমার 1 আউটপুট এ, বা আউটপুট বি, উভয়ই উল্টানোর কোনও উপায় আছে?

আমার কোডটি যাচাই করার জন্য আমি এখন আমার নিজস্ব 20 মেগাহার্টজ বোর্ডের পরিবর্তে একটি স্ট্যান্ডার্ড আরডুইনো ইউনো (এটিএমইগা 328, 16 মেগাহার্টজ) এ চলেছি, এবং এটি পিন 9 এবং 10 থেকে সিটিসি মোডে একটি স্থির 2 মেগাহার্টজ ঘড়ির জন্য আমার কোড, টাইমার 1 আউটপুট পিন:

#define tick 9
#define tock 10

void setup() {
  pinMode(tick, OUTPUT);  
  pinMode(tock, OUTPUT); 

  TCCR1A = _BV(COM1A0) | _BV(COM1B0) ;   // activate both output pins 
  TCCR1B = _BV(WGM12)| 1;                // set CTC mode, prescaler mode 1

  // various frustrating attempts to invert OC1B failed. What do I put here?

  OCR1A = 3;                             // set the counter max for 2 MHz

}

void loop() {
}

উভয় পিনের জন্য অসিলোস্কোপের চিহ্নগুলি অভিন্ন এবং সিঙ্কে, আমি দুটি সিগন্যালের বিপরীতটি কীভাবে পেতে পারি? ডেটাশিটে উল্টানো মোডটি সিটিসি মোডে কিছুই করে না বলে মনে হয়। আমি কি ডেটাশিটটি ভুল করে পড়ছি, বা আমি কি সর্বোপরি কম ফ্রিকোয়েন্সি এবং পিডব্লিউএম মোড ব্যবহার করতে বাধ্য হব?

আমার মূল ক্যোয়ারীতে একটি নির্দিষ্ট "অনুগ্রহ" প্রশ্ন যুক্ত করার জন্য:
সুতরাং উপরের আমার কোডটিতে আমার কী পরিবর্তন করা দরকার, এটি 16 মেগাহার্টজ ঘড়ির সর্বোচ্চ সম্ভাব্য ফ্রিকোয়েন্সি পিন 9 এবং 11-এ পুরোপুরি উল্টানো সংকেত দেওয়ার জন্য , যে 2 মেগাহার্টজ না?

আমি আপাতত একটি স্ট্যান্ডার্ড আরডুইনো ইউনিোর সাথে আটকে থাকব, যাতে আমার হোমস্পান বোর্ড দ্বারা কোনও ত্রুটি মোড চালু না হয় এবং যাতে আরডুইনো সহ যে কেউ আমার কোডটি উপরে চেষ্টা করে তা নিশ্চিত করতে পারে যে এটি আমার উল্লেখ না করে কাজ করেছে প্রয়োজন নেই!


1
Atmega8L পৃষ্ঠায় 97-98 এ খুঁজছি উপাত্তপত্র সেখানে অপারেশন মোড একটি টেবিল হয়। পৃষ্ঠা 108 তে উল্লেখ করা হয়েছে "পিওডাব্লুএম আউট-পুট উত্পন্ন বা উল্টানো উচিত কিনা (বিপরীত বা অ-উল্টানো পিডাব্লুএম)" নিয়ন্ত্রণ করে সিওএম 21: 0 বিটগুলি control আমাদের আপনার সাফল্য পোস্ট করা!
ভোরাক

মিররযুক্ত আউটপুটগুলির জন্য কেন একটি সাধারণ ট্রানজিস্টর ইনভার্টার ব্যবহার করবেন না?
জনি বি

উত্তর:


10

এটিটিনি 85 ডেটাশিট থেকে:

অপারেশন মোড, অর্থাত্, টাইমার / কাউন্টার এবং আউটপুট তুলনা পিনের আচরণ ওয়েভফর্ম জেনারেশন মোডের সংযুক্তি দ্বারা সংজ্ঞায়িত করা হয় (ডাব্লুজিএম 0 [2: 0]) এবং তুলনা আউটপুট মোডের (COM0x [1: 0]) বিট। তুলনা আউটপুট মোড বিট গণনা ক্রমকে প্রভাবিত করে না, যখন ওয়েভফর্ম জেনারেশন মোড বিটগুলি করে। COM0x [1: 0] বিটগুলি উত্পাদিত পিডাব্লুএম আউটপুটটি উল্টানো উচিত বা না হওয়া (বিপরীত বা অ-বিপরীত পিডাব্লুএম ) নিয়ন্ত্রণ করে।

সারণী 11-5 মোডটি কীভাবে সেট করবেন তা দেখায়।

Mode   WGM  WGM  WGM  Timer/Counter Mode    TOP      Update of    TOV Flag
c0     02   01   00   of Operation                   OCRx at      Set on
==========================================================================
0      0    0    0    Normal                0xFF     Immediate    MAX(1)
1      0    0    1    PWM, Phase Correct    0xFF     TOP          BOTTOM
2      0    1    0    CTC                   OCRA     Immediate    MAX
3      0    1    1    Fast PWM              0xFF     BOTTOM       MAX
4      1    0    0    Reserved                                  
5      1    0    1    PWM, Phase Correct    OCRA     TOP          BOTTOM
6      1    1    0    Reserved                                  
7      1    1    1    Fast PWM              OCRA     BOTTOM       TOP

আপনি একটি দ্রুত পিডব্লিউএম মোড চান (সুতরাং মোড 3 বা মোড 7)। আপনি যদি ডিউটি ​​চক্রটি পৃথক করতে চান এবং আপনার মতো মনে হয় তবে আপনি মোড want চান এবং ওসিআরএ সেট করে ডিউটি ​​চক্রটি পরিবর্তিত করতে পারেন।

সারণি 11-3 দ্রুত PWM মোডের জন্য তুলনামূলক আউটপুট মোড সেট করতে কীভাবে তা দেখায়।

COM0A1/   COM0A0/
COM0B1    COM0B0     Description
===============================================================================
0         0          Normal port operation, OC0A/OC0B disconnected.
0         1          Reserved
1         0          Clear OC0A/OC0B on Compare Match, set OC0A/OC0B at BOTTOM
                     (non-inverting mode)
1         1          Set OC0A/OC0B on Compare Match, clear OC0A/OC0B at BOTTOM
                     (inverting mode)

এর অর্থ হল, আপনি টাইমার মান == OCR0A এবং উচ্চতর টাইমারের মান == 0x00 COM0A1: COM0A0 = 0b10 সেট করে যখন কম যেতে OC0A আউটপুট সেট করতে পারেন। অথবা COM0A1: COM0A0 = 0b11 সেট করে বৈসাদৃশ্য। এবং একইভাবে OC0B, OCR0B, COM0B0, COM0B1 এর জন্য।

পিডাব্লুএম ফ্রিকোয়েন্সি আই / ও ক্লক (8MHz এটি আপনার জন্য ভাল লাগে) এবং আপনার টাইমার প্রেসক্যালারের সেটিং দ্বারা নির্ধারিত হয়। এবং সমীকরণটি দ্রুত পিডব্লিউএম মোডের জন্য f_clk_IO / (N * 256) হিসাবে দেওয়া হয়।

সুতরাং আপনি ওসিআর 0 এ এবং ওসিআর 0 বি একই মান এবং COM0A1: COM0A0 = 0b10 এবং COM0B1: COM0B0 থেকে 0b11 সেট করে "ইনভার্টেড" মেরুতা জন্য OC0A এবং "বিপরীত" polarity জন্য OC0A ব্যবহার করতে পারেন।

হালনাগাদ

আপনি যত দ্রুত সম্ভব আউটপুট টগল করতে চান এবং আপনি মেগা 328 অপারেটিংটি 16MHz এ ব্যবহার করছেন, সিটিসি অপারেটিং মোড আপনাকে এর স্যুইচিং ফ্রিকোয়েন্সি পেতে অনুমতি দেবে:

f_OCnA = f_clk_IO / (2 * এন * [1 + ওসিআরএনএ) = 16e6 / (2 * 1 * [1 + 1]) = 4MHz

দ্রুত পিডব্লিউএম মোড আপনাকে পিনটি এখানে টগল করতে দেবে:

f_OCnxPWM = f_clk_IO / (এন * [1 + শীর্ষ]) = 16e6 / (1 * [1 + 1]) = 8MHz

সুতরাং আমি এখনও মনে করি আপনি দ্রুত পিডব্লিউএম মোড চান। 50% শুল্ক চক্রের জন্য OCR0A = OCR0B = 0x80 সহ বিশেষত মোড 3। ওসি 0 এ এবং ওসি 0 বি একে অপরের বিপরীতে দুটি তরঙ্গরূপ তৈরি করতে COM0A বিট 0x3 এবং COM0B বিট 0x2 তে সেট করুন।

আপডেট # 2 আরও মেগা 328 এই আরডুইনো কোডটি ব্যবহার করে দেখুন:

#define tick 9
#define tock 10

void setup(){

  pinMode(tick, OUTPUT);  
  pinMode(tock, OUTPUT); 

  // Setup Waveform Generation Mode 15
  // OC1A Compare Output Mode = inverting mode
  // OC1B Compare Output Mode = non-inverting mode
  // Timer Prescaler = 1
  // TOP = OCR1A = 1

  //COM1A[1:0] = 0b11, COM1B[1:0] = 0b10, WGM1[1:0] = 0b11
  TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(COM1B1) | _BV(WGM11) | _BV(WGM10);

  //WGM1[3:2] = 0b11, CS1[2:0] = 0b001
  TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10);

  OCR1A = 0x0001;
  OCR1B = 0x0001;
}

void loop(){

}

আমাকে এটি কিছুটা চিবিয়ে দাও এবং এটি কাজ করে কিনা তা দেখুন। ধন্যবাদ.
উত্তেজনাপূর্ণ

আপনার উত্তরটি আজই চেষ্টা করে দেখার জন্য, আমি কয়েকটা অবৈধ অনুমান দেখছি: আমি 20 মেগাহার্টজ ঘড়ি নির্দিষ্ট করেছি (এবং এখন আমি 16 মেগাহার্জ প্রতিস্থাপন করেছি ), না "(8 মেগাহার্টজ এটি আপনার জন্য মনে হয়)" । এছাড়াও আমি উল্লেখ করেছি যে আমার পিডাব্লুএম ডাল প্রস্থের প্রকরণের প্রয়োজন নেই, তাই আপনি কোথায় সুরঙ্গিত করেছেন তা নিশ্চিত নন "আপনি যদি ডিউটি ​​চক্রটি পরিবর্তিত করতে চান এবং এটি আপনার মত হয়" বলে মনে হচ্ছে
উত্তেজনাপূর্ণ প্রকল্পগুলি

@ এক্সসিটিংপ্রজেক্টস আমি আপনার বক্তব্যটি বন্ধ করে দিচ্ছিলাম "এটিটিআই 85 পিসিবিতে আমার কাছে একটি 8 মেগাহার্টজ স্ফটিক রয়েছে এবং এটি নির্ভরযোগ্যভাবেও কাজ করছে।" এবং আমার উত্তর এটিটিনি 85 এর সাথে সম্পর্কিত। আমি আপনার আপডেট হওয়া প্রশ্নটি করব এবং প্রতিক্রিয়াতে আমার উত্তরটি আপডেট করব।
ভিস্যাটাকু

@ উইকেতু আপনাকে ধন্যবাদ আমি প্রশ্নটি আপডেট করেছি, উল্টা মোড হিসাবে দেখে মনে হচ্ছে যে আমি কিছু পদক্ষেপ মিস না করে সিটিসি মোডে কোনও প্রভাব ফেলবে না।
উত্তেজনাপূর্ণ

এটিএমগা 328 ডাটাশিট থেকে এক্সেক্সটিং প্রজেক্টগুলি: "নন-পিডব্লিউএম মোডের জন্য COM0x1: 0 বিট নিয়ন্ত্রণ করে যে আউটপুট সেট করা উচিত, সাফ করা উচিত বা তুলনামূলক ম্যাচে টগল করা উচিত"
ভিস্যাটাকু

1

এটিটিনিএক্স 5 পরিবারের ভিতরে পিএলএল রয়েছে, এটি বড় ছেলেটি ব্যবহার করুন।

আমি সিপিইউ ঘড়িকেও পাওয়ার করতে অভ্যন্তরীণ পিএলএল ব্যবহার করি এবং এক্সটিএল ছাড়াই 16 মেগাহার্টজ রাখি। আপনার কাছে মাত্র 5 পিন রয়েছে বলে এটি মূল্যবান। (আমি রিসেট পিন গণনা করি না)। এছাড়াও একটি পিএলএলড পিডব্লিউএম (ওসিআর 1 বি) এটি XTAL পিনগুলিতে optionচ্ছিক প্রশংসাসূচক আউটপুট নিয়ে চলে। আপনাকে কেবল 16 মেগাহার্জ এক্সটাললেস এটিটিনির জন্য ফিউজগুলি সামঞ্জস্য করতে হবে ... বা কেবল 8 মেগাহার্জে সিপিইউ চালাতে দেওয়া হোক তবে ফিউজ পরিবর্তন না করে 64৪ মেগাহার্টজ ঘড়ি দিয়ে পিডব্লুএম চালান ..

আপনার কাছে 64 মেগাহার্টজ ক্লক পিডাব্লুএমএম (তবে 1 বিট রেজোলিউশন) থাকতে পারে। অথবা ১২ বিট রেজোলিউশন @ ১২০০ কেজি হার্জড। হ্রাসকারী ওসিআর 1 সি রেজিস্ট্রারের মাধ্যমে আপনি পিডব্লিউএম রেজোলিউশন এবং গতি বাড়িয়ে তুলতে পারেন।

1 মেগাহার্টজের জন্য আপনাকে ওসিআর 1 সি 63 এ সেট করতে হবে। 2 মেগাহার্টজের জন্য আপনাকে ওসিআর 1 সি 31 থেকে 31 স্থাপন করতে হবে। 4 মেগাহার্টজের জন্য আপনাকে ওসিআর 1 সি 15 করতে হবে ...

এই কোড দিয়ে কেবল PLL সক্ষম করুন:

PLLCSR |= (1 << PLLE);           //Start PLL
while( !(PLLCSR & (1<<PLOCK)) ); //Wait for PLL lock
//PLLCSR |= (1<<LSM );           //Low Speed PLL that clocks 32Mhz, not 64Mhz
PLLCSR |= (1 << PCKE);           //Enable PLL

এখন আপনার কাছে "ওসিআর 1 বি 0 / ওসিআর 1 এ0" পিডব্লিউএম-তে 64 মেগাহার্জ ঘড়ি রয়েছে।

এছাড়াও, আপনি মিররযুক্ত আউটপুটটির জন্য ওসিআর 1 [এ / বি] 0 এবং এক্সওসিআর 1 [এ / বি] 0 সামঞ্জস্য করতে পারেন।

if(0){ //Synch mode
     //OCR1A & XOCR1A enable for Synch operation but not allow odd PWM values!
     TCCR1 |= (1 << PWM1A) | (0 << COM1A1) | (1 << COM1A0); 
     //Also ATtinyX5 has "Dead Time Generator", use it ;)
     DTPS1 = 3;   //8x Prescaler for dead time generator (maximum)
     DT1A = 0xff; //Clk dead on both channels (maximum)
     }
   else
     TCCR1 |= (1 << PWM1A) | (1 << COM1A1) | (0 << COM1A0);  //ONLY OCR1A enabled

আপনার জানা দরকার, ডেড টাইম জেনারেটর যদি আপনি ওসিআর 1 এ = 1 সেট করেন তবে পিডব্লিউএম আউটআউট খাবে। আপনার সময়সীমার চেয়ে বেশি মূল্যবান দরকার।

শুভেচ্ছা সহ,

Erdem

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