Strommessung PWM Strategie

OP #7367084
Lesenswert?

Guten Tag, ich versuche gerade eine stabile Strommessung eines PWM Signals zu programmieren. Das PWM hat eine Frequenz von 100Hz. ich verwende den STM32F103 als Mikrocontroller. Gibt es eine Möglichkeit den ADC so zu konfigurieren das ich meine Messungen genau zwischen der Periode des PWM messe? Oder wie geht man an so eine Messung richtig ran? Danke für die Hilfe.

#7367086
Lesenswert?

Gibt es eine Möglichkeit den ADC so zu konfigurieren das ich meine Messungen genau zwischen der Periode des PWM messe?

Wenn es das ist was du messen willst dann kannst du das selbstverstaendlich so machen. Du laesst dir halt vom Timer deiner PWM irgendwie geschickt einen IRQ erzeugen und syncronisierst deinen ADC damit.

Oder wie geht man an so eine Messung richtig ran?

Du koenntest damit anfangen das du dein Problem richtig schilderst.

Ueblicherweise verwendet man PWM als eine Art Schaltnetzteil, es soll also eine mittlere Gleichspannung/strom erzeugt werden und eigentlich wuerde man die dann messen wollen, also nach einem Filter.

Aber was wissen wir schon was du willst?

Vanye

Moderator (Firma: Titel) Persönliche Seite #7367095
Lesenswert?

Mein_erstes_Mal schrieb:

Das PWM hat eine Frequenz von 100Hz.

Wofür brauchst du so eine niedrige Frequenz?

genau zwischen der Periode des PWM messe?

Es gibt bei einer PWM kein "dazwischen". Denn was, wenn das PWM Tastverhältnis 0 ist oder 100%? Also musst du erst mal definieren, wo der Zeitpunkt sein soll: gleich nach der steigenden oder nach der fallenden Flanke? Hat die Last induktive Anteile?

#7367140
Lesenswert?

Du musst deinen Timer so konfigurieren, dass er hoch- und runterzählt (Center-Aligned). Dann kannst du noch konfigurieren, ober er im oberen oder unteren Wendepunkt den ADC triggert (Repetition Counter), oder beides. Dann hast du den ADC immer an der selben PWM-Stelle synchron- so habe ich das auf nem STM32F0 gemacht:

1
void Init_PWM ( void )
2
{
3
  GPIO_InitTypeDef GPIO_InitStructure_A;
4
  GPIO_StructInit(&GPIO_InitStructure_A);
5

6
  // IOs als Ausgang initialisieren (PortA und PortB)
7
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
8

9
  GPIO_InitStructure_A.GPIO_Mode = GPIO_Mode_AF;
10
  GPIO_InitStructure_A.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8;
11
  GPIO_InitStructure_A.GPIO_OType = GPIO_OType_PP;
12
  GPIO_InitStructure_A.GPIO_PuPd =  GPIO_PuPd_DOWN;
13
  GPIO_InitStructure_A.GPIO_Speed = GPIO_Speed_Level_3;
14
  GPIO_Init(GPIOA, &GPIO_InitStructure_A);
15

16
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_2);
17
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);
18

19
  /////////////////////////////////////////////////////////
20
  /////////////////////////////////////////////////////////
21
  // Timer
22
  TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
23
  TIM_TimeBaseStructInit(&TIM_TimeBase_InitStructure);
24
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
25

26
  TIM_TimeBase_InitStructure.TIM_Prescaler = 0;
27
  TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
28
  TIM_TimeBase_InitStructure.TIM_Period = PWM_PERIOD;
29
  TIM_TimeBase_InitStructure.TIM_ClockDivision = 0;
30
  TIM_TimeBase_InitStructure.TIM_RepetitionCounter = 3;
31
  TIM_TimeBaseInit(TIM1, &TIM_TimeBase_InitStructure);
32

33
  TIM_UpdateRequestConfig(TIM1, TIM_UpdateSource_Global);
34
  TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
35
  TIM_UpdateDisableConfig(TIM1,DISABLE);
36

37
  /////////////////////////////////////////////////////////
38
  /////////////////////////////////////////////////////////
39
  // Dead-Time (not nessesary)
40
  TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
41
  TIM_BDTRStructInit(&TIM_BDTRInitStructure);
42
  /* Automatic Output enable, Break, dead time and lock configuration*/
43
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
44
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
45
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
46
  TIM_BDTRInitStructure.TIM_DeadTime = DEADTIME_750NS;
