Encoder

Dependencies:   mbed

Fork of Bewegungen by kings

Committer:
EHess
Date:
Wed May 10 09:15:42 2017 +0000
Revision:
1:e454e6f5d81a
wd

Who changed what in which revision?

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