Hallo,
ich experimentiere jetzt schon seit Wochen mit dem Einlesen eines PWM
Signals.
Ich konnte jetzt den "input capture mode" vom TIM1 aktivieren.
http://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files/DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf
"17.3.7 PWM input mode"
Wenn ich nun eine kostante PWM am Eingang anlegen, dann sollten doch
rein theoretisch die Register TIMx_CCR1 & TIMx_CCR2 jeweils NAHEZU
konstante Zahlen auspucken (TIMx_CCR1 => Periode vom PWM-Signal;
TIM1_CCR2 => Frequenz vom PWM-Signal). Beim direkt Zugriff (ohne
Interrupt) auf diese Register variieren allerdings die Werte (Die Werte
in CCR2 wechseln immer zwischen "Periode-WERT" und "Frequenz-WERT". Hab
ich da etwa falsch initialisiert?
Ich habe mir einmal testweise die Werte aus den betroffenen
Initialisierungsregistern ausgeben lassen:
1 | trace_printf("%x | %x | %x | %x | %d | %d\n", TIM1->SMCR, TIM1->CCER, TIM1->CCMR1, TIM1->DIER, rx[0], rx[1]);
|
*LOG:*
1 | 54 | b1 | 201 | 2 | 4095 | -->2047<--
|
2 | 54 | b1 | 201 | 2 | 4095 | -->4095<--
|
3 | 54 | b1 | 201 | 2 | 4095 | -->4095<--
|
4 | 54 | b1 | 201 | 2 | 4095 | -->2047<--
|
5 | 54 | b1 | 201 | 2 | 4095 | -->2047<--
|
6 | 54 | b1 | 201 | 2 | 4095 | -->4095<--
|
7 | 54 | b1 | 201 | 2 | 4095 | -->2047<--
|
8 | 54 | b1 | 201 | 2 | 4095 | -->2047<--
|
9 | 54 | b1 | 201 | 2 | 4095 | -->4095<--
|
...
Der TIM1 wird folgendermaßen initialisiert:
1 | void MX_TIM1_Init(void)
|
2 | {
|
3 | TIM_SlaveConfigTypeDef sSlaveConfig;
|
4 | TIM_IC_InitTypeDef sConfigIC;
|
5 |
|
6 | htim1.Instance = TIM1;
|
7 | htim1.Init.Prescaler = 41;
|
8 | htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
|
9 | htim1.Init.Period = 65535;
|
10 | htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
11 | htim1.Init.RepetitionCounter = 0;
|
12 | HAL_TIM_Base_Init(&htim1);
|
13 |
|
14 | HAL_TIM_IC_Init(&htim1);
|
15 |
|
16 | sSlaveConfig.SlaveMode = TIM_SLAVEMODE_RESET;
|
17 | sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
|
18 | sSlaveConfig.TriggerPolarity = TIM_INPUTCHANNELPOLARITY_BOTHEDGE;
|
19 | sSlaveConfig.TriggerFilter = 0;
|
20 | HAL_TIM_SlaveConfigSynchronization(&htim1, &sSlaveConfig);
|
21 |
|
22 | // CC2NP & CC2P = 1
|
23 | sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
|
24 | sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
|
25 | sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
|
26 | HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_1);
|
27 |
|
28 | sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_BOTHEDGE;
|
29 | sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
|
30 | sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
|
31 | HAL_TIM_IC_ConfigChannel(&htim1, &sConfigIC, TIM_CHANNEL_2);
|
32 | }
|
Ich arbeite hierbei mit der CUBE_MX LIB!
Hat vielleicht einer eine Erklärung dafür?
Vielen Dank für eure Hilfe!