47
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
48
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
49
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
50
  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
51

52
  /////////////////////////////////////////////////////////
53
  /////////////////////////////////////////////////////////
54
  // PWM
55
  TIM_OCInitTypeDef TIM_OCInitStructure;
56
  TIM_OCStructInit(&TIM_OCInitStructure);
57
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
58
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
59
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
60
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
61
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
62
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
63
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
64
  TIM_OCInitStructure.TIM_Pulse = PWM_PERIOD/2;
65

66
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
67
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
68

69
  TIM_ARRPreloadConfig(TIM1, ENABLE);
70

71
//  DISABLE_PWM();
72
//  ENABLE_PWM();
73
//  ENABLE_SYNCHRONOUS_MODE();
74

75
  /* Enable Timer */
76
  TIM_Cmd( TIM1, ENABLE );
77
}
78

79

80
void Init_ADC ( void )
81
{
82
  /* Set clock */
83
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
84
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
85
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
86
  RCC_ADCCLKConfig(RCC_ADCCLK_HSI14);
87

88
  GPIO_InitTypeDef GPIO_InitStructure;
89
  GPIO_StructInit(&GPIO_InitStructure);
90

91
  ADC_InitTypeDef ADC_InitStructure;
92
  ADC_StructInit(&ADC_InitStructure);
93

94
  DMA_InitTypeDef DMA_InitStructure;
95
  DMA_StructInit(&DMA_InitStructure);
96

97
  TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
98
  TIM_TimeBaseStructInit (&TIM_TimeBase_InitStructure);
99

100
  NVIC_InitTypeDef NVIC_InitStructure;
101
  NVIC_Init(&NVIC_InitStructure);
102

103

104
  /* ADC Kanäle */
105
  /* IO initialisieren */
106
  GPIO_StructInit(&GPIO_InitStructure);
107
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
108
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
109
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
110
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
111
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
112
  GPIO_Init(GPIOA, &GPIO_InitStructure);
113

114
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
115
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
116
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
117
  NVIC_Init(&NVIC_InitStructure);
118

119
  /* DMA Controll */
120
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
121
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DataBuffer;
122
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
123
  DMA_InitStructure.DMA_BufferSize = NR_OF_MIDDLE * VALUES_TO_SAMPLE;
124
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
125
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
126
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
127
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
128
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
129
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
130
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
131
  DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE );
132

133
  /* ADC */
134
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
135
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
136
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
137
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO;
138
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
139
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
140
  ADC_Init(ADC1, &ADC_InitStructure);
141

142
  ADC_ChannelConfig(ADC1,ADC_Channel_1,ADC_SampleTime_1_5Cycles);
143
  ADC_ChannelConfig(ADC1,ADC_Channel_2,ADC_SampleTime_1_5Cycles);
144
  ADC_ChannelConfig(ADC1,ADC_Channel_3,ADC_SampleTime_1_5Cycles);
145
  ADC_ChannelConfig(ADC1,ADC_Channel_4,ADC_SampleTime_1_5Cycles);
146
  ADC_ChannelConfig(ADC1,ADC_Channel_5,ADC_SampleTime_1_5Cycles);
147

148
  ADC_GetCalibrationFactor(ADC1);
149

150
  DMA_Cmd(DMA1_Channel1, ENABLE);
151
  ADC_Cmd(ADC1, ENABLE);
152
  ADC_DMACmd(ADC1, ENABLE);
153
  ADC_DMARequestModeConfig(ADC1,ADC_DMAMode_Circular);
154
  while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADEN) == RESET);
155
  ADC_StartOfConversion(ADC1);
156
}

Das Überflüssige musst du halt raus schmeissen.

#7367148
Lesenswert?

Mein_erstes_Mal schrieb:

ich versuche gerade eine stabile Strommessung eines PWM Signals zu programmieren.

Was nennst du "stabil"? Ist denn der Strom stabil?

Das PWM hat eine Frequenz von 100Hz. ich verwende den STM32F103 als Mikrocontroller.

Also ist die PWM langsam und der µC tendentiell eher schnell.

Gibt es eine Möglichkeit den ADC so zu konfigurieren das ich meine Messungen genau zwischen der Periode des PWM messe?

Die Periodendauer ist der Zeitraum in dem sich ein (periodisches, natürlich) Signal wiederholt. Da gibt es kein "dazwischen".

