stm32外部時鍾模式1


基礎了解

時鍾選擇計數器時鍾可由下列時鍾源提供:

● 內部時鍾(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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM