sef

Dependencies:   mbed

Fork of Bewegungen_mit_Sensor by kings

Committer:
EHess
Date:
Wed May 10 09:14:12 2017 +0000
Revision:
1:d40ff07e2fe0
Encoder und Sensorwerte

Who changed what in which revision?

UserRevisionLine numberNew 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 }