Forum: Mikrocontroller und Digitale Elektronik STM32F3 Timer Encoder Auswertung


von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Hallo,

ich versuche mich an einer Drehzahlregelung eine 
Getriebemotors(Hal-Encoder). Mittels CubeMX habe ich den Timer für den 
Encoder sowie einen Timer für den Regleraufruf eingestellt. Soweit 
klappt das ganze auch. Nur bekomme ich einen Überlauf bei der 
Encoder-Auswertung bzw. der Timer des Encoders läuft über. Die 
Encoder-Auswertung stammt nicht von mir. Habe da echt ein Brett vorm 
Kopf, wie ich die Drehzahl berechnen soll. Hat jemand einen Tip und kann 
mir Helfen?

Gruß Sascha

Hier die Timer Initialisierung:
1
static void MX_TIM1_Init(void)
2
{
3
4
  /* USER CODE BEGIN TIM1_Init 0 */
5
6
  /* USER CODE END TIM1_Init 0 */
7
8
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
9
  TIM_MasterConfigTypeDef sMasterConfig = {0};
10
  TIM_OC_InitTypeDef sConfigOC = {0};
11
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
12
13
  /* USER CODE BEGIN TIM1_Init 1 */
14
15
  /* USER CODE END TIM1_Init 1 */
16
  htim1.Instance = TIM1;
17
  htim1.Init.Prescaler = 144-1;
18
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
19
  htim1.Init.Period = 1024-1;
20
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
21
  htim1.Init.RepetitionCounter = 0;
22
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
23
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
24
  {
25
    Error_Handler();
26
  }
27
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
28
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
29
  {
30
    Error_Handler();
31
  }
32
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
33
  {
34
    Error_Handler();
35
  }
36
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
37
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
38
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
39
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
40
  {
41
    Error_Handler();
42
  }
43
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
44
  sConfigOC.Pulse = 0;
45
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
46
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
47
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
48
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
49
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
50
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
51
  {
52
    Error_Handler();
53
  }
54
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
55
  {
56
    Error_Handler();
57
  }
58
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
59
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
60
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
61
  sBreakDeadTimeConfig.DeadTime = 0;
62
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
63
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
64
  sBreakDeadTimeConfig.BreakFilter = 0;
65
  sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
66
  sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
67
  sBreakDeadTimeConfig.Break2Filter = 0;
68
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
69
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
70
  {
71
    Error_Handler();
72
  }
73
  /* USER CODE BEGIN TIM1_Init 2 */
74
75
  /* USER CODE END TIM1_Init 2 */
76
  HAL_TIM_MspPostInit(&htim1);
77
78
}
79
80
/**
81
  * @brief TIM2 Initialization Function
82
  * @param None
83
  * @retval None
84
  */
85
static void MX_TIM2_Init(void)
86
{
87
88
  /* USER CODE BEGIN TIM2_Init 0 */
89
90
  /* USER CODE END TIM2_Init 0 */
91
92
  TIM_Encoder_InitTypeDef sConfig = {0};
93
  TIM_MasterConfigTypeDef sMasterConfig = {0};
94
95
  /* USER CODE BEGIN TIM2_Init 1 */
96
97
  /* USER CODE END TIM2_Init 1 */
98
  htim2.Instance = TIM2;
99
  htim2.Init.Prescaler = 0;
100
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
101
  htim2.Init.Period = 65535;
102
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
103
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
104
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
105
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
106
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
107
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
108
  sConfig.IC1Filter = 5;
109
  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
110
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
111
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
112
  sConfig.IC2Filter = 5;
113
  if (HAL_TIM_Encoder_Init(&htim2, &sConfig) != HAL_OK)
114
  {
115
    Error_Handler();
116
  }
117
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
118
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
119
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
120
  {
121
    Error_Handler();
122
  }
123
  /* USER CODE BEGIN TIM2_Init 2 */
124
125
  /* USER CODE END TIM2_Init 2 */
126
127
}

Hier der Regler samt Timer-Encoder
1
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim7)
2
{
3
  HAL_GPIO_WritePin(M1_A_GPIO_Port, M1_A_Pin, GPIO_PIN_SET);
4
  capture1 = TIM2->CNT;
5
  Encoder1 = capture1 - capture_prev1;
6
  if (abs(capture1-capture_prev1)>32767)
7
    {
8
    Encoder1 = (capture1<capture_prev1 ? 65535 : -65535);
9
    }
10
  capture_prev1 = capture1;
11
12
  Input=(float)Encoder1;
13
  Setpoint=20;
14
  PID_Regler();
15
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, (uint16_t) Output);
16
  HAL_GPIO_WritePin(M1_A_GPIO_Port, M1_A_Pin, GPIO_PIN_RESET);
17
}

von Walter T. (nicolas)


Lesenswert?

Überlauf ist Okay. Lerne, damit zu leben (Überlauf vorzeichenrichtig 
auswerten). Bei Geschwindigkeiten kommt es eh nur auf die Differenz an.

von Joe F. (easylife)


Lesenswert?

Walter T. schrieb:
> Überlauf ist Okay.

...aber nur ein einfacher...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.