Hallo!
Ich benutze das Board STM32F407 und A/D-wandle mit 12-Bit eine
Potispannung. Aus dem A/D-Wert möchte ich einen Wertebereich von 0…20
realisieren. Dieser Wert soll dann binär auf 5 in Reihe gelöteten LEDs
ausgegeben werden und gleichzeitig zum Einstellen eines anderen
(Kraft-)Wertes dienen. Mein erster Ansatz war einfach den A/D-Wert durch
200 zu teilen: 0…4095 / 200 = 0…20. Diese Lösung hat sich aber schnell
als ungenügend bewiesen, da beispielsweise Werte zwischen 399…401 / 200
aufgrund des Rauschens vom A/D-Wandler ständig toggeln. Dann habe ich
den Ansatz über eine Mittelwertbildung probiert:
1 | uint16_t Calculate_Force(uint16_t adc_value)
|
2 | {
|
3 | static uint16_t calc_tmp=0, i=0;
|
4 | static uint16_t val_array[100];
|
5 | static uint32_t mean_value=0;
|
6 |
|
7 | if(i<=100)
|
8 | {
|
9 | val_array[i] = adc_value;
|
10 | i++;
|
11 |
|
12 | if(i>=100)
|
13 | {
|
14 | i = 0;
|
15 | while(i<=100)
|
16 | {
|
17 | mean_value += val_array[i];
|
18 | i++;
|
19 | }
|
20 | calc_tmp = mean_value/100;
|
21 | calc_tmp /= 200;
|
22 | i=0;
|
23 | mean_value=0;
|
24 | }
|
25 | }
|
26 | LED_ext_binary(calc_tmp);
|
27 | ClearFlag(&TimingFlags, SYSTICK_1000_HZ_PERIOD);
|
28 | return calc_tmp;
|
}
Das funktioniert zwar einigermaßen, hat das Problem aber noch nicht
final gelöst. Es gibt immer noch Potistellungen, wo die berechneten
Dezimalwerte toggeln. Hat evtl. jemand eine Idee bzw. kennt eine
Möglichkeit, wie man trotz des A/D-Rauschens klar definierte Zustände
erzeugen kann? Z.B. das Rauschen in derart „kompensieren“, dass ein
gewisser Wertebereich über- bzw. unterschritten werden muss, bevor eine
Dezimalstelle auf- bzw. abgezählt wird?
MfG
thelightener