Hi Leute,
hab da ein Problem mit meinem Effektivwert.
Ich möchte aus drei unterschiedlichen Quellen die Effektivwerte im
MSP430 ausrechnen, d.h. ich hab 3 ADC Werte.
Jetzt habe ich erstmal einen der 3 Realisiert: Er nimmt mit einem Timer
8192 Samples zum Quadrat Summiert diese teilt durch 8192 und zieht die
Wurzel. So sollte der diskrete Effektivwert ja aussehen.
nun zu meinem Problem:
ich hab ein 12 Bit-Wert, dieser wird Quadriert, damit habe ich 24 Bit.
Das ganze mal 8192 macht 37 Bit und von 37 Bit ne wurzel ziehen ist ja
schon Ordentlich, und dauert auch ziemlich lange. Zu lang sogar um genau
zu sein.
~3s Pro 8192.
Jetzt hab ich es mal mit Shiften von 37 auf 32 Bit versucht, also aus
64Bit eine 32Bit Variable gemacht.
1) Brachte es nicht die gewünschte Geschwindigkeitsverbesserung
2) kommt jetzt ein total falscher Wert raus.
kann ich mir irgendwie nicht erklären.
Bleiben 3 Fragen:
1) Ist Shiften hier Sinnvoll um schneller zu werden?
2) Wie kann ich genau den Fehler herausfinden denn ich dabei mache?
3) Gibt es noch andere Möglichkeiten die Berechnung zu beschleunigen?
[c]#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
if(i<8192){
temp=ADC12MEM0;
temp1=temp;
temp1*=temp1; // Quadrat
sum=sum+temp1; //Summe
j++;
}else{
temp2=sum>>5;
RMS=sqrt(sum/j);
INV=RMS*732.421875E-6;
//printf("RMS ist: %f",RMS);
sum=0;
i=0;
j=0;
}
ADC12CTL0 &= ~ENC; // Enable conversions
}[{c]