a

Dependencies:   mbed mbed-rtos

Committer:
alexpirciu
Date:
Thu Mar 28 07:44:42 2019 +0000
Revision:
1:ceee5a608e7c
assa

Who changed what in which revision?

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