আমরা 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