Re: Funktion : Timer_T1GetPM Kategorie: Programmierung C (von Peter S - 5.10.2005 22:41) | ||
Als Antwort auf Funktion : Timer_T1GetPM von Wojtek - 26.09.2005 21:39 | ||
| ||
Hallo, wir haben etwas Zeit gebraucht, aber wir haben herausgefunden, das bei kleinen Zeiträumen manchmal der Interpreter Interrupt zu langsam war. WIr haben in der neuen Softwareversion jetzt die Logik mit in den Atmel Interrupt Routine eingebaut. Zeiträume >=10 µs sollten jetzt ohne Probleme messbar sein. Gruss Peter > Hi ! > versuche mit SMT160-30 Temperatur zu messen. Daführ Test Programm: > > word PM_WERT; // globale Variablendeklaration > word PT_WERT; > char temp_txt[10]; > > //------------------------------------------------------------------------------ > // Messungen > // > void Timer1_ISR(void) > { > int irqcnt; > PM_WERT=Timer_T1GetPM(0); // Pulsweite messen > irqcnt=Irq_GetCount(INT_TIM1CAPT); // Interrupt Request Counter > } > > void Timer2_ISR(void) > { > int irqcnt; > PT_WERT=Timer_T1GetPM(1); // Periode messen > irqcnt=Irq_GetCount(INT_TIM1CAPT); // Interrupt Request Counter > } > //------------------------------------------------------------------------------ > // Hauptprogramm > // > void main(void) > { > byte n; > word i; > float temp; > > > > // Timer_T0PWM(32,PS_256); // Pulsgenerator > // Puls=4,34 µs*32= 139 µs > // Periode=4,34 µs*256= 1111 µs > while (1) > { > Irq_SetVect(INT_TIM1CAPT,Timer1_ISR); // Interrupt Service Routine def. > PM_WERT=0; > Timer_T1PM(PS_1); // Messung initialisieren und starten > while (PM_WERT==0); // Pulsbreite messen > > > > Irq_SetVect(INT_TIM1CAPT,Timer2_ISR); // Interrupt Service Routine def. > Timer_T1PM(PS_1); // Messung initialisieren und starten > PT_WERT=0; > while (PT_WERT==0); // Periode messen > > Msg_WriteHex(n); // Werte ausgeben > Msg_WriteChar(SPACE); > > Str_WriteWord(PM_WERT,10,temp_txt,0,8); > Msg_WriteText(temp_txt); > Msg_WriteChar(SPACE); > > Str_WriteWord(PT_WERT,10,temp_txt,0,8); > Msg_WriteText(temp_txt); > Msg_WriteChar(SPACE); > > temp = (PM_WERT * 1.0) / (PT_WERT * 1.0); > temp=(temp - 0.320)/0.00470; > Str_WriteFloat(temp,10,temp_txt,0); > Msg_WriteText(temp_txt); > Msg_WriteChar(CR); > > for (i=0;i<10000;i++); // Delay 500ms > n++; > } > } > > aber die Ergebnise kan ich mir kaum erkleren: > > 00D6 00006723 00004547 246.50152 ????? > 00D7 00002147 00004555 32.20216 OK > 00D8 00002165 00004559 32.95421 OK > 00D9 00002163 00004556 32.92734 OK > 00DA 00002161 00004555 32.85611 OK > 00DB 00006721 00004561 245.44259 ????? > 00DC 00002157 00004552 32.73567 OK > 00DD 00002154 00004554 32.55123 OK > > und ab etwa 40 Grad kommt nur : > > 00A8 00006655 00004449 250.17910 > 00AA 00006668 00004467 249.51586 > 00AC 00006583 00004430 248.08605 > 00AD 00006627 00004441 249.41094 > 00AE 00006633 00004395 253.02447 > ????????????????????????????????????????????????????? > | ||
Antwort schreiben Antworten: Re: Funktion : Timer_T1GetPM (von Wojtek - 11.10.2005 15:26) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum