打印
[STM32]

关于多个定时器同时使用

[复制链接]
915|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jing880311|  楼主 | 2019-12-20 17:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jing880311 于 2019-12-20 17:47 编辑

现在是用了两个定时器
TIM5用来发脉冲
TIM3是1ms的定时,每隔1ms去修改TIM5的ARR值,感觉设置的都正确,但是实际测试发的脉冲个数不对,请问是什么原因呢?
TIM3的初始化
void MX_TIM3_Init(void)     // 1ms
{
    TIM_ClockConfigTypeDef sClockSourceConfig;
    TIM_MasterConfigTypeDef sMasterConfig;
    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 0;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 83999;
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
    {
        Error_Handler();
    }
    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
    {
        Error_Handler();
    }
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
    {
        Error_Handler();
    }
    __HAL_TIM_ENABLE(&htim3);
}
TIM5的初始化
/*  84M*/
void MX_TIM5_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim5.Instance = TIM5;
  htim5.Init.Prescaler = 0;
  htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim5.Init.Period = Tim5_CCR/init_speed-1;
  htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
__HAL_TIM_ENABLE(&htim5);
        TIM5 ->CR1 |= 0x0080;
        
}
TIM3中断函数
void TIM3_IRQHandler(void)
{
    CPU_IntDis();   //CPU_CRITICAL_ENTER;
    OSIntEnter();
    HAL_TIM_IRQHandler(&htim3);
                TIM3->ARR = 83999;
                {
                        if(speed_up1==1)
                        {
                                if(vx1<speed_max)
                                {
                                        vx1 += (float)slope_val/1000;
                                        if(vx1>speed_max)
                                        {
                                                        vx1 = speed_max;
                                                        speed_up1 = 0;
                                        }
                                        timer5ARR = Tim5_CCR/vx1;               
                                }               
                        }        
                        if(speed_down1==1)
                        {
                                if(vx1>cutoff_speed)
                                {
                                        vx1 -= (float)slope_val/1000;
                                        if(vx1<=cutoff_speed)
                                        {
                                                vx1 = cutoff_speed;
                                                speed_down1 = 0;
                                                MOTOR_mov_flag = 0;
                                        }
                                        timer5ARR = Tim5_CCR/vx1;        
                                }                                
                        }
                }
    CPU_IntEn();
    OSIntExit();
}
TIM5中断函数
void TIM5_IRQHandler(void)
{
    CPU_IntDis();   //CPU_CRITICAL_ENTER;
    OSIntEnter();
{
    HAL_TIM_IRQHandler(&htim5);
                TIM5->ARR = timer5ARR;
                HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);               
                turns_pulse_nums++;

                if(MOTOR_mov_flag)
                {
                        if(turns_pulse_nums>=distance_R*8)
                        {
                                MOTOR_mov_over = 1;
                                speed_down1 = 1;
                                MOTOR_mov_flag = 0;
                        }        
                }
        }
    CPU_IntEn();
    OSIntExit();
}
后来改成TIM3定时0.1ms,有改善,这样的到底要怎么处理呢?

使用特权

评论回复

相关帖子

沙发
airwill| | 2019-12-22 18:24 | 只看该作者
看情况是异步性问题吧

使用特权

评论回复
板凳
jing880311|  楼主 | 2019-12-23 13:27 | 只看该作者
airwill 发表于 2019-12-22 18:24
看情况是异步性问题吧

不太理解,能具体说一下吗?还有这个可以解决吗?

使用特权

评论回复
地板
jing880311|  楼主 | 2020-1-2 15:39 | 只看该作者
不知道怎么结贴,是我的定时器设置不对,越界了,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

73

帖子

0

粉丝