Alex Pirciu
/
BFMC
a
src/Encoders/quadratureencoder.cpp@1:ceee5a608e7c, 2019-03-28 (annotated)
- Committer:
- alexpirciu
- Date:
- Thu Mar 28 07:44:42 2019 +0000
- Revision:
- 1:ceee5a608e7c
assa
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
alexpirciu | 1:ceee5a608e7c | 1 | /** |
alexpirciu | 1:ceee5a608e7c | 2 | * @file quadratureencoder.cpp |
alexpirciu | 1:ceee5a608e7c | 3 | * @author RBRO/PJ-IU |
alexpirciu | 1:ceee5a608e7c | 4 | * @brief |
alexpirciu | 1:ceee5a608e7c | 5 | * @version 0.1 |
alexpirciu | 1:ceee5a608e7c | 6 | * @date 2018-10-23 |
alexpirciu | 1:ceee5a608e7c | 7 | * |
alexpirciu | 1:ceee5a608e7c | 8 | * @copyright Copyright (c) 2018 |
alexpirciu | 1:ceee5a608e7c | 9 | * |
alexpirciu | 1:ceee5a608e7c | 10 | */ |
alexpirciu | 1:ceee5a608e7c | 11 | #include <Encoders/Quadratureencoder.hpp> |
alexpirciu | 1:ceee5a608e7c | 12 | |
alexpirciu | 1:ceee5a608e7c | 13 | |
alexpirciu | 1:ceee5a608e7c | 14 | namespace encoders{ |
alexpirciu | 1:ceee5a608e7c | 15 | |
alexpirciu | 1:ceee5a608e7c | 16 | |
alexpirciu | 1:ceee5a608e7c | 17 | |
alexpirciu | 1:ceee5a608e7c | 18 | CQuadratureEncoder_TIM4 *CQuadratureEncoder_TIM4::m_instance = 0; |
alexpirciu | 1:ceee5a608e7c | 19 | CQuadratureEncoder_TIM4::CQuadratureEncoder_TIM4_Destroyer CQuadratureEncoder_TIM4::m_destroyer; |
alexpirciu | 1:ceee5a608e7c | 20 | |
alexpirciu | 1:ceee5a608e7c | 21 | |
alexpirciu | 1:ceee5a608e7c | 22 | /** |
alexpirciu | 1:ceee5a608e7c | 23 | * @brief Setter function. |
alexpirciu | 1:ceee5a608e7c | 24 | * |
alexpirciu | 1:ceee5a608e7c | 25 | * @param s singleton object address |
alexpirciu | 1:ceee5a608e7c | 26 | */ |
alexpirciu | 1:ceee5a608e7c | 27 | void CQuadratureEncoder_TIM4::CQuadratureEncoder_TIM4_Destroyer::SetSingleton(CQuadratureEncoder_TIM4* s){ |
alexpirciu | 1:ceee5a608e7c | 28 | m_singleton = s; |
alexpirciu | 1:ceee5a608e7c | 29 | } |
alexpirciu | 1:ceee5a608e7c | 30 | |
alexpirciu | 1:ceee5a608e7c | 31 | /** |
alexpirciu | 1:ceee5a608e7c | 32 | * @brief Destroy the cQuadratureencoder tim4::cQuadratureencoder tim4 destroyer::cQuadratureencoder tim4 destroyer object |
alexpirciu | 1:ceee5a608e7c | 33 | * |
alexpirciu | 1:ceee5a608e7c | 34 | */ |
alexpirciu | 1:ceee5a608e7c | 35 | CQuadratureEncoder_TIM4::CQuadratureEncoder_TIM4_Destroyer::~CQuadratureEncoder_TIM4_Destroyer(){ |
alexpirciu | 1:ceee5a608e7c | 36 | delete m_singleton; |
alexpirciu | 1:ceee5a608e7c | 37 | } |
alexpirciu | 1:ceee5a608e7c | 38 | |
alexpirciu | 1:ceee5a608e7c | 39 | |
alexpirciu | 1:ceee5a608e7c | 40 | /** |
alexpirciu | 1:ceee5a608e7c | 41 | * @brief Constructor function. It verifies the existance of the singleton object and creates it. |
alexpirciu | 1:ceee5a608e7c | 42 | * |
alexpirciu | 1:ceee5a608e7c | 43 | * @return The address of the singleton object |
alexpirciu | 1:ceee5a608e7c | 44 | */ |
alexpirciu | 1:ceee5a608e7c | 45 | CQuadratureEncoder_TIM4* CQuadratureEncoder_TIM4::Instance(){ |
alexpirciu | 1:ceee5a608e7c | 46 | if(!CQuadratureEncoder_TIM4::m_instance){ |
alexpirciu | 1:ceee5a608e7c | 47 | CQuadratureEncoder_TIM4::m_instance = new CQuadratureEncoder_TIM4; |
alexpirciu | 1:ceee5a608e7c | 48 | m_instance->initialize(); |
alexpirciu | 1:ceee5a608e7c | 49 | CQuadratureEncoder_TIM4::m_destroyer.SetSingleton(m_instance); |
alexpirciu | 1:ceee5a608e7c | 50 | } |
alexpirciu | 1:ceee5a608e7c | 51 | return CQuadratureEncoder_TIM4::m_instance; |
alexpirciu | 1:ceee5a608e7c | 52 | } |
alexpirciu | 1:ceee5a608e7c | 53 | |
alexpirciu | 1:ceee5a608e7c | 54 | |
alexpirciu | 1:ceee5a608e7c | 55 | /** |
alexpirciu | 1:ceee5a608e7c | 56 | * @brief Initialize the parameter of the object. |
alexpirciu | 1:ceee5a608e7c | 57 | * |
alexpirciu | 1:ceee5a608e7c | 58 | */ |
alexpirciu | 1:ceee5a608e7c | 59 | void CQuadratureEncoder_TIM4::initialize(){ |
alexpirciu | 1:ceee5a608e7c | 60 | //PB6 PB7 aka D10 MORPHO_PB7 |
alexpirciu | 1:ceee5a608e7c | 61 | // Enable clock for GPIOA |
alexpirciu | 1:ceee5a608e7c | 62 | RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; |
alexpirciu | 1:ceee5a608e7c | 63 | |
alexpirciu | 1:ceee5a608e7c | 64 | //stm32f4xx.h |
alexpirciu | 1:ceee5a608e7c | 65 | GPIOB->MODER |= GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1; //PB6 & PB7 as Alternate Function /*!< GPIO port mode register, Address offset: 0x00 */ |
alexpirciu | 1:ceee5a608e7c | 66 | GPIOB->OTYPER |= GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7; //PB6 & PB7 as Inputs /*!< GPIO port output type register, Address offset: 0x04 */ |
alexpirciu | 1:ceee5a608e7c | 67 | GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6 | GPIO_OSPEEDER_OSPEEDR7; //Low speed /*!< GPIO port output speed register, Address offset: 0x08 */ |
alexpirciu | 1:ceee5a608e7c | 68 | GPIOB->PUPDR |= GPIO_PUPDR_PUPDR6_1 | GPIO_PUPDR_PUPDR7_1; //Pull Down /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ |
alexpirciu | 1:ceee5a608e7c | 69 | GPIOB->AFR[0] |= 0x22000000; //AF02 for PB6 & PB7 /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ |
alexpirciu | 1:ceee5a608e7c | 70 | GPIOB->AFR[1] |= 0x00000000; //nibbles here refer to gpio8..15 /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ |
alexpirciu | 1:ceee5a608e7c | 71 | |
alexpirciu | 1:ceee5a608e7c | 72 | // configure TIM4 as Encoder input |
alexpirciu | 1:ceee5a608e7c | 73 | // Enable clock for TIM4 |
alexpirciu | 1:ceee5a608e7c | 74 | // __TIM4_CLK_ENABLE(); |
alexpirciu | 1:ceee5a608e7c | 75 | RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; |
alexpirciu | 1:ceee5a608e7c | 76 | |
alexpirciu | 1:ceee5a608e7c | 77 | TIM4->CR1 = 0x0001; // CEN(Counter ENable)='1' < TIM control register 1 |
alexpirciu | 1:ceee5a608e7c | 78 | TIM4->SMCR = TIM_ENCODERMODE_TI12; // < TIM slave mode control register |
alexpirciu | 1:ceee5a608e7c | 79 | //TIM_ENCODERMODE_TI1 input 1 edges trigger count |
alexpirciu | 1:ceee5a608e7c | 80 | //TIM_ENCODERMODE_TI2 input 2 edges trigger count |
alexpirciu | 1:ceee5a608e7c | 81 | //TIM_ENCODERMODE_TI12 all edges trigger count |
alexpirciu | 1:ceee5a608e7c | 82 | TIM4->CCMR1 = 0xF1F1; // CC1S='01' CC2S='01' < TIM capture/compare mode register 1 |
alexpirciu | 1:ceee5a608e7c | 83 | //0xF nibble sets up filter |
alexpirciu | 1:ceee5a608e7c | 84 | TIM4->CCMR2 = 0x0000; // < TIM capture/compare mode register 2 |
alexpirciu | 1:ceee5a608e7c | 85 | TIM4->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E; // < TIM capture/compare enable register |
alexpirciu | 1:ceee5a608e7c | 86 | TIM4->PSC = 0x0000; // Prescaler = (0+1) < TIM prescaler |
alexpirciu | 1:ceee5a608e7c | 87 | TIM4->ARR = 0xffff; // reload at 0xfffffff < TIM auto-reload register |
alexpirciu | 1:ceee5a608e7c | 88 | |
alexpirciu | 1:ceee5a608e7c | 89 | TIM4->CNT = 0x0000; //reset the counter before we use it |
alexpirciu | 1:ceee5a608e7c | 90 | } |
alexpirciu | 1:ceee5a608e7c | 91 | /** |
alexpirciu | 1:ceee5a608e7c | 92 | * @brief Get the position of encoder. |
alexpirciu | 1:ceee5a608e7c | 93 | * |
alexpirciu | 1:ceee5a608e7c | 94 | */ |
alexpirciu | 1:ceee5a608e7c | 95 | int16_t CQuadratureEncoder_TIM4::getCount(){ |
alexpirciu | 1:ceee5a608e7c | 96 | if(m_instance){ |
alexpirciu | 1:ceee5a608e7c | 97 | return TIM4->CNT; |
alexpirciu | 1:ceee5a608e7c | 98 | } |
alexpirciu | 1:ceee5a608e7c | 99 | return 0xffff; |
alexpirciu | 1:ceee5a608e7c | 100 | } |
alexpirciu | 1:ceee5a608e7c | 101 | /** |
alexpirciu | 1:ceee5a608e7c | 102 | * @brief Reset the value of the counter to zero value. |
alexpirciu | 1:ceee5a608e7c | 103 | */ |
alexpirciu | 1:ceee5a608e7c | 104 | void CQuadratureEncoder_TIM4::reset(){ |
alexpirciu | 1:ceee5a608e7c | 105 | if(m_instance){ |
alexpirciu | 1:ceee5a608e7c | 106 | TIM4->CNT = 0; |
alexpirciu | 1:ceee5a608e7c | 107 | } |
alexpirciu | 1:ceee5a608e7c | 108 | } |
alexpirciu | 1:ceee5a608e7c | 109 | |
alexpirciu | 1:ceee5a608e7c | 110 | |
alexpirciu | 1:ceee5a608e7c | 111 | }; // namespace drivers |