void encoder_init_as5047p_spi(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; palSetPadMode(SPI_SW_MISO_GPIO, SPI_SW_MISO_PIN, PAL_MODE_INPUT); palSetPadMode(SPI_SW_SCK_GPIO, SPI_SW_SCK_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); palSetPadMode(SPI_SW_CS_GPIO, SPI_SW_CS_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); // Set MOSI to 1 #if AS5047_USE_HW_SPI_PINS palSetPadMode(SPI_SW_MOSI_GPIO, SPI_SW_MOSI_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); palSetPad(SPI_SW_MOSI_GPIO, SPI_SW_MOSI_PIN); #endif // Enable timer clock HW_ENC_TIM_CLK_EN(); // Time Base configuration TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = ((168000000 / 2 / AS5047_SAMPLE_RATE_HZ) - 1); TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(HW_ENC_TIM, &TIM_TimeBaseStructure); // Enable overflow interrupt TIM_ITConfig(HW_ENC_TIM, TIM_IT_Update, ENABLE); // Enable timer TIM_Cmd(HW_ENC_TIM, ENABLE); nvicEnableVector(HW_ENC_TIM_ISR_CH, 6); mode = ENCODER_MODE_AS5047P_SPI; index_found = true; }
void encoder_init_ad2s1205_spi(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; palSetPadMode(SPI_SW_MISO_GPIO, SPI_SW_MISO_PIN, PAL_MODE_INPUT); palSetPadMode(SPI_SW_SCK_GPIO, SPI_SW_SCK_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); palSetPadMode(SPI_SW_CS_GPIO, SPI_SW_CS_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); // Set MOSI to 1 #if AS5047_USE_HW_SPI_PINS palSetPadMode(SPI_SW_MOSI_GPIO, SPI_SW_MOSI_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); palSetPad(SPI_SW_MOSI_GPIO, SPI_SW_MOSI_PIN); #endif // TODO: Choose pins on comm port when these are not defined #if defined(AD2S1205_SAMPLE_GPIO) && defined(AD2S1205_RDVEL_GPIO) palSetPadMode(AD2S1205_SAMPLE_GPIO, AD2S1205_SAMPLE_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); palSetPadMode(AD2S1205_RDVEL_GPIO, AD2S1205_RDVEL_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); palSetPad(AD2S1205_SAMPLE_GPIO, AD2S1205_SAMPLE_PIN); // Prepare for a falling edge SAMPLE assertion palSetPad(AD2S1205_RDVEL_GPIO, AD2S1205_RDVEL_PIN); // Will always read position #endif // Enable timer clock HW_ENC_TIM_CLK_EN(); // Time Base configuration TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = ((168000000 / 2 / AD2S1205_SAMPLE_RATE_HZ) - 1); TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(HW_ENC_TIM, &TIM_TimeBaseStructure); // Enable overflow interrupt TIM_ITConfig(HW_ENC_TIM, TIM_IT_Update, ENABLE); // Enable timer TIM_Cmd(HW_ENC_TIM, ENABLE); nvicEnableVector(HW_ENC_TIM_ISR_CH, 6); mode = RESOLVER_MODE_AD2S1205; index_found = true; }
void encoder_init_abi(uint32_t counts) { EXTI_InitTypeDef EXTI_InitStructure; // Initialize variables index_found = false; enc_counts = counts; palSetPadMode(HW_HALL_ENC_GPIO1, HW_HALL_ENC_PIN1, PAL_MODE_ALTERNATE(HW_ENC_TIM_AF)); palSetPadMode(HW_HALL_ENC_GPIO2, HW_HALL_ENC_PIN2, PAL_MODE_ALTERNATE(HW_ENC_TIM_AF)); // palSetPadMode(HW_HALL_ENC_GPIO3, HW_HALL_ENC_PIN3, PAL_MODE_ALTERNATE(HW_ENC_TIM_AF)); // Enable timer clock HW_ENC_TIM_CLK_EN(); // Enable SYSCFG clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); TIM_EncoderInterfaceConfig (HW_ENC_TIM, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_SetAutoreload(HW_ENC_TIM, enc_counts - 1); // Filter HW_ENC_TIM->CCMR1 |= 6 << 12 | 6 << 4; HW_ENC_TIM->CCMR2 |= 6 << 4; TIM_Cmd(HW_ENC_TIM, ENABLE); // Interrupt on index pulse // Connect EXTI Line to pin SYSCFG_EXTILineConfig(HW_ENC_EXTI_PORTSRC, HW_ENC_EXTI_PINSRC); // Configure EXTI Line EXTI_InitStructure.EXTI_Line = HW_ENC_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // Enable and set EXTI Line Interrupt to the highest priority nvicEnableVector(HW_ENC_EXTI_CH, 0); mode = ENCODER_MODE_ABI; }