Guten Tag.
Ich habe einen Motor mit Drehgeber. jetzt möchte ich die Pulse zählen,
die er "zurücklegt". ich habe die Leitung des Drehgebers an den Pin PD13
geführt. Im Datenblatt vom Motor steht:
6 Impulse pro Umdrehung - Pullup Spannung max. 6VDC - open drain
So habe ich den Pin entsprechen initialisiert:
1
GPIO_InitTypeDefGPIO_InitStructurePB;
2
GPIO_InitTypeDefGPIO_InitStructure;
3
//
4
EXTI_InitTypeDefEXTI_InitStructure;
5
NVIC_InitTypeDefNVIC_InitStructure;
6
7
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);// Enable the Clock for Port D
8
9
// Configure PD.13 FG -------------------------
10
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
11
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
12
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
13
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
14
GPIO_Init(GPIOD,&GPIO_InitStructure);
15
16
EXTI_InitStructure.EXTI_Line=EXTI_Line13;// External Interrupt on Line 5
17
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;// Set the Interrupt Mode
18
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;// Set the Interrupt trigger Mode
19
EXTI_InitStructure.EXTI_LineCmd=ENABLE;// Enabele the Interrupt Line
Das seltsame ist, der Interrupt Handler wird auch ausgeführt, wenn ich
gar nichts am Pin angeschlossen habe. Auch dann wenn ich den Enable gar
nie freigebe.
Das andere Problem ist, dass ich gar keine Pulse am Drehgeber habe. Kann
es sein, dass der Interne Pullup ca. 40kOhm zu klein ist? Habe
zusätzlich einen 50kOhm vom Pin auf 3.3V geschlossen, funktionierte
ebenfalls nicht.
Ich habe sonst niergends Interrupts auch der Pin PD13 ist auf dem
MCBSTM32F400er Board nicht andersweitig belegt.
Vielleicht hat jemand von euch eine Idee?
Vielen Dank und Grüsse
MC Bu
Zu deinem Interrupt-Problem: wäre möglich, dass einer der anderen Pins
dafür verantwortlich ist, der Interrupt-Handler den du benutzt ist ja
für mehrere zuständig. Weiß ja nicht, was du sonst noch so angeschlossen
hast?
Aber mal was anderes: warum benutzt du nicht einfach einen Timer im
Encoder-Modus, zum Beispiel mit den Pins PA0 und PA1? Mit den
Bibliotheken von Uwe
(http://mikrocontroller.bplaced.net/wordpress/?page_id=2140) sehr leicht
einzurichten und funktioniert dann auch wunderbar, so brauchst du gar
nicht mehr manuell zu zählen...
Hallo
Dank für den guten Hinweis.
Hab das mit dem Encoder Mode versucht. Das Problem ist, dass der CNT
Wert nur entweder 0 oder den Autoreloadwert enthält. Ist der
Autoreloadwert 0, wechselt der CNT Wert zwischen 0 und 1.
Timer 4 Init:
Das Bit DIR im Register CR1 toggelt zwischen 0 und 1, das bedeutet, das
der Zähler aufwärts zählt und dann wieder abwärts. Dies würde ja so
stimmen.
Hab ich dann da was falsch verstanden? Ich bin der Meinung, das im CNT
Register jeder einzelne Zählwert erfasst werden müsste, damit ich ja die
einzelnen Impulse, die der Motor zurückgelegt hat erfassen kann!?
Danke und Gruss
MC Bu
ließ das Datenblatt vom STM32F4 nochmal durch
im Encoder-Mode kann nur CH1 und CH2 benutzt werden
(du benutzt CH2 und CH3)
und im Encoder-Mode muss an beiden Pins
ein um 90° Phasenversetztes Signal anliegen
wenn du aber nur eine Signal-Leitung hast,
wird das so nichts
(ich vermute er zählt immmer +1, -1 , +1, -1 usw)
Gruss Uwe
Danke für den Hinweis...
ich benutze jetzt PD12 und PD13 / CHN1 und CHN2 von Timer 4.
Mit dem KO mess ich ja die Signale, die sind 90° verschoben.
Der Effekt bleibt allerdings der gleiche, leider.
Danke und Gruss
MC Bu
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.