-

Files at this revision

API Documentation at this revision

Comitter:
calmantara186
Date:
Wed Apr 10 19:48:18 2019 +0000
Commit message:
external encoder;

Changed in this revision

EncoderInit.cpp Show annotated file Show diff for this revision Revisions of this file
EncoderMspInitF4.cpp Show annotated file Show diff for this revision Revisions of this file
encoderHAL.cpp Show annotated file Show diff for this revision Revisions of this file
encoderHAL.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EncoderInit.cpp	Wed Apr 10 19:48:18 2019 +0000
@@ -0,0 +1,36 @@
+#include "mbed.h"
+
+void EncoderInit(TIM_Encoder_InitTypeDef * encoder, TIM_HandleTypeDef * timer, TIM_TypeDef * TIMx, uint32_t maxcount, uint32_t encmode)
+{
+
+    timer->Instance = TIMx;
+    timer->Init.Period = maxcount;
+    timer->Init.CounterMode = TIM_COUNTERMODE_UP;
+    timer->Init.Prescaler = 0;
+    timer->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+
+    encoder->EncoderMode = encmode;
+
+    encoder->IC1Filter = 0x0F;
+    encoder->IC1Polarity = TIM_INPUTCHANNELPOLARITY_RISING;
+    encoder->IC1Prescaler = TIM_ICPSC_DIV4;
+    encoder->IC1Selection = TIM_ICSELECTION_DIRECTTI;
+
+    encoder->IC2Filter = 0x0F;
+    encoder->IC2Polarity = TIM_INPUTCHANNELPOLARITY_FALLING;
+    encoder->IC2Prescaler = TIM_ICPSC_DIV4;
+    encoder->IC2Selection = TIM_ICSELECTION_DIRECTTI;
+
+
+    if (HAL_TIM_Encoder_Init(timer, encoder) != HAL_OK) {
+        printf("Couldn't Init Encoder\r\n");
+        while (1) {}
+    }
+
+    if(HAL_TIM_Encoder_Start(timer,TIM_CHANNEL_1)!=HAL_OK) {
+        printf("Couldn't Start Encoder\r\n");
+        while (1) {}
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EncoderMspInitF4.cpp	Wed Apr 10 19:48:18 2019 +0000
@@ -0,0 +1,96 @@
+#include "mbed.h"
+/*
+ * HAL_TIM_Encoder_MspInit()
+ * Overrides the __weak function stub in stm32f4xx_hal_tim.h
+ *
+ * Edit the below for your preferred pin wiring & pullup/down
+ * I have encoder common at 3V3, using GPIO_PULLDOWN on inputs.
+ * Encoder A&B outputs connected directly to GPIOs.
+ *
+ * www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00102166.pdf
+ * www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00141306.pdf
+ *
+ * TIM1_CH1: AF1 @ PA_8, PE_9 
+ * TIM1_CH2: AF1 @ PA_9, PE_11 
+ *
+ * TIM2_CH1: AF1 @ PA_0, PA_5, PA_15, PB_8*     *F446 only
+ * TIM2_CH2: AF1 @ PA_1, PB_3, PB_9*            *F446 only
+ *
+ * TIM3_CH1: AF2 @ PA_6, PB_4, PC_6
+ * TIM3_CH2: AF2 @ PA_7, PB_5, PC_7
+ *
+ * TIM4_CH1: AF2 @ PB_6, PD_12
+ * TIM4_CH2: AF2 @ PB_7, PD_13
+ *
+ * TIM5_CH1: AF2 @ PA_0*    *TIM5 used by mbed system ticker so unavailable
+ * TIM5_CH2: AF2 @ PA_1*
+ *
+ * TIM8_CH1: AF3 @ PC_6
+ * TIM8_CH2: AF3 @ PC_7 
+ */
+
+#ifdef TARGET_STM32F4
+void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
+{
+    GPIO_InitTypeDef GPIO_InitStruct;
+
+    if (htim->Instance == TIM1) { //PA8 PA9 = Nucleo D7 D8
+        __TIM1_CLK_ENABLE();
+        __GPIOA_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
+        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM2) { //PA0 PA1 = Nucleo A0 A1 //USANDO ALTERNO PB8 Y PB 9 para el pololulu funcione
+        __TIM2_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM3) { //PB4 PB5 = Nucleo D5 D4
+        __TIM3_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+    else if (htim->Instance == TIM4) { // PB6 PB7 = Nucleo D10 MORPHO_PB7
+        __TIM4_CLK_ENABLE();
+        __GPIOB_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_6;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
+        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+    }
+     
+          
+     else if (htim->Instance == TIM8) { // PC7 PC8 =  D9  PC6
+        __TIM8_CLK_ENABLE();
+        __GPIOC_CLK_ENABLE();
+        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+        GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
+        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+    }    
+    
+    
+    
+    
+    
+    
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/encoderHAL.cpp	Wed Apr 10 19:48:18 2019 +0000
@@ -0,0 +1,112 @@
+#include "encoderHAL.h"
+
+namespace mbed
+{   
+
+    encoderHAL::encoderHAL(TIM_TypeDef * _TIM)
+    {
+        TIM = _TIM;
+        // Initialisation of the TIM module as an encoder counter
+        EncoderInit(&encoder, &timer, _TIM, 0xffff, TIM_ENCODERMODE_TI12);
+
+        // Update (aka over- and underflow) interrupt enabled
+        TIM->DIER |= 0x0001;
+        // The initialisation process generates an update interrupt, so we'll have to clear the update flag before anything else
+        TIM->SR &= 0xfffe;
+        //generate update event
+        TIM->EGR = 1;
+        //enable counter
+        TIM->CR1 = 1;
+        
+    }
+    
+    encoderHAL::encoderHAL(TIM_TypeDef * _TIM, uint32_t _maxcount, uint32_t _encmode)
+    {
+        TIM = _TIM;
+        // Initialisation of the TIM module as an encoder counter
+        EncoderInit(&encoder, &timer, _TIM, _maxcount, _encmode);
+
+        // Update (aka over- and underflow) interrupt enabled
+        TIM->DIER |= 0x0001;
+        // The initialisation process generates an update interrupt, so we'll have to clear the update flag before anything else
+        TIM->SR &= 0xfffe;
+    }
+    
+    encoderHAL::encoderHAL(TIM_Encoder_InitTypeDef * _encoder, TIM_HandleTypeDef * _timer, TIM_TypeDef * _TIM, uint32_t _maxcount, uint32_t _encmode)
+    {
+        timer = *_timer;
+        encoder = *_encoder;
+        TIM = _TIM;
+        // Initialisation of the TIM module as an encoder counter
+        EncoderInit(&encoder, &timer, _TIM, _maxcount, _encmode);
+
+        // Update (aka over- and underflow) interrupt enabled
+        TIM->DIER |= 0x0001;
+        // The initialisation process generates an update interrupt, so we'll have to clear the update flag before anything else
+        TIM->SR &= 0xfffe;
+    }
+
+    
+    int32_t encoderHAL::getPulses(bool reset)
+    {
+        int16_t count = TIM->CNT;
+        if(reset){
+            switch((uint32_t)TIM){
+                case TIM1_BASE :
+                    TIM1->CNT = 0;
+                break;
+                
+                case TIM2_BASE :
+                    TIM2->CNT = 0;
+                break;
+                
+                case TIM3_BASE :
+                    TIM3->CNT = 0;
+                break;
+                
+                case TIM4_BASE :
+                    TIM4->CNT = 0;
+                break;
+                
+                case TIM5_BASE :
+                    TIM5->CNT = 0;
+                break;
+                
+                case TIM8_BASE :
+                    TIM8->CNT = 0;
+                break;
+            }
+        }
+        else{
+            switch((uint32_t)TIM)
+            {
+                case TIM1_BASE :
+                    return (int32_t)count;
+                
+                case TIM2_BASE :
+                    return (int32_t)count;
+                
+                case TIM3_BASE :
+                    return (int32_t)count;
+                
+                case TIM4_BASE :
+                    return (int32_t)count;
+                
+                case TIM5_BASE :
+                    return (int32_t)count;
+                    
+                case TIM8_BASE :
+                    return (int32_t)count;
+            }
+        }
+        
+        return (int32_t)count;
+    }
+    
+    
+    TIM_HandleTypeDef* encoderHAL::GetTimer()
+    {
+        return &timer;    
+    }
+    
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/encoderHAL.h	Wed Apr 10 19:48:18 2019 +0000
@@ -0,0 +1,30 @@
+#ifndef ENCODER_H
+#define ENCODER_H
+#include "mbed.h"
+
+void EncoderInit(TIM_Encoder_InitTypeDef * encoder, TIM_HandleTypeDef * timer, TIM_TypeDef * TIMx, uint32_t maxcount, uint32_t encmode);
+
+namespace mbed{
+    
+    class encoderHAL {
+        
+        public :
+            encoderHAL(TIM_TypeDef * _TIM);
+            encoderHAL(TIM_TypeDef * _TIM, uint32_t _maxcount, uint32_t _encmode);
+            encoderHAL(TIM_Encoder_InitTypeDef * _encoder, TIM_HandleTypeDef * _timer, TIM_TypeDef * _TIM, uint32_t _maxcount, uint32_t _encmode);
+            int32_t getPulses(bool reset);
+            TIM_HandleTypeDef* GetTimer();
+        
+        private :
+        
+        
+        protected :
+            TIM_Encoder_InitTypeDef encoder;
+            TIM_HandleTypeDef timer;
+            TIM_TypeDef * TIM;
+        
+    };
+
+}// namespace mbed
+
+#endif
\ No newline at end of file