Ich nehme an, dir geht es um die Messung des Stromes, wenn deine PWM "angeschaltet" ist. Das geht wenn die PWM mindestens so lange angeschaltet ist, wie die S&H Stufe des ADC braucht um die Eingangsspannung zu erfassen. Und natürlich muß der Strom schon stabil sein, die Last muß also ohmsch und nicht etwa kapazitiv oder induktiv sein.

Dann konfigurierst du dir einen Interrupt auf den Start des PWM-Signals und startest den ADC in der ISR. Eventuell kann man den ADC auch direkt mit dem Timer verheiraten, schau halt selber ins Datenblatt. Und wenn du nach dem aktivieren des PWM-Signals noch eine gewisse Zeit abwarten willst, bevor du die Messung startest, nimmst du halt einen zweiten Compare-Zeitpunkt dafür. Den mußt du natürlich anpassen, wenn du die PWM änderst.

#7367154
Lesenswert?

Axel S. schrieb:

Da gibt es kein "dazwischen".

Doch, natürlich

Dann konfigurierst du dir einen Interrupt auf den Start des PWM-Signals und startest den ADC in der ISR. Eventuell kann man den ADC auch direkt mit dem Timer verheiraten, schau halt selber ins Datenblatt. Und wenn du nach dem aktivieren des PWM-Signals noch eine gewisse Zeit abwarten willst, bevor du die Messung startest, nimmst du halt einen zweiten Compare-Zeitpunkt dafür. Den mußt du natürlich anpassen, wenn du die PWM änderst.

Wie es geht habe ich oben bereits erwähnt, deine Darstellung hier ist eher unbrauchbar

OP #7367257
Lesenswert?

Hallo und danke für die Antworten. Vanye R. schrieb im Beitrag #7367086:

Wenn es das ist was du messen willst dann kannst du das selbstverstaendlich so machen. Du laesst dir halt vom Timer deiner PWM irgendwie geschickt einen IRQ erzeugen und syncronisierst deinen ADC damit.

Ja genau ich möchte Synchron zur Periode des PWM Messen.

Lothar M. schrieb:

Wofür brauchst du so eine niedrige Frequenz?

Der Strom fließt durch eine Ventilspule und diese Spule möchte 100Hz.

Lothar M. schrieb:

Es gibt bei einer PWM kein "dazwischen". Denn was, wenn das PWM Tastverhältnis 0 ist oder 100%? Also musst du erst mal definieren, wo der Zeitpunkt sein soll: gleich nach der steigenden oder nach der fallenden Flanke? Hat die Last induktive Anteile?

Ich füge ein Bild ein. Hoffe das macht mein Vorhaben klarer.

Ingo L. schrieb:

Du musst deinen Timer so konfigurieren, dass er hoch- und runterzählt (Center-Aligned). Dann kannst du noch konfigurieren, ober er im oberen oder unteren Wendepunkt den ADC triggert (Repetition Counter), oder beides. Dann hast du den ADC immer an der selben PWM-Stelle synchron- so habe ich das auf nem STM32F0 gemacht:

Danke für deinen Code. Werde ich mir ansehen.

Axel S. schrieb:

Also ist die PWM langsam und der µC tendentiell eher schnell.

Genau😊

Ich stelle mir das so vor das mein ADC so die Periode dauert in die DMA Messungen Schaufelt. Wenn das dann erledigt ist könte ich über diese Daten einen Mittelwert bilden. Ist das denkbar?

Angehängte Dateien:
#7367284
Lesenswert?

Brüno schrieb:

Axel S. schrieb:

Was nennst du "stabil"? Ist denn der Strom stabil?

Du hast das Problem offensichtlich nicht verstanden.

Nein. Du hast meine Antwort nicht verstanden.

Ein tiefpassgefiltertes PWM-Signal ist niemals stabil sondern schwankt periodisch mit der PWM-Frequenz.

<Loriot> Ach! </Loriot>

Ich habe nirgends auch nur ein Wort von Tiefpaßfilterung und asynchroner Abtastung geschrieben. Im Gegenteil.

Aber wenn die Last (zumindest teilweise) induktiv ist, dann steigt der Strom in der aktiven Phase der PWM (vulgo: Einschaltzeit) mehr oder weniger langsam an. Er ist also nicht stabil. Es ist noch nicht mal klar, ob er einen stabilen Wert erreicht oder nicht.

Mein_erstes_Mal schrieb:

Ich stelle mir das so vor das mein ADC so die Periode dauert in die DMA Messungen Schaufelt. Wenn das dann erledigt ist könte ich über diese Daten einen Mittelwert bilden. Ist das denkbar?

