Kannst du ein Datenblatt posten nach deem du gehst. Dann könnte ich nachlesen.
MfG Hannes
Kannst du ein Datenblatt posten nach deem du gehst. Dann könnte ich nachlesen.
MfG Hannes
Hallo Lieber 021aet04
Ich danke dir viel mals für deine Bereitschaft mir zu helfen.
Anbei sende ich dir das Referenz Manual (RM000.
Dieses Datenbaltt besteth aus 1072 Seiten, deswegen möchte ich dir erleichten, die entsprechende Seiten schnell zu finden.
Encoder Inreface Mode findest du ab Seite 301
Center-aligned mode (up/down counting) ab Seit 278
SPI ab Seite 657 (meine Schaltung wird dabei als Slave-Device betrieben)
Vielen Danke für deine Hilfe.
LG
Adam
So hat er bei mir functioniert mit ein qwadrature encoder !! Beide Eingangen mussen beschaltet sein, und in Fase versetzt. Dan zaehlt den counter hoch oder ab, abhangig welke Flanke erst kommt.
Code:/** * @brief Configures the TIMx Encoder Interface. * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral. * @param TIM_EncoderMode: specifies the TIMx Encoder Mode. * This parameter can be one of the following values: * @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level. * @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level. * @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending * on the level of the other input. * @param TIM_IC1Polarity: specifies the IC1 Polarity * This parmeter can be one of the following values: * @arg TIM_ICPolarity_Falling: IC Falling edge. * @arg TIM_ICPolarity_Rising: IC Rising edge. * @param TIM_IC2Polarity: specifies the IC2 Polarity * This parmeter can be one of the following values: * @arg TIM_ICPolarity_Falling: IC Falling edge. * @arg TIM_ICPolarity_Rising: IC Rising edge. * @retval None */ TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); /* TIM enable counter */ TIM_Cmd(TIM2, ENABLE); TIM_Cmd(TIM4, ENABLE); /* TIM2 + TIM4 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); /* GPIOA, GPIOB and GPIOC clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); //configure TIM2 CH0/CH1 = A0,A1 alternate function for encoder reading GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_15; GPIO_Init(GPIOA, &GPIO_InitStructure); //configure TIM4 CH0/CH1 = B6,B7 alternate function for encoder reading GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 |GPIO_Pin_6 | GPIO_Pin_7; GPIO_Init(GPIOB, &GPIO_InitStructure); static int16_t encoder1; static int16_t encoder2; encoder1=TIM2->CNT; //actuele waarde van encoder1 encoder2=TIM4->CNT; //actuele waarde van encoder2
hallo RP6conrad,
Ich hätte gerne paar Fragen zu deinem Code.
1) zuerst warum hast zwei Timer TIM2 und TIM4 dafür eingesetzt? wolltest du damit Zwie Drehgebers abtasten?
2)ich sehe in deinem Code keine Funktion, womit der Counter in beide Richtung zählt() sowohl heruaf als acu heunter. laut der RM0008 stellt man sowas durch die folgende Funktion:
TIM_CounterModeConfig(TIM1,TIM_CounterMode_CenterA ligned3);
3) braucht man die Funktion TIM-TimeBseStructure nicht__?????
4) soweit ich richtig verstsnden habe der Counter bekommt das Signal TI1FP1 und TI2FP2, und die beide Signalen sind Inputcapture. das heisst mann soll auch das Capture/ Compare unti Teilweise einstellen wie folgt:
TIM_ICInitStructure.TIM_Channel =TIM_Channel_1 |TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter =0x0;
TIM_ICInit(TIM1, &TIM_ICInitStructure);
5)mit was kann man auf die folgende Frage Antworten:
kann der Counter in eine Sekunde 200.000 Steigende Flanke zählen? bzw. 400.000 steigende und fallende Flanke zählen?
1. Stimmt, ich habe 2 motoren mit jeden ein kwadrature encoder (ist für eine robby mit differential drive). Damit wirden von beide motoren die exacte position erfasst.
2. Das schone von diese timer ist das alles komplett in harware verlauft. Ihre C-program muss sich da nicht mehr um kummerm ! Nur eine ueberlauf (16 bit counter) sollen sie noch mit eine interrupt abfangen.
3. Tim base Structure brauchen sie in diesen Fall nicht.
4. Auch input capture braucht man nicht. Ein Input Capture macht folgendes : sobald das "Event" (positive flanke, negatieve flanke) passiert, wird die Timer wert in ein Register abgelegt. Den Timer lauft dabei an eine feste Frequenz. Ist forgesehen um Zeiten zwischen zwei "Events" genau zu messen.
5. Habe ich auch keine Wert gefunden, aber 400 kHz soll eigentlich kein Problem sein, da alles in HW verlauft.
Lesezeichen