Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Versuch21 by
Classes/EncoderCounter.cpp
- Committer:
- baumgant
- Date:
- 2018-04-22
- Revision:
- 0:b886f13e4ac6
File content as of revision 0:b886f13e4ac6:
/*
* EncoderCounter.cpp
* Copyright (c) 2018, ZHAW
* All rights reserved.
*/
#include "EncoderCounter.h"
using namespace std;
/**
* Creates and initializes the driver to read the quadrature
* encoder counter of the STM32 microcontroller.
* @param a the input pin for the channel A.
* @param b the input pin for the channel B.
*/
EncoderCounter::EncoderCounter(PinName a, PinName b) {
// check pins
if ((a == PA_0) && (b == PA_1)) {
// pinmap OK for TIM2 CH1 and CH2
TIM = TIM2;
// configure general purpose I/O registers
GPIOA->MODER &= ~GPIO_MODER_MODER0; // reset port A0
GPIOA->MODER |= GPIO_MODER_MODER0_1; // set alternate mode of port A0
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR0; // reset pull-up/pull-down on port A0
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR0_1; // set input as pull-down
GPIOA->AFR[0] &= ~(0xF << 4*0); // reset alternate function of port A0
GPIOA->AFR[0] |= 1 << 4*0; // set alternate funtion 1 of port A0
GPIOA->MODER &= ~GPIO_MODER_MODER1; // reset port A1
GPIOA->MODER |= GPIO_MODER_MODER1_1; // set alternate mode of port A1
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR1; // reset pull-up/pull-down on port A1
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR1_1; // set input as pull-down
GPIOA->AFR[0] &= ~(0xF << 4*1); // reset alternate function of port A1
GPIOA->AFR[0] |= 1 << 4*1; // set alternate funtion 1 of port A1
// configure reset and clock control registers
RCC->APB1RSTR |= RCC_APB1RSTR_TIM2RST; //reset TIM2 controller
RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM2RST;
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // TIM2 clock enable
} else if ((a == PA_6) && (b == PC_7)) {
// pinmap OK for TIM3 CH1 and CH2
TIM = TIM3;
// configure reset and clock control registers
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // manually enable port C (port A enabled by mbed library)
// configure general purpose I/O registers
GPIOA->MODER &= ~GPIO_MODER_MODER6; // reset port A6
GPIOA->MODER |= GPIO_MODER_MODER6_1; // set alternate mode of port A6
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6; // reset pull-up/pull-down on port A6
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR6_1; // set input as pull-down
GPIOA->AFR[0] &= ~(0xF << 4*6); // reset alternate function of port A6
GPIOA->AFR[0] |= 2 << 4*6; // set alternate funtion 2 of port A6
GPIOC->MODER &= ~GPIO_MODER_MODER7; // reset port C7
GPIOC->MODER |= GPIO_MODER_MODER7_1; // set alternate mode of port C7
GPIOC->PUPDR &= ~GPIO_PUPDR_PUPDR7; // reset pull-up/pull-down on port C7
GPIOC->PUPDR |= GPIO_PUPDR_PUPDR7_1; // set input as pull-down
GPIOC->AFR[0] &= ~0xF0000000; // reset alternate function of port C7
GPIOC->AFR[0] |= 2 << 4*7; // set alternate funtion 2 of port C7
// configure reset and clock control registers
RCC->APB1RSTR |= RCC_APB1RSTR_TIM3RST; //reset TIM3 controller
RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM3RST;
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // TIM3 clock enable
} else if ((a == PB_6) && (b == PB_7)) {
// pinmap OK for TIM4 CH1 and CH2
TIM = TIM4;
// configure reset and clock control registers
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // manually enable port B (port A enabled by mbed library)
// configure general purpose I/O registers
GPIOB->MODER &= ~GPIO_MODER_MODER6; // reset port B6
GPIOB->MODER |= GPIO_MODER_MODER6_1; // set alternate mode of port B6
GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR6; // reset pull-up/pull-down on port B6
GPIOB->PUPDR |= GPIO_PUPDR_PUPDR6_1; // set input as pull-down
GPIOB->AFR[0] &= ~(0xF << 4*6); // reset alternate function of port B6
GPIOB->AFR[0] |= 2 << 4*6; // set alternate funtion 2 of port B6
GPIOB->MODER &= ~GPIO_MODER_MODER7; // reset port B7
GPIOB->MODER |= GPIO_MODER_MODER7_1; // set alternate mode of port B7
GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR7; // reset pull-up/pull-down on port B7
GPIOB->PUPDR |= GPIO_PUPDR_PUPDR7_1; // set input as pull-down
GPIOB->AFR[0] &= ~0xF0000000; // reset alternate function of port B7
GPIOB->AFR[0] |= 2 << 4*7; // set alternate funtion 2 of port B7
// configure reset and clock control registers
RCC->APB1RSTR |= RCC_APB1RSTR_TIM4RST; //reset TIM4 controller
RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM4RST;
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // TIM4 clock enable
} else {
printf("pinmap not found for peripheral\n");
}
// configure general purpose timer 3 or 4
TIM->CR1 = 0x0000; // counter disable
TIM->CR2 = 0x0000; // reset master mode selection
TIM->SMCR = TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; // counting on both TI1 & TI2 edges
TIM->CCMR1 = TIM_CCMR1_CC2S_0 | TIM_CCMR1_CC1S_0;
TIM->CCMR2 = 0x0000; // reset capture mode register 2
TIM->CCER = TIM_CCER_CC2E | TIM_CCER_CC1E;
TIM->CNT = 0x0000; // reset counter value
TIM->ARR = 0xFFFF; // auto reload register
TIM->CR1 = TIM_CR1_CEN; // counter enable
}
EncoderCounter::~EncoderCounter() {}
/**
* Resets the counter value to zero.
*/
void EncoderCounter::reset() {
TIM->CNT = 0x0000;
}
/**
* Resets the counter value to a given offset value.
* @param offset the offset value to reset the counter to.
*/
void EncoderCounter::reset(short offset) {
TIM->CNT = -offset;
}
/**
* Reads the quadrature encoder counter value.
* @return the quadrature encoder counter as a signed 16-bit integer value.
*/
short EncoderCounter::read() {
return (short)(-TIM->CNT);
}
/**
* The empty operator is a shorthand notation of the <code>read()</code> method.
*/
EncoderCounter::operator short() {
return read();
}
