পিডাব্লুএম ব্যবহার করে সাইন সিগন্যাল জেনারেশন


16

আমরা MC68HC908GP32 মাইক্রোকন্ট্রোলার ব্যবহার করে সঠিকভাবে একটি সিন সিগন্যাল তৈরি করতে অক্ষম । পিডব্লিউএম বর্ণনা 349 পৃষ্ঠায় শুরু হয় Cl ঘড়ির ফ্রিকোয়েন্সি 2.4 মেগাহার্টজ, আমরা প্রেসক্যালার ব্যবহার করে এবং টাইমার মডিউলগুলি 350 হিসাবে সেট করে নীচে 7 KHz পিডব্লুএম ব্যবহার করেছি:

T1SC = 0x60;    // Prescaler: Div entre 64
//Counter modulo = 0x015E = 350
T1MODH = 0x01;   // High
T1MODL = 0x5E;   // Low

PWM আউটপুটটি নিম্নলিখিত আরএলসি ফিল্টার দ্বারা ফিল্টার হয় এবং তারপরে ডিসি 1uF ক্যাপ সিরিজ ব্যবহার করে সরানো হয়। কাটফফ ফ্রিকোয়েন্সি পিডব্লিউএম এর 7kHz এর নীচে।

এখানে চিত্র বর্ণনা লিখুন

প্রথমত, আমরা একটি LUT ব্যবহার করার চেষ্টা করেছি, যা এই সাইট ব্যবহার করে নমুনা তৈরি করা হয়েছিল (100 নমুনা, প্রশস্ততা = 250)। এটি একটি একক সময়কাল নিয়ে গঠিত।

 int seno[100]={ 125, 133, 141, 148, 156, 164, 171, 178, 185, 192, 198, 205, 211, 216, 221, 226, 231, 235, 238, 241, 244, 246, 248, 249, 250, 250, 250, 249, 248, 246, 244, 241, 238, 235, 231, 226, 221, 216, 211, 205, 198, 192, 185, 178, 171, 164, 156, 148, 141, 133, 125, 117, 109, 102, 94, 86, 79, 72, 65, 58, 52, 45, 39, 34, 29, 24, 19, 15, 12, 9, 6, 4, 2, 1, 0, 0, 0, 1, 2, 4, 6, 9, 12, 15, 19, 24, 29, 34, 39, 45, 52, 58, 65, 72, 79, 86, 94, 102, 109, 117}; 

নিম্নলিখিত ডালটির প্রস্থ প্রতিটি পিডব্লিউএম চক্র গণনা করা হয়:

interrupt 4 void rsi_t1ch0 (void)
{
    //-- disable interruption flag
    T1SC0&=(~0x80);
    //-- pwm to '0' 
    PTB&=0xFD;

    //some sensor measures are done here.... 100 out of the 350 cycles are left for this                
}
/************************************************************/
/* TIM1 overflow rutine                                     */
/************************************************************/
interrupt 6 void rsi_ov1 (void)
{

    T1SC&=(~0x80);
    //-- set PWM to 1
    PTB|=0x02;
    T1CH0H = ((seno[fase])>>8);   // high bits
    T1CH0L = (seno[fase])&0xFF;   // low bits
    fase+=1;
    if (fase >= 99)
      fase=0;
}

void main(void)
{
float temp;
    int i;

    CONFIG1|=0x01;  
    DDRB=0xFF;      //-- Port B is set as output
    PTB=0x00;       
    //Timer setup
    T1SC = 0x60;    // Prescaler: Div by 64  
    T1MODH = 0x01;   //Counter modulo
    T1MODL = 0x5E;  
    T1SC0 = 0x50;  //Comparator setup
    //-- Initial width
    T1CH0H = 0x00;
    T1CH0L = 0x53;

    EnableInterrupts;
    T1SC&=~(0x20); //Run timer forever
    for(;;);   
}

এটিকে সুযোগে প্লাগইন করার সময় আমরা নিম্নলিখিত সংকেতটি পাই। আমরা সর্বনিম্ন কাছাকাছি যে অদ্ভুত শিখর এড়াতে অক্ষম।

এখানে চিত্র বর্ণনা লিখুন

এই শিখরের চারদিকে জুম করার সময়, আমরা দেখতে পাচ্ছি যে কীভাবে PWM আউটপুট (আপ) আসলে ভুল fact

