-
Revision 0:1c05321d03a4, committed 2019-04-10
- Comitter:
- calmantara186
- Date:
- Wed Apr 10 19:48:18 2019 +0000
- Commit message:
- external encoder;
Changed in this revision
--- /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