[STM32] 关于多个定时器同时使用

[复制链接]
369|3
 楼主 | 2019-12-20 17:01 | 显示全部楼层 |阅读模式
本帖最后由 jing880311 于 2019-12-20 17:47 编辑

现在是用了两个定时器
TIM5用来发脉冲
TIM3是1ms的定时,每隔1ms去修改TIM5的ARR值,感觉设置的都正确,但是实际测试发的脉冲个数不对,请问是什么原因呢?
TIM3的初始化
  1. void MX_TIM3_Init(void)     // 1ms
  2. {
  3.     TIM_ClockConfigTypeDef sClockSourceConfig;
  4.     TIM_MasterConfigTypeDef sMasterConfig;
  5.     htim3.Instance = TIM3;
  6.     htim3.Init.Prescaler = 0;
  7.     htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  8.     htim3.Init.Period = 83999;
  9.     htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  10.     if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  11.     {
  12.         Error_Handler();
  13.     }
  14.     sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  15.     if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  16.     {
  17.         Error_Handler();
  18.     }
  19.     sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  20.     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  21.     if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  22.     {
  23.         Error_Handler();
  24.     }
  25.     __HAL_TIM_ENABLE(&htim3);
  26. }
复制代码
TIM5的初始化
  1. /*  84M*/
  2. void MX_TIM5_Init(void)
  3. {
  4.   TIM_ClockConfigTypeDef sClockSourceConfig;
  5.   TIM_MasterConfigTypeDef sMasterConfig;

  6.   htim5.Instance = TIM5;
  7.   htim5.Init.Prescaler = 0;
  8.   htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
  9.   htim5.Init.Period = Tim5_CCR/init_speed-1;
  10.   htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  11.   if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
  12.   {
  13.     Error_Handler();
  14.   }
  15.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  16.   if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK)
  17.   {
  18.     Error_Handler();
  19.   }
  20.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  21.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  22.   if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)
  23.   {
  24.     Error_Handler();
  25.   }
  26. __HAL_TIM_ENABLE(&htim5);
  27.         TIM5 ->CR1 |= 0x0080;
  28.         
  29. }
复制代码
TIM3中断函数
  1. void TIM3_IRQHandler(void)
  2. {
  3.     CPU_IntDis();   //CPU_CRITICAL_ENTER;
  4.     OSIntEnter();
  5.     HAL_TIM_IRQHandler(&htim3);
  6.                 TIM3->ARR = 83999;
  7.                 {
  8.                         if(speed_up1==1)
  9.                         {
  10.                                 if(vx1<speed_max)
  11.                                 {
  12.                                         vx1 += (float)slope_val/1000;
  13.                                         if(vx1>speed_max)
  14.                                         {
  15.                                                         vx1 = speed_max;
  16.                                                         speed_up1 = 0;
  17.                                         }
  18.                                         timer5ARR = Tim5_CCR/vx1;               
  19.                                 }               
  20.                         }        
  21.                         if(speed_down1==1)
  22.                         {
  23.                                 if(vx1>cutoff_speed)
  24.                                 {
  25.                                         vx1 -= (float)slope_val/1000;
  26.                                         if(vx1<=cutoff_speed)
  27.                                         {
  28.                                                 vx1 = cutoff_speed;
  29.                                                 speed_down1 = 0;
  30.                                                 MOTOR_mov_flag = 0;
  31.                                         }
  32.                                         timer5ARR = Tim5_CCR/vx1;        
  33.                                 }                                
  34.                         }
  35.                 }
  36.     CPU_IntEn();
  37.     OSIntExit();
  38. }
复制代码
TIM5中断函数
  1. void TIM5_IRQHandler(void)
  2. {
  3.     CPU_IntDis();   //CPU_CRITICAL_ENTER;
  4.     OSIntEnter();
  5. {
  6.     HAL_TIM_IRQHandler(&htim5);
  7.                 TIM5->ARR = timer5ARR;
  8.                 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);               
  9.                 turns_pulse_nums++;

  10.                 if(MOTOR_mov_flag)
  11.                 {
  12.                         if(turns_pulse_nums>=distance_R*8)
  13.                         {
  14.                                 MOTOR_mov_over = 1;
  15.                                 speed_down1 = 1;
  16.                                 MOTOR_mov_flag = 0;
  17.                         }        
  18.                 }
  19.         }
  20.     CPU_IntEn();
  21.     OSIntExit();
  22. }
复制代码
后来改成TIM3定时0.1ms,有改善,这样的到底要怎么处理呢?

使用特权

评论回复
| 2019-12-22 18:24 | 显示全部楼层
看情况是异步性问题吧

使用特权

评论回复
 楼主 | 2019-12-23 13:27 | 显示全部楼层
airwill 发表于 2019-12-22 18:24
看情况是异步性问题吧

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

使用特权

评论回复
 楼主 | 2020-1-2 15:39 | 显示全部楼层
不知道怎么结贴,是我的定时器设置不对,越界了,

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /2 下一条

在线客服 快速回复 返回顶部 返回列表