首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32定时器无法捕获脉宽调制输入

STM32定时器无法捕获脉宽调制输入
EN

Stack Overflow用户
提问于 2021-02-04 09:23:12
回答 1查看 460关注 0票数 0

我的板: pwm 32 H743配置先进的定时器来捕获pwm输入,我可以得到pwm频率。但是,如果我在

主要功能,不能得到,为什么?我在插话中添加了led,现在引导不开,意思是,可以进入回叫function.show我的代码:

主要:

代码语言:javascript
复制
    HAL_Init();
    SystemClock_Config();
    TIMx_Configuration(); 
    TIM8_Configuration();

配置部分:

tim2只允许在回调函数中切换1s

代码语言:javascript
复制
    void TIMx_Configuration(void)
    {
        //TIMx_GPIO_Config();
        HAL_NVIC_SetPriority(GENERAL_TIM_IRQn, 0, 1);
        HAL_NVIC_EnableIRQ(GENERAL_TIM_IRQn);
        GENERAL_TIM_CLK_ENABLE();
         
        TIM_TimeBaseStructure.Instance = GENERAL_TIM;
    
        TIM_TimeBaseStructure.Init.Period = 10000 - 1;
    
        TIM_TimeBaseStructure.Init.Prescaler =  240000 - 1;
    
        HAL_TIM_Base_Init(&TIM_TimeBaseStructure);
    
        HAL_TIM_Base_Start_IT(&TIM_TimeBaseStructure);
    }
    void TIM8_Configuration()
    {
        //set priority 
        HAL_NVIC_SetPriority(MOTORIC_TIM_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(MOTORIC_TIM_IRQn);
        TIM_IC_InitTypeDef      TIM_ICInitStructure;
        TIM_SlaveConfigTypeDef  TIM_SlaveConfigStructure; 
        MOTORIC_TIM_CLK_ENABLE(); 
    
        motoric_htimx_bldcm.Instance = MOTORIC_TIM;
        motoric_htimx_bldcm.Init.Period = 100;

// TIMxCLK = HCLK=240MHz // timer frequency=TIMxCLK/(TIM\_Prescaler+1)=1MHz

代码语言:javascript
复制
        motoric_htimx_bldcm.Init.Prescaler = MOTOR_ICPWM_PRESCALER_COUNT - 1;   
    
        motoric_htimx_bldcm.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
        motoric_htimx_bldcm.Init.CounterMode=TIM_COUNTERMODE_UP;

//motoric_htimx_bldcm.Init.RepetitionCounter=0;

代码语言:javascript
复制
        HAL_TIM_IC_Init(&motoric_htimx_bldcm);

  • 配置计时器ic模式*

代码语言:javascript
复制
        TIM_ICInitStructure.ICPolarity = TIM_ICPOLARITY_RISING;
        TIM_ICInitStructure.ICSelection = TIM_ICSELECTION_DIRECTTI;
        TIM_ICInitStructure.ICPrescaler = TIM_ICPSC_DIV1;
        TIM_ICInitStructure.ICFilter = 0x0;
        HAL_TIM_IC_ConfigChannel(&motoric_htimx_bldcm,&TIM_ICInitStructure,TIM_CHANNEL_1);
        HAL_TIM_IC_ConfigChannel(&motoric_htimx_bldcm,&TIM_ICInitStructure,TIM_CHANNEL_2);
        HAL_TIM_IC_ConfigChannel(&motoric_htimx_bldcm,&TIM_ICInitStructure,TIM_CHANNEL_3);
        HAL_TIM_IC_ConfigChannel(&motoric_htimx_bldcm,&TIM_ICInitStructure,TIM_CHANNEL_4);
        
        TIM_SlaveConfigStructure.SlaveMode = TIM_SLAVEMODE_RESET;
        TIM_SlaveConfigStructure.InputTrigger = TIM_TS_TI1FP1;
        HAL_TIM_SlaveConfigSynchronization(&motoric_htimx_bldcm,&TIM_SlaveConfigStructure);

//4通道捕获每个通道使用it模式,输入频率约为1.5khz

代码语言:javascript
复制
        HAL_TIM_IC_Start_IT(&motoric_htimx_bldcm,TIM_CHANNEL_1);
        HAL_TIM_IC_Start_IT(&motoric_htimx_bldcm,TIM_CHANNEL_2);
        HAL_TIM_IC_Start_IT(&motoric_htimx_bldcm,TIM_CHANNEL_3);
        HAL_TIM_IC_Start_IT(&motoric_htimx_bldcm,TIM_CHANNEL_4);
    }

刚刚带队,显示中断没问题

代码语言:javascript
复制
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if(htim->Instance == GENERAL_TIM)
        {
            LED1_TOGGLE;
        }
    }
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {

//获取捕获值

代码语言:javascript
复制
      if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
      {
          LED1_TOGGLE;
          IC1Value = HAL_TIM_ReadCapturedValue(&motoric_htimx_bldcm,TIM_CHANNEL_1);
          IC2Value = HAL_TIM_ReadCapturedValue(&motoric_htimx_bldcm,TIM_CHANNEL_2); 
          if (IC1Value != 0)
          {

//计数频率

代码语言:javascript
复制
            DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);
            Frequency = 240000000/24000/(float)(IC1Value+1);
          }
          else
          {

,如果没有,则为零

代码语言:javascript
复制
            DutyCycle = 0;
            Frequency = 0;
          }
    
      }
    }
EN

回答 1

Stack Overflow用户

发布于 2021-02-05 06:22:50

最后,这个问题得到了解决。这与hal_init()无关,原因是:我的脉宽调制捕获配置配置为从模式,需要更改为主模式.like,这是:

代码语言:javascript
复制
TIM_MasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
TIM_MasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&motoric_htimx_bldcm, &TIM_MasterConfig);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66042701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档