Hallo allerseits,
wie ist das mit dem PID Regler gemeint wenn man zwei Zeiten hat.
Zeit A / Frequenz mit der ich die Drehzahl lese und meine globale
Variable update
Zeit B / Frequenz mit der ich den PID Regler antriggere und dies meine
"iterations_time" darstellt
1 | current_error = ref_speed - rpm;
|
2 | integration_sum = integration_sum + (current_error * iteration_time);
|
3 | duty = ( KP * current_error +
|
4 | KI * integration_sum +
|
5 | KD *((current_error -previous_error)/iteration_time));
|
Welche der beiden Frequenzen muss höher sein? Habe gerade hier einen
blackout.
Ich versuche hier die Drehzahl eines Bürstenmotors zu regeln.
Zweite Frage (STM32 spezifisch):
Wenn ich beides in einer Callbackroutine anhandele, also die Timer für
ZeitA und Zeit B, könnte ich mir da Probleme wegen Überholern/Blockeden
einhandeln?
Nehmen wir an Timer1 alls 1ms und Timer2 alle 10.
Würde die Callback routine aufgerufen werden für Timer1 wenn Timer2 code
noch läuft?
Vielen Dank für die Hilfe..brauche gerade ein paar kleine denkanstöße
1 | void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *tim)
|
2 | {
|
3 | if(tim->Instance == TIM4)
|
4 | {
|
5 |
|
6 | // enc_cnt = htim1.Instance->CNT - enc_cnt_old;
|
7 | // enc_cnt_old = htim1.Instance->CNT;
|
8 | //
|
9 | // rpm=0+((enc_cnt*20*60)/400);
|
10 |
|
11 | // rpm_tmp=rpm_tmp+((enc_cnt*100*60)/400);
|
12 | // counter_avg++;
|
13 | //
|
14 | // if(counter_avg==2)
|
15 | // {
|
16 | // rpm=rpm_tmp/2;
|
17 | // counter_avg=1;
|
18 | // rpm_tmp=0;
|
19 | // }
|
20 | res=1;
|
21 |
|
22 | }
|
23 | else if(tim->Instance == TIM5)
|
24 | {
|
25 |
|
26 |
|
27 | current_error = ref_speed - rpm;
|
28 | integration_sum = integration_sum + (current_error * iteration_time);
|
29 | duty = ( KP * current_error +
|
30 | KI * integration_sum +
|
31 | KD *((current_error -previous_error)/iteration_time));
|
32 |
|
33 |
|
34 | if(duty<0)
|
35 | duty =duty*-1;
|
36 |
|
37 |
|
38 | if((duty*12)>10000)
|
39 | duty=10000;
|
40 | else
|
41 | duty=duty*12;
|
42 | htim3.Instance->CCR1 = duty;
|
43 |
|
44 | previous_error = current_error;
|
45 | res=0;
|
46 |
|
47 | }
|
48 |
|
49 | }
|