এখানে চিত্র বর্ণনা লিখুন

সুতরাং, কিছুক্ষণ ঘোরাঘুরি করার পরে এবং এ থেকে মুক্তি পেতে অক্ষম হওয়ার পরে, আমরা প্রতিটি স্যাম্পলটির জন্য মানকে কোডিংয়ের পরিবর্তে এমসিইউতে সাইন সিগন্যাল গণনা করার চেষ্টা করেছি। সমস্ত কাউন্টার সেটআপের ঠিক আগে আমরা মূল কার্যক্রমে নিম্নলিখিত কোডটি যুক্ত করেছি:

 for(i=0;i<99;i++) {
     temp=100*(sin(2*3.14159*i/100)+1);
     seno[i]=(int)temp;
 }

তবে ফলাফলগুলি সাইনোসয়েডের মতো দেখাচ্ছে না:

এখানে চিত্র বর্ণনা লিখুন

ঘন্টাখানেক লড়াই করার পরেও আমরা আমাদের ভুলটি খুঁজে পাইনি। আমরা এক পরামর্শের প্রশংসা করব would


আপনি কি পিডাব্লুএম মানগুলির পুরো তালিকা পোস্ট করতে পারেন?
pjc50

@ pjc50 এটি এখানে: পেস্টবিন . com/ এসএনইএএইচ এইচকি । আপনাকে অনেক ধন্যবাদ.
সার্জ

মাঝখানে সমস্ত "0" মানকে "1" দিয়ে প্রতিস্থাপনের চেষ্টা করুন; আমি সন্দেহ করি যে 0 আপনাকে চাইলে কম সংকেত না দিয়ে প্রশস্ত উচ্চতর সংকেত দেয়।
pjc50

@ সার্জ - দয়া করে ডেটা ইনলাইন করুন। পেস্টটি চলে যেতে পারে এবং প্রশ্নের একটি অংশ ছেড়ে দেওয়া খারাপ। তবে দয়া করে এটি বিন্যাস করুন যাতে এটি এত বেশি জায়গা ব্যবহার করে না। ধন্যবাদ।
ট্রাইগভে লগস্টেল

এটি পরিষ্কারভাবে ফিল্টার নয় - শুভকামনা - দেখায় আপনার টেবিলটি দুর্নীতিগ্রস্থ হচ্ছে বা আপনি এতে আপনার পয়েন্টারটি হারাচ্ছেন।
অ্যান্ডি ওরফে

উত্তর:


16

মাইক্রোকন্ট্রোলার ডেটাশিটের 350 পৃষ্ঠার নীচে, উল্লেখ করা হয়েছে যে ওভারফ্লো বিঘ্নের সময় টাইমার মান রেজিস্টারে একটি ছোট মান লেখার ফলে পরবর্তী বাধা কেবল পরবর্তী পিডব্লিউএম পুনরাবৃত্তিতেই ট্রিগার হতে পারে, যেহেতু টাইমার গণনা অব্যাহত থাকে বিঘ্নিত রুটিন কার্যকর করা হচ্ছে।

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

এটি নিশ্চিত হয়ে গেছে যে পিডব্লিউএম মানটি পুরো এক পিডব্লিউএম ঘড়ির সময়কালের জন্য বেশি ধরে থাকে + টাইমার দৈর্ঘ্যের (পার্শ্ববর্তী দৈর্ঘ্যের উপর ভিত্তি করে) দেখতে কেমন লাগে। টাইমার দৈর্ঘ্যের রেজিস্টারে লিখিত মানটি ত্রুটির সময় সম্ভবত 0 এর কাছাকাছি, সুতরাং এটি বেশ কার্যকর যে কাউন্টারের বিঘ্নের সময় ছোট মানটি চলে গেছে, এবং কেবল নিম্নলিখিত চক্রটিতে ট্রিগার করবে।

সাইনোসয়েড ন্যূনতম স্তরকে আইএসআর কার্যকর করতে যে সময় লাগে তার চেয়ে বেশি স্তরে বা নতুন স্তরটি নির্ধারিত পদ্ধতিটি পরিবর্তন করে এটি ঠিক করা যেতে পারে। পৃষ্ঠার শীর্ষে 351 কীভাবে এটি করা যেতে পারে তার বিশদ।


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