基礎了解
時鍾選擇計數器時鍾可由下列時鍾源提供:
● 內部時鍾(CK_INT)
● 外部時鍾模式1:外部輸入腳(TIx)
● 外部時鍾模式2:外部觸發輸入(ETR)
● 內部觸發輸入(ITRx):使用一個定時器作為另一個定時器的預分頻器
在平常使用中我們系統復位 000 默認使用內部時鍾源
外部時鍾源1
來自定時器自身輸入通道1或通道2的輸入信號,經過極性選擇和濾波以后生成的觸發信號,連接到從模式控制器,進而控制計數器的工作;
來自通道1的輸入信號經過上升沿、下降沿雙沿檢測而生成的脈沖信號進行邏輯相或以后的信號就是TI1F_ED信號,即TI1F_ED雙沿脈沖信號。
//SIGNAL_COUNT(GPIO) #define SIGNAL_COUNT_ENA_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //PB0 #define SIGNAL_COUNT_ENA_GPIO_Port (GPIOB) #define SIGNAL_COUNT_ENA_Pin (GPIO_PIN_0) #define SIGNAL_COUNT_DIR_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() //PA7 #define SIGNAL_COUNT_DIR_GPIO_Port (GPIOA) #define SIGNAL_COUNT_DIR_Pin (GPIO_PIN_7) #define SIGNAL_COUNT_DIR_Get_IRQn (EXTI9_5_IRQn) //EXTI7中斷 //SIGNAL_COUNT(AFIO & TIM) #define SIGNAL_COUNT_PUL_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() //PA6 #define SIGNAL_COUNT_PUL_GPIO_Port (GPIOA) #define SIGNAL_COUNT_PUL_Pin (GPIO_PIN_6) #define SIGNAL_COUNT_TIM_CLK_ENABLE() __HAL_RCC_TIM3_CLK_ENABLE() //TIM3 #define SIGNAL_COUNT_Get_TIM (TIM3) #define SIGNAL_COUNT_Get_HTIM (htim3) //GPIO輸入 #define SIGNAL_COUNT_READ_DIR_IO() (SIGNAL_DIR_GPIO_Port -> IDR & SIGNAL_DIR_Pin) #define SIGNAL_COUNT_READ_ENA_IO() (SIGNAL_ENA_GPIO_Port -> IDR & SIGNAL_ENA_Pin) //TIM輸入 #define SIGNAL_COUNT_READ_COUNT() (SIGNAL_COUNT_Get_TIM -> CNT) //TIM輸出 #define SIGNAL_COUNT_UP() (SIGNAL_COUNT_Get_TIM -> CR1 &= ~(TIM_CR1_DIR)) #define SIGNAL_COUNT_DOWN() (SIGNAL_COUNT_Get_TIM -> CR1 |= (TIM_CR1_DIR)) /** * @brief TIM_SIGNAL_PUL初始化 * @param NULL * @retval NULL **/ void REIN_TIM_SIGNAL_COUNT_Init(void) { /* GPIO初始化 */ GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable*/ SIGNAL_COUNT_PUL_CLK_ENABLE(); //啟用SIGNAL_COUNT_PUL端口時鍾 /*Configure GPIO pin*/ GPIO_InitStruct.Pin = SIGNAL_COUNT_PUL_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //輸入模式 GPIO_InitStruct.Pull = GPIO_NOPULL; //禁用上下拉 HAL_GPIO_Init(SIGNAL_COUNT_PUL_GPIO_Port, &GPIO_InitStruct); /* TIM初始化 */ TIM_SlaveConfigTypeDef sSlaveConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; SIGNAL_COUNT_TIM_CLK_ENABLE(); //啟用TIM時鍾 SIGNAL_COUNT_Get_HTIM.Instance = SIGNAL_COUNT_Get_TIM; SIGNAL_COUNT_Get_HTIM.Init.Prescaler = 0; //預分頻:0 SIGNAL_COUNT_Get_HTIM.Init.CounterMode = TIM_COUNTERMODE_UP; //向上計數 SIGNAL_COUNT_Get_HTIM.Init.Period = 65535; //16位周期 SIGNAL_COUNT_Get_HTIM.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //不分頻 SIGNAL_COUNT_Get_HTIM.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //禁用自動重新加載 if (HAL_TIM_Base_Init(&SIGNAL_COUNT_Get_HTIM) != HAL_OK) { Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; //外部時鍾模式 sSlaveConfig.InputTrigger = TIM_TS_TI1FP1; //TI1FP1 sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING; //上升沿觸發 sSlaveConfig.TriggerFilter = 4; //濾波參數(FDIV2_N6) if (HAL_TIM_SlaveConfigSynchro(&SIGNAL_COUNT_Get_HTIM, &sSlaveConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; //主機模式觸發復位 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; //禁用主機模式 if (HAL_TIMEx_MasterConfigSynchronization(&SIGNAL_COUNT_Get_HTIM, &sMasterConfig) != HAL_OK) { Error_Handler(); } /*begin work*/ HAL_TIM_Base_Start(&SIGNAL_COUNT_Get_HTIM); } static void Signal_Count_Capture_Goal(void) {//SignalPort獲取目標 //讀取En_Pin if(SIGNAL_COUNT_READ_ENA_IO()) { if(sg_cut.en_inve) sg_cut.en_valid = true; else sg_cut.en_valid = false; } else { if(sg_cut.en_inve) sg_cut.en_valid = false; else sg_cut.en_valid = true; } //采樣(對比上次的計數值) sg_cut.sampling_count_last = sg_cut.sampling_count; sg_cut.sampling_count = SIGNAL_COUNT_READ_COUNT(); sg_cut.sampling_count_sub = sg_cut.sampling_count - sg_cut.sampling_count_last; //采樣(緩沖輸出) //(采樣數/細分數)*Move_Divide_NUM = 電機輸出步數 sg_cut.interp_out = sg_cut.sampling_count_sub * sg_cut.subdivide_form; //輸出 if(sg_cut.en_valid) { signal_moreio.goal_location = sg_cut.interp_out; //Count模式借用目標位置存放目標位置增量 signal_moreio.goal_disable = false; signal_moreio.goal_brake = false; } else { signal_moreio.goal_location = 0; //Count模式借用目標位置存放目標位置增量 signal_moreio.goal_disable = true; signal_moreio.goal_brake = false; } }