sef
Dependencies: mbed
Fork of Bewegungen_mit_Sensor by
MotorEncoder.cpp@1:d40ff07e2fe0, 2017-05-10 (annotated)
- Committer:
- EHess
- Date:
- Wed May 10 09:14:12 2017 +0000
- Revision:
- 1:d40ff07e2fe0
Encoder und Sensorwerte
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
EHess | 1:d40ff07e2fe0 | 1 | #include "MotorEncoder.h" |
EHess | 1:d40ff07e2fe0 | 2 | |
EHess | 1:d40ff07e2fe0 | 3 | //E. Hess |
EHess | 1:d40ff07e2fe0 | 4 | //MotorEncoder.h |
EHess | 1:d40ff07e2fe0 | 5 | |
EHess | 1:d40ff07e2fe0 | 6 | using namespace std; |
EHess | 1:d40ff07e2fe0 | 7 | |
EHess | 1:d40ff07e2fe0 | 8 | // Erstellt einen Treiber um den Encoder zu lesen und initialisiert ihn |
EHess | 1:d40ff07e2fe0 | 9 | // PinName a ist der Input für Kanal A |
EHess | 1:d40ff07e2fe0 | 10 | // PinName b ist der Input für Kanal B |
EHess | 1:d40ff07e2fe0 | 11 | |
EHess | 1:d40ff07e2fe0 | 12 | MotorEncoder::MotorEncoder(PinName a, PinName b) { |
EHess | 1:d40ff07e2fe0 | 13 | // Überprüft die Inputs |
EHess | 1:d40ff07e2fe0 | 14 | if ((a == PA_6) && (b == PC_7)) { // Rechter Motor |
EHess | 1:d40ff07e2fe0 | 15 | // pinmap OK for TIM3 CH1 and CH2 |
EHess | 1:d40ff07e2fe0 | 16 | TIM = TIM3; |
EHess | 1:d40ff07e2fe0 | 17 | |
EHess | 1:d40ff07e2fe0 | 18 | // Kunfiguration vom Reset und der Taktsteuerung |
EHess | 1:d40ff07e2fe0 | 19 | RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // manually enable port C (port A enabled by mbed library) |
EHess | 1:d40ff07e2fe0 | 20 | |
EHess | 1:d40ff07e2fe0 | 21 | // configure general purpose I/O registers |
EHess | 1:d40ff07e2fe0 | 22 | |
EHess | 1:d40ff07e2fe0 | 23 | GPIOA->MODER &= ~GPIO_MODER_MODER6; // reset port A6 |
EHess | 1:d40ff07e2fe0 | 24 | GPIOA->MODER |= GPIO_MODER_MODER6_1; // set alternate mode of port A6 |
EHess | 1:d40ff07e2fe0 | 25 | GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6; // reset pull-up/pull-down on port A6 |
EHess | 1:d40ff07e2fe0 | 26 | GPIOA->PUPDR |= GPIO_PUPDR_PUPDR6_1; // set input as pull-down |
EHess | 1:d40ff07e2fe0 | 27 | GPIOA->AFR[0] &= ~(0xF << 4*6); // reset alternate function of port A6 |
EHess | 1:d40ff07e2fe0 | 28 | GPIOA->AFR[0] |= 2 << 4*6; // set alternate funtion 2 of port A6 |
EHess | 1:d40ff07e2fe0 | 29 | |
EHess | 1:d40ff07e2fe0 | 30 | GPIOC->MODER &= ~GPIO_MODER_MODER7; // reset port C7 |
EHess | 1:d40ff07e2fe0 | 31 | GPIOC->MODER |= GPIO_MODER_MODER7_1; // set alternate mode of port C7 |
EHess | 1:d40ff07e2fe0 | 32 | GPIOC->PUPDR &= ~GPIO_PUPDR_PUPDR7; // reset pull-up/pull-down on port C7 |
EHess | 1:d40ff07e2fe0 | 33 | GPIOC->PUPDR |= GPIO_PUPDR_PUPDR7_1; // set input as pull-down |
EHess | 1:d40ff07e2fe0 | 34 | GPIOC->AFR[0] &= ~0xF0000000; // reset alternate function of port C7 |
EHess | 1:d40ff07e2fe0 | 35 | GPIOC->AFR[0] |= 2 << 4*7; // set alternate funtion 2 of port C7 |
EHess | 1:d40ff07e2fe0 | 36 | |
EHess | 1:d40ff07e2fe0 | 37 | // configure reset and clock control registers |
EHess | 1:d40ff07e2fe0 | 38 | |
EHess | 1:d40ff07e2fe0 | 39 | RCC->APB1RSTR |= RCC_APB1RSTR_TIM3RST; //reset TIM3 controller |
EHess | 1:d40ff07e2fe0 | 40 | RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM3RST; |
EHess | 1:d40ff07e2fe0 | 41 | |
EHess | 1:d40ff07e2fe0 | 42 | RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // TIM3 clock enable |
EHess | 1:d40ff07e2fe0 | 43 | |
EHess | 1:d40ff07e2fe0 | 44 | } else if ((a == PB_6) && (b == PB_7)) { // Links Motor |
EHess | 1:d40ff07e2fe0 | 45 | |
EHess | 1:d40ff07e2fe0 | 46 | // pinmap OK for TIM4 CH1 and CH2 |
EHess | 1:d40ff07e2fe0 | 47 | |
EHess | 1:d40ff07e2fe0 | 48 | TIM = TIM4; |
EHess | 1:d40ff07e2fe0 | 49 | |
EHess | 1:d40ff07e2fe0 | 50 | // configure reset and clock control registers |
EHess | 1:d40ff07e2fe0 | 51 | |
EHess | 1:d40ff07e2fe0 | 52 | RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // manually enable port B (port A enabled by mbed library) |
EHess | 1:d40ff07e2fe0 | 53 | |
EHess | 1:d40ff07e2fe0 | 54 | // configure general purpose I/O registers |
EHess | 1:d40ff07e2fe0 | 55 | |
EHess | 1:d40ff07e2fe0 | 56 | GPIOB->MODER &= ~GPIO_MODER_MODER6; // reset port B6 |
EHess | 1:d40ff07e2fe0 | 57 | GPIOB->MODER |= GPIO_MODER_MODER6_1; // set alternate mode of port B6 |
EHess | 1:d40ff07e2fe0 | 58 | GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR6; // reset pull-up/pull-down on port B6 |
EHess | 1:d40ff07e2fe0 | 59 | GPIOB->PUPDR |= GPIO_PUPDR_PUPDR6_1; // set input as pull-down |
EHess | 1:d40ff07e2fe0 | 60 | GPIOB->AFR[0] &= ~(0xF << 4*6); // reset alternate function of port B6 |
EHess | 1:d40ff07e2fe0 | 61 | GPIOB->AFR[0] |= 2 << 4*6; // set alternate funtion 2 of port B6 |
EHess | 1:d40ff07e2fe0 | 62 | |
EHess | 1:d40ff07e2fe0 | 63 | GPIOB->MODER &= ~GPIO_MODER_MODER7; // reset port B7 |
EHess | 1:d40ff07e2fe0 | 64 | GPIOB->MODER |= GPIO_MODER_MODER7_1; // set alternate mode of port B7 |
EHess | 1:d40ff07e2fe0 | 65 | GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR7; // reset pull-up/pull-down on port B7 |
EHess | 1:d40ff07e2fe0 | 66 | GPIOB->PUPDR |= GPIO_PUPDR_PUPDR7_1; // set input as pull-down |
EHess | 1:d40ff07e2fe0 | 67 | GPIOB->AFR[0] &= ~0xF0000000; // reset alternate function of port B7 |
EHess | 1:d40ff07e2fe0 | 68 | GPIOB->AFR[0] |= 2 << 4*7; // set alternate funtion 2 of port B7 |
EHess | 1:d40ff07e2fe0 | 69 | |
EHess | 1:d40ff07e2fe0 | 70 | // configure reset and clock control registers |
EHess | 1:d40ff07e2fe0 | 71 | |
EHess | 1:d40ff07e2fe0 | 72 | RCC->APB1RSTR |= RCC_APB1RSTR_TIM4RST; //reset TIM4 controller |
EHess | 1:d40ff07e2fe0 | 73 | RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM4RST; |
EHess | 1:d40ff07e2fe0 | 74 | |
EHess | 1:d40ff07e2fe0 | 75 | RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // TIM4 clock enable |
EHess | 1:d40ff07e2fe0 | 76 | |
EHess | 1:d40ff07e2fe0 | 77 | } else { |
EHess | 1:d40ff07e2fe0 | 78 | printf("Pinmap konnte nicht gefunden werden!\n"); |
EHess | 1:d40ff07e2fe0 | 79 | } |
EHess | 1:d40ff07e2fe0 | 80 | |
EHess | 1:d40ff07e2fe0 | 81 | // configure general purpose timer 3 or 4 |
EHess | 1:d40ff07e2fe0 | 82 | |
EHess | 1:d40ff07e2fe0 | 83 | TIM->CR1 = 0x0000; // counter disable |
EHess | 1:d40ff07e2fe0 | 84 | TIM->CR2 = 0x0000; // reset master mode selection |
EHess | 1:d40ff07e2fe0 | 85 | TIM->SMCR = TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; // counting on both TI1 & TI2 edges |
EHess | 1:d40ff07e2fe0 | 86 | TIM->CCMR1 = TIM_CCMR1_CC2S_0 | TIM_CCMR1_CC1S_0; |
EHess | 1:d40ff07e2fe0 | 87 | TIM->CCMR2 = 0x0000; // reset capture mode register 2 |
EHess | 1:d40ff07e2fe0 | 88 | TIM->CCER = TIM_CCER_CC2E | TIM_CCER_CC1E; |
EHess | 1:d40ff07e2fe0 | 89 | TIM->CNT = 0x0000; // reset counter value |
EHess | 1:d40ff07e2fe0 | 90 | TIM->ARR = 0xFFFF; // auto reload register |
EHess | 1:d40ff07e2fe0 | 91 | TIM->CR1 = TIM_CR1_CEN; // counter enable |
EHess | 1:d40ff07e2fe0 | 92 | } |
EHess | 1:d40ff07e2fe0 | 93 | |
EHess | 1:d40ff07e2fe0 | 94 | MotorEncoder::~MotorEncoder() {} |
EHess | 1:d40ff07e2fe0 | 95 | |
EHess | 1:d40ff07e2fe0 | 96 | // Setzt den Zähler auf NULL |
EHess | 1:d40ff07e2fe0 | 97 | void MotorEncoder::reset() { |
EHess | 1:d40ff07e2fe0 | 98 | |
EHess | 1:d40ff07e2fe0 | 99 | TIM->CNT = 0x0000; |
EHess | 1:d40ff07e2fe0 | 100 | } |
EHess | 1:d40ff07e2fe0 | 101 | |
EHess | 1:d40ff07e2fe0 | 102 | // Setzt den Zähler auf NULL zurück |
EHess | 1:d40ff07e2fe0 | 103 | void MotorEncoder::reset(short offset) { |
EHess | 1:d40ff07e2fe0 | 104 | TIM->CNT = -offset; |
EHess | 1:d40ff07e2fe0 | 105 | } |
EHess | 1:d40ff07e2fe0 | 106 | |
EHess | 1:d40ff07e2fe0 | 107 | // Liest den Zähler |
EHess | 1:d40ff07e2fe0 | 108 | short MotorEncoder::read() { |
EHess | 1:d40ff07e2fe0 | 109 | return (short)(-TIM->CNT); |
EHess | 1:d40ff07e2fe0 | 110 | } |
EHess | 1:d40ff07e2fe0 | 111 | |
EHess | 1:d40ff07e2fe0 | 112 | // Kurznotation für read() |
EHess | 1:d40ff07e2fe0 | 113 | MotorEncoder::operator short() { |
EHess | 1:d40ff07e2fe0 | 114 | return read(); |
EHess | 1:d40ff07e2fe0 | 115 | } |