Denkbar ist vieles. Die Frage ist eher: was willst du überhaupt messen? Und wozu?

Wenn du den Strom kurz nach dem Einschalten mißt (und nur da), dann wirst du einen zu kleinen Wert erhalten. Bei einem induktiven Verbraucher wie einem Ventil ist es eher sinnvoll, den Strom kurz vor dem Ausschalten zu messen (also den Maximalwert). Aber es kommt halt darauf an, warum du das überhaupt messen willst.

Ein induktiver Verbraucher wird auch einen Freilauf-Strompfad brauchen (vulgo: eine Freilaufdiode). Wenn du den Strom über die ganze Periode samplen willst, mußt du den auch erfassen.

#7367298
Lesenswert?

Mein_erstes_Mal schrieb:

Der Strom fließt durch eine Ventilspule und diese Spule möchte 100Hz.

Vermutlich ist das ein Dosierventil, d.h. es geht im Takt der PWM auf und zu. Die PWM bestimmt dann die mittlere Durchflußmenge. Die Induktivität spielt kaum eine Rolle und es wirkt hauptsächlich der ohmsche Widerstand. Man könnte den Strom also einfach aus der Spannung berechnen. Der Ohmsche Widerstand bleibt ja konstant.

#7367312
Lesenswert?

Mein_erstes_Mal schrieb:

Ich stelle mir das so vor das mein ADC so die Periode dauert in die DMA Messungen Schaufelt. Wenn das dann erledigt ist könte ich über diese Daten einen Mittelwert bilden. Ist das denkbar?

Zeig doch mal zusätzlich zur PWM die Strommeßspannung. Und miß mal die Induktivität der Ventilspule. Denn je nach Verlauf des Stromanstiegs in der Induktivität würde man die Samplezeiten anders legen müssen ...

LG, Sebastian

OP #7367315
Lesenswert?

Sorry wenn ich mich nicht erkläre. Also ich habe Testweiße mein PWM mit einem Dutycyle von 50% laufen. Das Ventil nimmt am Anfang 600 mA auf nach 10 Minuten ist das Ventil warm und der Strom sinkt auf 560 mA Wenn ich den Strom mit dem Mikrocontroller messe dann messe ich den Strom zwar. Jedoch habe ich eine Schwankung von +-6 bis8 mA.

Peter D. schrieb:

Vermutlich ist das ein Dosierventil, d.h. es geht im Takt der PWM auf und zu. Die PWM bestimmt dann die mittlere Durchflußmenge. Die Induktivität spielt kaum eine Rolle und es wirkt hauptsächlich der ohmsche Widerstand. Man könnte den Strom also einfach aus der Spannung berechnen. Der Ohmsche Widerstand bleibt ja konstant.

Ja es ist so ein Ventil. Aber der Strom ändert sich mit der Temperatur der Spule.

Danke für die Hilfe

#7367322
Lesenswert?

Mein_erstes_Mal schrieb:

Aber der Strom ändert sich mit der Temperatur der Spule.

Das muß nicht unbedingt an der Temperatur der Spule liegen. Die Bewegung des Ventilstößels im Magnetfeld der Spule arbeitet gegen den fließenden Strom, und wenn das Ventil warm ist kann es sein, dass sich diese mechanische Bewegung etwas anders verhält als bei kaltem Ventil. Gerade wenn der Stößel sich 100 Mal pro Sekunde zweimal bewegt ...

LG, Sebastian

#7367373
Lesenswert?

Axel S. schrieb:

Ich habe nirgends auch nur ein Wort von Tiefpaßfilterung und asynchroner Abtastung geschrieben. Im Gegenteil.

Aber wenn die Last (zumindest teilweise) induktiv ist, dann steigt der Strom in der aktiven Phase der PWM (vulgo: Einschaltzeit) mehr oder weniger langsam an. Er ist also nicht stabil.

Ein Widerspruch in sich, denn eine induktive Last ist ein Tiefpass.

Außerdem ist es völlig irrelevant wie viele Worte du von was geschrieben hast, denn ich wieß ja schon darauf hin dass du das Problem nicht verstanden hast. Der TE möchte nämlich synchron abtasten.

OP #7367484
Lesenswert?

Ingo L. schrieb:

Mein_erstes_Mal schrieb:

