fdsaf
Diff: hallsensor_hardware_decoder.h
- Revision:
- 0:0532a6e10a23
diff -r 000000000000 -r 0532a6e10a23 hallsensor_hardware_decoder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hallsensor_hardware_decoder.h Wed Mar 13 06:22:03 2019 +0000 @@ -0,0 +1,98 @@ +#ifndef _HALLSENSOR_HARDWARE_DECODER_H +#define _HALLSENSOR_HARDWARE_DECODER_H + + + +#include "mbed.h" + +// Hardware Quadrature Encoder ABZ for Nucleo F401RE +// Output on debug port to host PC @ 9600 baud + + +/* Connections + PA_0 = Encoder A + PA_1 = Encoder B + PA_4 = Encoder Z +*/ + +InterruptIn ZPulse(PA_4) ; // Setup Interrupt for Z Pulse + + +void EncoderInitialise(void) +{ + // configure GPIO PA0 & PA1 as inputs for Encoder + RCC->AHB1ENR |= 0x00000001; // Enable clock for GPIOA + + GPIOA->MODER |= 0x0000000A;//GPIO_MODER_MODER0_1 | GPIO_MODER_MODER1_1 ; //PA0 & PA1 as Alternate Function /*!< GPIO port mode register, Address offset: 0x00 */ + GPIOA->OTYPER |= 0x00000003;//GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_1 ; //PA0 & PA1 as Inputs /*!< GPIO port output type register, Address offset: 0x04 */ + GPIOA->OSPEEDR |= 0x0000000F;//high speed //GPIO_OSPEEDER_OSPEEDR0 | GPIO_OSPEEDER_OSPEEDR1 ; // Low speed /*!< GPIO port output speed register, Address offset: 0x08 */ + GPIOA->PUPDR |= 0x00000005;//pull high //GPIO_PUPDR_PUPDR0_1 | GPIO_PUPDR_PUPDR1_1 ; // Pull Down /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + GPIOA->AFR[0] |= 0x00000011 ; // AF01 for PA0 & PA1 /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ + GPIOA->AFR[1] |= 0x00000000 ; // /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ + + // configure TIM2 as Encoder input + RCC->APB1ENR |= 0x00000001; // Enable clock for TIM2 + + TIM2->CR1 = 0x0001; // CEN(Counter ENable)='1' < TIM control register 1 + TIM2->SMCR = 0x0003; // SMS='011' (Encoder mode 3) < TIM slave mode control register + TIM2->CCMR1 = 0xF1F1; // CC1S='01' CC2S='01' < TIM capture/compare mode register 1 + TIM2->CCMR2 = 0x0000; // < TIM capture/compare mode register 2 + TIM2->CCER = 0x0011; // CC1P CC2P < TIM capture/compare enable register + TIM2->PSC = 0x0000; // Prescaler = (0+1) < TIM prescaler + TIM2->ARR = 0xffffffff; // reload at 0xfffffff < TIM auto-reload register + + TIM2->CNT = 0x0000; //reset the counter before we use it +} + +void EncoderInitialise_HAL(void) +{ + + + // init structure + TIM_HandleTypeDef htim2; + TIM_Encoder_InitTypeDef sConfig; + TIM_MasterConfigTypeDef sMasterConfig; + GPIO_InitTypeDef GPIO_InitStruct; + // timer GPIO setup + __HAL_RCC_GPIOA_CLK_ENABLE(); + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;//pin num PA "0" + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; //timer + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //port P"A"0 + // basic timer setup + __HAL_RCC_TIM2_CLK_ENABLE(); + htim2.Instance = TIM2; //timer + htim2.Init.Prescaler = 0; + htim2.Init.CounterMode = TIM_COUNTERMODE_UP; + htim2.Init.Period = 0x000fffff; + htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + //encoder mode setup + sConfig.EncoderMode = TIM_ENCODERMODE_TI12; + sConfig.IC1Polarity = TIM_ICPOLARITY_FALLING; + sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; + sConfig.IC1Prescaler = TIM_ICPSC_DIV1; + sConfig.IC1Filter = 2; + sConfig.IC2Polarity = TIM_ICPOLARITY_RISING; + sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; + sConfig.IC2Prescaler = TIM_ICPSC_DIV1; + sConfig.IC2Filter = 2; + HAL_TIM_Encoder_Init(&htim2, &sConfig); + // timer mode setup + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); + // timer start + HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL); + +} + +// Z Pulse routine +void ZeroEncoderCount() +{ + TIM2->CNT=0 ; //reset count to zero +} + + +#endif \ No newline at end of file