main.cpp: Sensoren einlesen und Motoren ansteuern

Dependencies:   mbed

Committer:
maddajan
Date:
Mon Apr 16 12:49:50 2018 +0000
Revision:
7:8d60a2ff4c2b
Parent:
5:47262622a9bf
rfesfs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helvis 0:9a3e7847a4be 1 /*
Helvis 0:9a3e7847a4be 2 * EncoderCounter.cpp
Helvis 0:9a3e7847a4be 3 * Copyright (c) 2018, ZHAW
Helvis 0:9a3e7847a4be 4 * All rights reserved.
Helvis 0:9a3e7847a4be 5 */
Helvis 0:9a3e7847a4be 6
Helvis 0:9a3e7847a4be 7 #include "EncoderCounter.h"
Helvis 0:9a3e7847a4be 8
Helvis 0:9a3e7847a4be 9 using namespace std;
Helvis 0:9a3e7847a4be 10
Helvis 0:9a3e7847a4be 11 /**
Helvis 0:9a3e7847a4be 12 * Creates and initializes the driver to read the quadrature
Helvis 0:9a3e7847a4be 13 * encoder counter of the STM32 microcontroller.
Helvis 0:9a3e7847a4be 14 * @param a the input pin for the channel A.
Helvis 0:9a3e7847a4be 15 * @param b the input pin for the channel B.
Helvis 0:9a3e7847a4be 16 */
Helvis 0:9a3e7847a4be 17 EncoderCounter::EncoderCounter(PinName a, PinName b) {
Helvis 0:9a3e7847a4be 18
Helvis 0:9a3e7847a4be 19 // check pins
Helvis 0:9a3e7847a4be 20
Helvis 0:9a3e7847a4be 21 if ((a == PA_0) && (b == PA_1)) {
Helvis 0:9a3e7847a4be 22
Helvis 0:9a3e7847a4be 23 // pinmap OK for TIM2 CH1 and CH2
Helvis 0:9a3e7847a4be 24
Helvis 0:9a3e7847a4be 25 TIM = TIM2;
Helvis 0:9a3e7847a4be 26
Helvis 0:9a3e7847a4be 27 // configure general purpose I/O registers
Helvis 0:9a3e7847a4be 28
Helvis 0:9a3e7847a4be 29 GPIOA->MODER &= ~GPIO_MODER_MODER0; // reset port A0
Helvis 0:9a3e7847a4be 30 GPIOA->MODER |= GPIO_MODER_MODER0_1; // set alternate mode of port A0
Helvis 0:9a3e7847a4be 31 GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR0; // reset pull-up/pull-down on port A0
Helvis 0:9a3e7847a4be 32 GPIOA->PUPDR |= GPIO_PUPDR_PUPDR0_1; // set input as pull-down
Helvis 0:9a3e7847a4be 33 GPIOA->AFR[0] &= ~(0xF << 4*0); // reset alternate function of port A0
Helvis 0:9a3e7847a4be 34 GPIOA->AFR[0] |= 1 << 4*0; // set alternate funtion 1 of port A0
Helvis 0:9a3e7847a4be 35
Helvis 0:9a3e7847a4be 36 GPIOA->MODER &= ~GPIO_MODER_MODER1; // reset port A1
Helvis 0:9a3e7847a4be 37 GPIOA->MODER |= GPIO_MODER_MODER1_1; // set alternate mode of port A1
Helvis 0:9a3e7847a4be 38 GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR1; // reset pull-up/pull-down on port A1
Helvis 0:9a3e7847a4be 39 GPIOA->PUPDR |= GPIO_PUPDR_PUPDR1_1; // set input as pull-down
Helvis 0:9a3e7847a4be 40 GPIOA->AFR[0] &= ~(0xF << 4*1); // reset alternate function of port A1
Helvis 0:9a3e7847a4be 41 GPIOA->AFR[0] |= 1 << 4*1; // set alternate funtion 1 of port A1
Helvis 0:9a3e7847a4be 42
Helvis 0:9a3e7847a4be 43 // configure reset and clock control registers
Helvis 0:9a3e7847a4be 44
Helvis 0:9a3e7847a4be 45 RCC->APB1RSTR |= RCC_APB1RSTR_TIM2RST; //reset TIM2 controller
Helvis 0:9a3e7847a4be 46 RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM2RST;
Helvis 0:9a3e7847a4be 47
Helvis 0:9a3e7847a4be 48 RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // TIM2 clock enable
Helvis 0:9a3e7847a4be 49
Helvis 0:9a3e7847a4be 50 } else if ((a == PA_6) && (b == PC_7)) {
Helvis 0:9a3e7847a4be 51
Helvis 0:9a3e7847a4be 52 // pinmap OK for TIM3 CH1 and CH2
Helvis 0:9a3e7847a4be 53
Helvis 0:9a3e7847a4be 54 TIM = TIM3;
Helvis 0:9a3e7847a4be 55
Helvis 0:9a3e7847a4be 56 // configure reset and clock control registers
Helvis 0:9a3e7847a4be 57
Helvis 0:9a3e7847a4be 58 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // manually enable port C (port A enabled by mbed library)
Helvis 0:9a3e7847a4be 59
Helvis 0:9a3e7847a4be 60 // configure general purpose I/O registers
Helvis 0:9a3e7847a4be 61
Helvis 0:9a3e7847a4be 62 GPIOA->MODER &= ~GPIO_MODER_MODER6; // reset port A6
Helvis 0:9a3e7847a4be 63 GPIOA->MODER |= GPIO_MODER_MODER6_1; // set alternate mode of port A6
Helvis 0:9a3e7847a4be 64 GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6; // reset pull-up/pull-down on port A6
Helvis 0:9a3e7847a4be 65 GPIOA->PUPDR |= GPIO_PUPDR_PUPDR6_1; // set input as pull-down
Helvis 0:9a3e7847a4be 66 GPIOA->AFR[0] &= ~(0xF << 4*6); // reset alternate function of port A6
Helvis 0:9a3e7847a4be 67 GPIOA->AFR[0] |= 2 << 4*6; // set alternate funtion 2 of port A6
Helvis 0:9a3e7847a4be 68
Helvis 0:9a3e7847a4be 69 GPIOC->MODER &= ~GPIO_MODER_MODER7; // reset port C7
Helvis 0:9a3e7847a4be 70 GPIOC->MODER |= GPIO_MODER_MODER7_1; // set alternate mode of port C7
Helvis 0:9a3e7847a4be 71 GPIOC->PUPDR &= ~GPIO_PUPDR_PUPDR7; // reset pull-up/pull-down on port C7
Helvis 0:9a3e7847a4be 72 GPIOC->PUPDR |= GPIO_PUPDR_PUPDR7_1; // set input as pull-down
Helvis 0:9a3e7847a4be 73 GPIOC->AFR[0] &= ~0xF0000000; // reset alternate function of port C7
Helvis 0:9a3e7847a4be 74 GPIOC->AFR[0] |= 2 << 4*7; // set alternate funtion 2 of port C7
Helvis 0:9a3e7847a4be 75
Helvis 0:9a3e7847a4be 76 // configure reset and clock control registers
Helvis 0:9a3e7847a4be 77
Helvis 0:9a3e7847a4be 78 RCC->APB1RSTR |= RCC_APB1RSTR_TIM3RST; //reset TIM3 controller
Helvis 0:9a3e7847a4be 79 RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM3RST;
Helvis 0:9a3e7847a4be 80
Helvis 0:9a3e7847a4be 81 RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // TIM3 clock enable
Helvis 0:9a3e7847a4be 82
Helvis 0:9a3e7847a4be 83 } else if ((a == PB_6) && (b == PB_7)) {
Helvis 0:9a3e7847a4be 84
Helvis 0:9a3e7847a4be 85 // pinmap OK for TIM4 CH1 and CH2
Helvis 0:9a3e7847a4be 86
Helvis 0:9a3e7847a4be 87 TIM = TIM4;
Helvis 0:9a3e7847a4be 88
Helvis 0:9a3e7847a4be 89 // configure reset and clock control registers
Helvis 0:9a3e7847a4be 90
Helvis 0:9a3e7847a4be 91 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // manually enable port B (port A enabled by mbed library)
Helvis 0:9a3e7847a4be 92
Helvis 0:9a3e7847a4be 93 // configure general purpose I/O registers
Helvis 0:9a3e7847a4be 94
Helvis 0:9a3e7847a4be 95 GPIOB->MODER &= ~GPIO_MODER_MODER6; // reset port B6
Helvis 0:9a3e7847a4be 96 GPIOB->MODER |= GPIO_MODER_MODER6_1; // set alternate mode of port B6
Helvis 0:9a3e7847a4be 97 GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR6; // reset pull-up/pull-down on port B6
Helvis 0:9a3e7847a4be 98 GPIOB->PUPDR |= GPIO_PUPDR_PUPDR6_1; // set input as pull-down
Helvis 0:9a3e7847a4be 99 GPIOB->AFR[0] &= ~(0xF << 4*6); // reset alternate function of port B6
Helvis 0:9a3e7847a4be 100 GPIOB->AFR[0] |= 2 << 4*6; // set alternate funtion 2 of port B6
Helvis 0:9a3e7847a4be 101
Helvis 0:9a3e7847a4be 102 GPIOB->MODER &= ~GPIO_MODER_MODER7; // reset port B7
Helvis 0:9a3e7847a4be 103 GPIOB->MODER |= GPIO_MODER_MODER7_1; // set alternate mode of port B7
Helvis 0:9a3e7847a4be 104 GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR7; // reset pull-up/pull-down on port B7
Helvis 0:9a3e7847a4be 105 GPIOB->PUPDR |= GPIO_PUPDR_PUPDR7_1; // set input as pull-down
Helvis 0:9a3e7847a4be 106 GPIOB->AFR[0] &= ~0xF0000000; // reset alternate function of port B7
Helvis 0:9a3e7847a4be 107 GPIOB->AFR[0] |= 2 << 4*7; // set alternate funtion 2 of port B7
Helvis 0:9a3e7847a4be 108
Helvis 0:9a3e7847a4be 109 // configure reset and clock control registers
Helvis 0:9a3e7847a4be 110
Helvis 0:9a3e7847a4be 111 RCC->APB1RSTR |= RCC_APB1RSTR_TIM4RST; //reset TIM4 controller
Helvis 0:9a3e7847a4be 112 RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM4RST;
Helvis 0:9a3e7847a4be 113
Helvis 0:9a3e7847a4be 114 RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // TIM4 clock enable
Helvis 0:9a3e7847a4be 115
Helvis 0:9a3e7847a4be 116 } else {
Helvis 0:9a3e7847a4be 117
Helvis 0:9a3e7847a4be 118 printf("pinmap not found for peripheral\n");
Helvis 0:9a3e7847a4be 119 }
Helvis 0:9a3e7847a4be 120
Helvis 0:9a3e7847a4be 121 // configure general purpose timer 3 or 4
Helvis 0:9a3e7847a4be 122
Helvis 0:9a3e7847a4be 123 TIM->CR1 = 0x0000; // counter disable
Helvis 0:9a3e7847a4be 124 TIM->CR2 = 0x0000; // reset master mode selection
Helvis 0:9a3e7847a4be 125 TIM->SMCR = TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; // counting on both TI1 & TI2 edges
Helvis 0:9a3e7847a4be 126 TIM->CCMR1 = TIM_CCMR1_CC2S_0 | TIM_CCMR1_CC1S_0;
Helvis 0:9a3e7847a4be 127 TIM->CCMR2 = 0x0000; // reset capture mode register 2
Helvis 0:9a3e7847a4be 128 TIM->CCER = TIM_CCER_CC2E | TIM_CCER_CC1E;
Helvis 0:9a3e7847a4be 129 TIM->CNT = 0x0000; // reset counter value
Helvis 0:9a3e7847a4be 130 TIM->ARR = 0xFFFF; // auto reload register
Helvis 0:9a3e7847a4be 131 TIM->CR1 = TIM_CR1_CEN; // counter enable
Helvis 0:9a3e7847a4be 132 }
Helvis 0:9a3e7847a4be 133
Helvis 0:9a3e7847a4be 134 EncoderCounter::~EncoderCounter() {}
Helvis 0:9a3e7847a4be 135
Helvis 0:9a3e7847a4be 136 /**
Helvis 0:9a3e7847a4be 137 * Resets the counter value to zero.
Helvis 0:9a3e7847a4be 138 */
Helvis 0:9a3e7847a4be 139 void EncoderCounter::reset() {
Helvis 0:9a3e7847a4be 140
Helvis 5:47262622a9bf 141 TIM->CNT = 0x0000;
Helvis 0:9a3e7847a4be 142 }
Helvis 0:9a3e7847a4be 143
Helvis 0:9a3e7847a4be 144 /**
Helvis 0:9a3e7847a4be 145 * Resets the counter value to a given offset value.
Helvis 0:9a3e7847a4be 146 * @param offset the offset value to reset the counter to.
Helvis 0:9a3e7847a4be 147 */
Helvis 0:9a3e7847a4be 148 void EncoderCounter::reset(short offset) {
Helvis 0:9a3e7847a4be 149
Helvis 0:9a3e7847a4be 150 TIM->CNT = -offset;
Helvis 0:9a3e7847a4be 151 }
Helvis 0:9a3e7847a4be 152
Helvis 0:9a3e7847a4be 153 /**
Helvis 0:9a3e7847a4be 154 * Reads the quadrature encoder counter value.
Helvis 0:9a3e7847a4be 155 * @return the quadrature encoder counter as a signed 16-bit integer value.
Helvis 0:9a3e7847a4be 156 */
Helvis 0:9a3e7847a4be 157 short EncoderCounter::read() {
Helvis 0:9a3e7847a4be 158
Helvis 0:9a3e7847a4be 159 return (short)(-TIM->CNT);
Helvis 0:9a3e7847a4be 160 }
Helvis 0:9a3e7847a4be 161
Helvis 0:9a3e7847a4be 162 /**
Helvis 0:9a3e7847a4be 163 * The empty operator is a shorthand notation of the <code>read()</code> method.
Helvis 0:9a3e7847a4be 164 */
Helvis 0:9a3e7847a4be 165 EncoderCounter::operator short() {
Helvis 0:9a3e7847a4be 166
Helvis 0:9a3e7847a4be 167 return read();
Helvis 0:9a3e7847a4be 168 }