硬汉嵌入式论坛

 找回密码
 立即注册
查看: 240|回复: 5
收起左侧

[TIMER] 使用H7定时器单脉冲时出现偷跑脉冲

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2025-5-17 22:38:54 来自手机 | 显示全部楼层 |阅读模式
我使用的芯片是H7VB系列 我使用定时器15产生100us一次的更新中断 定时器一定时器三都是10us一次计数周期 占空比给的百分之五十 在中断里面我会使用发送单脉冲的函数,出现了一个很奇怪的问题 刚进更新中断 两个定时器都会发一次单脉冲 即使我在中断发送脉冲的指令那一行打了断点,没有执行发送单脉冲命令。依旧会出现两通道依旧会出现一次单脉冲。然后这是我整理的问题文档的链接https://scnpjoxg7u91.feishu.cn/wiki/Z9V0wH8NiiXD3kkke50cESgfnVg
实在不知道该怎么排查了,链接内容里面最下方是我的问题具体描述还有截图
希望有大佬可以解答一下。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-5-18 08:43:07 | 显示全部楼层
楼主这个链接内容需要手机安装飞书软件才可以。

方便的话,贴下代码实现
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2025-5-18 10:38:00 | 显示全部楼层
void Send_OPM_Stepper(uint8_t axis)
{
        if (axis == AXIS_X)
        {
                HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
                 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
        }
        else
        {
                HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
                 HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
        }
}这是发送单脉冲命令的函数 我把这个函数放在while里面测试过了 这个没问题
void Vison_coverXYtoStep(vision_point_t target_Point)
{
                uint16_t differ_x= Vision_info->Redlazer_point.x-target_Point.x;
                uint16_t differ_y= Vision_info->Redlazer_point.y-target_Point.y;
        float X_angle=atan(differ_x*VR_Rate/100.0f)*(180.0f/PI);
        float Y_angle=atan(differ_y*VR_Rate/100.0f)*(180.0f/PI);
        //四舍五入整数
        target_steps_x=(int32_t)roundf(X_angle*StepperDiv/StepperAngle);
        target_steps_y=(int32_t)roundf(Y_angle*StepperDiv/StepperAngle);
}
void MoveToTargetCoordinates_Line(vision_point_t target_Point)
{
        Vison_coverXYtoStep( target_Point);
        //设置方向
        if(target_steps_x<=0)
        {
                SetDirection(AXIS_X,DIR_CW);
        }
        else
        {
                SetDirection(AXIS_X,DIR_CCW);
        }
                if(target_steps_y<=0)
        {
                SetDirection(AXIS_Y,DIR_CW);
        }
        else
        {
                SetDirection(AXIS_Y,DIR_CCW);
        }
        //设定好方向后化为绝对值
        target_steps_x=abs(target_steps_x);
        target_steps_y=abs(target_steps_y);
  NXY=target_steps_x+target_steps_y;
        line_is_moving=true;
        //开始产生脉冲
                GPIOE->BSRR|=1<<15;//用于逻辑分析仪指示中断开始
__HAL_TIM_CLEAR_FLAG(&htim15, TIM_FLAG_UPDATE);
        HAL_TIM_Base_Start_IT(&htim15);
               
                }
        //
       


//需要测试
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
       
       
  /* USER CODE BEGIN Callback 0 */

         if (htim->Instance == TIM15)
  {
               
                //HAL_Delay(1);
                GPIOE->BSRR|=1<<13;
                if (!line_is_moving) //如果是false则就会停下来
        {
          HAL_TIM_Base_Stop_IT(&htim15);
          return;
        }
   if(NXY <= 0)//迭代完成
         {
                 line_is_moving=false;
                 HAL_TIM_Base_Stop_IT(&htim15);
                 return;
         }
         if (FM >= 0)
        {
            // 判断X方向
        FM=FM-target_steps_y;
         Send_OPM_Stepper(AXIS_X);
  }
        else
        {
                FM=FM+target_steps_x;
                 Send_OPM_Stepper(AXIS_Y);
        }
        NXY=NXY-1;
        GPIOE->BSRR = (1U << (13 + 16));
}//
这段程序大致意思是我有 两个步进电机组成了 xy轴 使用直线插补让它xy轴协同走直线 (23年电赛e题)但是我发现俩通道各自多两个脉冲 如图所示
根据我的通道一的指示 脉冲都是在中断里面发出的  于是我就在一进入TIM15的中断里面就加入了一个HAL_delay 让中断回调什么也不执行直接卡死没想到还有两个通道各有一个脉冲(第三个图片)这就很奇怪了  
image.png
image (1).png
image 2.png
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2025-5-18 22:00:54 | 显示全部楼层
我翻了一下 H7的参考手册 TIM15可以作为TIM的ITR0 可以作为TIM3的ITR2 说明这TIM15内部是跟这俩定时器有连接关系的。但是我的Cubemx并没有配置主从定时器。翻了翻手册也没有太多想法
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-5-19 07:57:48 | 显示全部楼层
Liuxujia 发表于 2025-5-18 10:38
void Send_OPM_Stepper(uint8_t axis)
{
        if (axis == AXIS_X)

从楼主分享的代码来看,用的几个定时器主要就是脉冲控制步进电机吧,要不试试我们这个思路,简单易用



STM32-V4开发板的步进电机例程,5V 4相 5线步进电机 28YBJ-48
https://www.armbbs.cn/forum.php? ... 7742&fromuid=58
(出处: 硬汉嵌入式论坛)


回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2025-5-19 10:46:07 来自手机 | 显示全部楼层
eric2013 发表于 2025-5-19 07:57
从楼主分享的代码来看,用的几个定时器主要就是脉冲控制步进电机吧,要不试试我们这个思路,简单易用

...

好的,谢谢硬汉哥
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 04:27 , Processed in 0.260723 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表