Das Ventil nimmt am Anfang 600 mA auf nach 10 Minuten ist das Ventil warm und der Strom sinkt auf 560 mA Wenn ich den Strom mit dem Mikrocontroller messe dann messe ich den Strom zwar. Jedoch habe ich eine Schwankung von +-6 bis8 mA.

Willst du uns verarschen?

Natürlich will ich Euch nicht verarschen.

Ingo L. schrieb:

Ja und seine Messschwankungen betragen 1,4%. Das bekommt man mit der besten PWM-Synchronisierung nicht weg.

Echt komme ich da nicht genauer hin? Wie macht mein FLuke die Strommessung?

Brüno schrieb:

Außerdem ist es völlig irrelevant wie viele Worte du von was geschrieben hast, denn ich wieß ja schon darauf hin dass du das Problem nicht verstanden hast. Der TE möchte nämlich synchron abtasten.

Ja ich möchte Syncron über die PEriode Messen. Außer es gibt eine Bessere Möglichkeit ?

Danke für die Hilfe

#7367527
Lesenswert?

Mein_erstes_Mal schrieb:

Ich brauche aber eine genaue Messung auf dem MC.

Dann versuch' zuerst herauszufinden, was dein Fluke da genau misst. Ist es ein Durchschnittswert, RMS, oder einfach ein Wert zu einem Zufallszeitpunkt... Und über welches Zeitintervall mittelt dein Fluke, ist es der Durchschnittswert der letzten Sekunde, 10 Sekunden, ...

Wenn du die Info hast, kannst du dir eine Auswerte-Schaltung/Logik entwerfen, die dasselbe Resultat bringt.

Vermutlich reicht ein schnöder Tiefpass hinter dem Shunt.

OP #7367538
Lesenswert?

Sebastian W. schrieb:

Mein_erstes_Mal schrieb:

Ich brauche aber eine genaue Messung auf dem MC

Willst du messen um zu regeln?

LG, Sebastian

JA genau das möchte ich. Wenn meine Messung aber um einige mA springt brauche ich nicht anfangen zu regeln. Was ich mich frage wie das RMS des Multimeters arbeitet und ob ich es nachbilden kann. Im Moment habe ich mit dem DMA 256 Werte gemittelt. 8 Dieser Ergebnise habe ich dann mit einen Quatratischen Mittelwert nochmal gemittelt.

Das Ergebnis ist aber noch zu wackelig.

Εrnst B. schrieb:

Vermutlich reicht ein schnöder Tiefpass hinter dem Shunt.

Kann man diesen Tiefpass auch programmieren?

Danke für die Hilf. Und nein ich will nur lernen und nicht jemanden Verarschen.

#7367566
Lesenswert?

Mein_erstes_Mal schrieb:

Kann man diesen Tiefpass auch programmieren?

ja. Du hast alle Zeit der Welt:

Mein_erstes_Mal schrieb:

nach 10 Minuten ist das Ventil warm

d.H. es reicht vermutlich wenn du den ADC durchlaufen lässt, und dir für deine Regelung z.B. den Mittelwert über die Messungen letzten 60 Sekunden anschaust.

Da brauchst du auch keinen Kilobyte-großen Ringbuffer, einfach ADC-Werte Aufsummieren und mitzählen, einmal Pro Minute Summe/Anzahl für deine Regelung berechnen, Variablen zurücksetzen.

#7368051
Lesenswert?

Mein_erstes_Mal schrieb:

JA genau das möchte ich. Wenn meine Messung aber um einige mA springt brauche ich nicht anfangen zu regeln. Was ich mich frage wie das RMS des Multimeters arbeitet und ob ich es nachbilden kann. Im Moment habe ich mit dem DMA 256 Werte gemittelt. 8 Dieser Ergebnise habe ich dann mit einen Quatratischen Mittelwert nochmal gemittelt.

Das Ergebnis ist aber noch zu wackelig.

Wenn sich deine Meßfrequenz langsam der PWM-Frequenz annähert, dann entsteht eine niederfrequente Schwebung (da du mit dem Meßvorgang langsam auf deiner sich ändernden Meßkurve wanderst).

Idealerweise sollte die Meßfrequenz ein präzises Vielfaches der PWM-Frequenz sein. Die Werte über genau eine Periode können dann gemittelt werden und der sich ergebende Wert sollte deutlich stabiler sein.

Alternativ (ohne Synchronisation) eine hohe Meßrate in ein simples Filter geschoben (alter_wert = 99%*alter_wert + 1%*neuer_wert) Je kleiner der Neuanteil, desto langsamer die Näherung an den Echtwert

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren