हम MC68HC908GP32 माइक्रोकंट्रोलर का उपयोग करके ठीक से साइन सिग्नल उत्पन्न करने में असमर्थ हैं । PWM विवरण पृष्ठ 349 में शुरू होता है। घड़ी की आवृत्ति 2.4MHz है, जबकि हमने 7 kHz PWM का उपयोग प्रीस्कूलर का उपयोग करके और टाइमर मोड्यूलो को 350 के रूप में निम्न प्रकार से किया है:
T1SC = 0x60; // Prescaler: Div entre 64
//Counter modulo = 0x015E = 350
T1MODH = 0x01; // High
T1MODL = 0x5E; // Low
PWM आउटपुट को निम्नलिखित RLC फ़िल्टर द्वारा फ़िल्टर किया जाता है, और फिर DC को एक श्रृंखला 1uF कैप का उपयोग करके हटा दिया जाता है। कटऑफ की आवृत्ति PWM के 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};
निम्नलिखित पल्स की चौड़ाई प्रत्येक PWM चक्र की गणना की जाती है:
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 आउटपुट (अप) वास्तव में कैसे गलत है।
इसलिए, थोड़ी देर के लिए गड़बड़ करने और इसे से छुटकारा पाने में असमर्थ होने के बाद, हमने प्रत्येक नमूने के लिए हार्ड कोडिंग के बजाय MCU में साइन सिग्नल की गणना करने की कोशिश की है। हमने सभी काउंटर सेटअप से पहले मुख्य फ़ंक्शन में निम्नलिखित कोड जोड़ा है:
for(i=0;i<99;i++) {
temp=100*(sin(2*3.14159*i/100)+1);
seno[i]=(int)temp;
}
लेकिन परिणाम भी एक sinusoid की तरह नहीं लगते हैं:
इसके साथ घंटों संघर्ष करने के बाद, हम अपनी गलती का पता नहीं लगा पाए हैं। हम सलाह के एक टुकड़े की सराहना करेंगे।