stm32单片机控制台达伺服电机 点击:161 | 回复:19



陌上倾城~凤舞妍

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 0回
  • 年度积分:23
  • 历史总积分:23
  • 注册:2021年3月28日
发表于:2021-03-28 15:30:50
楼主
求助帖30分-未结帖

目前正在做一个项目,使用stm32单片机控制伺服电机的转动(PWM输出脉冲,伺服位置控制模式)。但在测试过程中,无论怎样修改程序还是更改CN1的接口,电机始终转动不起来,刚开始做这个,我查找了很多资料,但依然没有效果,各位大佬可以帮我看看究竟是哪有问题(我测试电机测试了一周了,呜呜~~)
接口9电机使能输出
接口14接地
接口11,39,43接12V电源
接口37单片机控制电机转动方向
接口41单片机输出脉冲
台达ADSA-soft软件是不是要调节什么?跪求大佬指点迷津!!!





关育谋

  • [版主]
  • 精华:4帖
  • 求助:21帖
  • 帖子:411帖 | 5041回
  • 年度积分:2098
  • 历史总积分:39679
  • 注册:2004年5月28日
发表于:2021-03-29 12:20:02
1楼

程序不发出来,怎么帮你分析?

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:22帖 | 8127回
  • 年度积分:4
  • 历史总积分:27406
  • 注册:2005年3月09日
发表于:2021-03-30 00:14:52
2楼

我猜是信号电气规格不匹配

请叫我王老湿

  • [版主]
  • 精华:0帖
  • 求助:0帖
  • 帖子:607帖 | 6887回
  • 年度积分:1576
  • 历史总积分:208333
  • 注册:2011年4月25日
发表于:2021-03-30 10:12:57
3楼

PWM脉冲估计不行

陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 4回
  • 年度积分:25
  • 历史总积分:25
  • 注册:2021年3月28日
发表于:2021-03-30 10:22:42
4楼

"请叫我王老湿" 的回复,发表在3楼
        对内容: 【PWM脉冲估计不行】进行回复:

        -----------------------------------------------------------------


脉冲应该可以的,我之前驱动步进电机就可以


陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 4回
  • 年度积分:25
  • 历史总积分:25
  • 注册:2021年3月28日
发表于:2021-03-30 10:23:35
5楼

"刘岩利" 的回复,发表在2楼
        对内容: 【我猜是信号电气规格不匹配】进行回复:

        -----------------------------------------------------------------


信号电气规格不匹配是指什么意思?

陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 4回
  • 年度积分:25
  • 历史总积分:25
  • 注册:2021年3月28日
发表于:2021-03-30 10:29:31
6楼

"关育谋" 的回复,发表在1楼
        对内容: 【程序不发出来,怎么帮你分析?】进行回复:

        -----------------------------------------------------------------

void TIM2_PWM_Init(void)
{
    GPIO_InitTypeDef            GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef     TIM_TimeBaseStruct;
    TIM_OCInitTypeDef           TIM_OCInitStruct;
    
    RCC_APB1PeriphClockCmd(GENERAL_TIM_CLK,ENABLE);                        //开启定时器2的时钟
    RCC_APB2PeriphClockCmd(GENERAL_TIM_CH3_GPIO_CLK|
                                                                MOTOR_GPIO_CLK,ENABLE);                  //开启定时器2对应的GPIO时钟
    
    //使能
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;                          //设置GPIO输出方式为复用推挽输出
    GPIO_InitStruct.GPIO_Pin = MOTOR_GPIO_PIN;                             //选择要控制的GPIO引脚
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_  50MHz;                         //配置引脚速率为50MHz
    GPIO_Init(MOTOR_GPIO_PORT,&GPIO_InitStruct);                           //初始化结构体
    
    //定时器2的通道3
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;                           //设置GPIO输出方式为复用推挽输出
    GPIO_InitStruct.GPIO_Pin = GENERAL_TIM_CH3_PIN;                        //选择要控制的GPIO引脚
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_ 50MHz;                         //配置引脚速率为50MHz
    GPIO_Init(GENERAL_TIM_CH3_PORT,&GPIO_InitStruct);                      //初始化结构体
    
    //用于控制伺服电机的旋转方向
    GPIO_InitStruct.GPIO_Pin = GENERAL_TIM_DIR_GPIO_PIN;                   //选择要控制的GPIO引脚
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;                          //设置GPIO输出方式为推挽输出
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_   50MHz;                         //配置引脚速率为50MHz
    GPIO_Init(GENERAL_TIM_DIR_GPIO_PORT,&GPIO_InitStruct);                 //初始化结构体
//    GPIO_ResetBits(GENERAL_TIM_DIR_GPIO_PORT,GENERAL_TIM_DIR_GPIO_PIN);    //关闭PA3输出
    
    TIM_TimeBaseStruct.TIM_Prescaler = GENERAL_TIM_PSC;                    //定时器分频,驱动CNT计时器的时钟 = CK_INT/(PSC+1)
    TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;               //计数器计数模式,设置为向上计数
    TIM_TimeBaseStruct.TIM_Period = GENERAL_TIM_PERIOD;                    //自动重装载寄存器ARR的值,累计TIM_PERIOD+1个频率后产生一个更新或中断
    TIM_TimeBaseStruct.TIM_ClockDivision = 0;                              //时钟分频因子
    TIM_TimeBaseInit(GENERAL_TIM,&TIM_TimeBaseStruct);                     //初始化定时器
    
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;                         //选择定时器模式:TIM脉冲宽度调制模式1
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;             //比较输出使能
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;                  //输出极性:TIM输出比较极性低
    TIM_OCInitStruct.TIM_Pulse = (GENERAL_TIM_PERIOD+1)/2-1;               //设置占空比大小

    TIM_OC3Init(GENERAL_TIM,&TIM_OCInitStruct);                            //初始化通道3
        
    
//定时器2主模式设置
    TIM_SelectMasterSlaveMode(GENERAL_TIM,TIM_MasterSlaveMode_Enable);     
     TIM_SelectOutputTrigger(GENERAL_TIM,TIM_TRGOSource_Update);     
//定时器1从模式设置
    TIM_SelectInputTrigger(ADVANCE_TIM,TIM_TS_ITR1);                        //TIM2主连接TIM1,TIM_TS_ITR1
    TIM_SelectSlaveMode(ADVANCE_TIM,TIM_SlaveMode_External1);               // 等同 TIM1->SMCR|=0x07 //设置从模式寄存器  

//    TIM_OC3PreloadConfig(GENERAL_TIM,TIM_OCPreload_Enable);               //通道3使能
//    TIM_ARRPreloadConfig(GENERAL_TIM,ENABLE);                             //使能或失能TIMx在ARR上的预装载寄存器
//    TIM_Cmd(GENERAL_TIM, ENABLE);
    TIM_OC3PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
    
  TIM_ARRPreloadConfig(GENERAL_TIM, ENABLE);
  TIM_Cmd(GENERAL_TIM, ENABLE);
}

//设置控制PWM的占空比
void GENERAL_TIM_Control_1(void)   
{
    TIM_SetCompare3(GENERAL_TIM,GENERAL_TIM_PERIOD/2);
}   

void TIM1_Config(void)
{
    TIM_TimeBaseInitTypeDef    TIM_TimeBaseStruct;
    NVIC_InitTypeDef           NVIC_InitStruct;
    
    RCC_APB2PeriphClockCmd(ADVANCE_TIM_CLK,ENABLE);                         //开启高级定时器的时钟
    
    TIM_TimeBaseStruct.TIM_Period = ADVANCE_TIM_PERIOD;                     //设置自动重装载的值,累计TIM_Period+1个频率后产生一个更新或中断
    TIM_TimeBaseStruct.TIM_Prescaler = 0;                                   
    TIM_TimeBaseStruct.TIM_ClockDivision = 0;
    TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;                //向上计数
    TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;                           //重复计数器的值,没有用到不用设置
    TIM_TimeBaseInit(ADVANCE_TIM,&TIM_TimeBaseStruct);                      //初始化结构体
    TIM_ITConfig(ADVANCE_TIM,TIM_IT_Update,DISABLE);                        //使能中断
    
    NVIC_InitStruct.NVIC_IRQChannel = TIM1_CC_IRQn;                         //全局中断
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

void Pluse_output(void)                                                   //PulseNum为电机转动一圈所需的脉冲数
{
    TIM_SetAutoreload(ADVANCE_TIM,PulseNum);
    TIM_Cmd(ADVANCE_TIM,ENABLE);
    TIM_ClearITPendingBit(ADVANCE_TIM,TIM_IT_Update);
    TIM_ITConfig(ADVANCE_TIM,TIM_IT_Update,ENABLE);
    
    TIM_SetAutoreload(GENERAL_TIM,(90000/now_turns_speed)-1);
    TIM_SetCompare3(GENERAL_TIM,(90000/now_turns_speed)/2-1);
    TIM_Cmd(GENERAL_TIM,ENABLE);
}

void TIM1_CC_IRQHandler(void)
{
    if(TIM_GetITStatus(ADVANCE_TIM,TIM_IT_Update) != RESET)
    {

        TIM_ClearITPendingBit(ADVANCE_TIM,TIM_IT_Update);                   //清除中断标志位
            TIM_SetCounter(ADVANCE_TIM,0);

                TIM_CtrlPWMOutputs(ADVANCE_TIM, DISABLE);                         //主输出使能
                TIM_Cmd(GENERAL_TIM, DISABLE);                                    //关闭定时器
                TIM_Cmd(ADVANCE_TIM, DISABLE);                                    //关闭定时器
                TIM_ITConfig(ADVANCE_TIM, TIM_IT_Update, DISABLE);                //关闭 

       }
}

void Motor_Config(void)
{
    TIM2_PWM_Init();
    GENERAL_TIM_Control_1();
    TIM1_Config();
    Pluse_output();
    TIM1_CC_IRQHandler();
}

         


刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:22帖 | 8127回
  • 年度积分:4
  • 历史总积分:27406
  • 注册:2005年3月09日
发表于:2021-03-30 17:46:42
7楼

"陌上倾城~凤舞妍" 的回复,发表在5楼
        对内容: 【"刘岩利" 的回复,发表在2楼        对内容: 【我猜是信号电气规格不匹配】进行回复:        ---------------------------------------------...】进行回复:

        ---------------------------------------------------------------

电气规格不匹配,意思就是,电气规格不一致。脉冲列,在电气上,就是电压高低交替变换。电压信号的传递,首先涉及到到基准电压是否一致,其次,还有电压“高”、“低”的定义是否一致,对于单片机,2v以上就算是高电压。对于伺服驱动器,您这种接线方式,估计5V以下都是低电压。您没有给出完整的接线,如果在单片机和驱动器之间没有合适的接口驱动电路,那么您的单片机开心的发脉冲,但是由于两边的电气规格不一致,驱动器上很努力的啥也没接收到。

当然,还有一种小概率情况,就是,您的单片机接口已经被12V的电压损坏了。

陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 3回
  • 年度积分:23
  • 历史总积分:23
  • 注册:2021年3月28日
发表于:2021-04-01 20:50:58
8楼

"刘岩利" 的回复,发表在7楼
        对内容: 【"陌上倾城~凤舞妍" 的回复,发表在5楼        对内容: 【"刘岩利" 的回复,发表在2楼        对内容: 【我猜是信号电气规格不匹配】进行回复:        -----------...】进行回复:

        -----------------------------------------------------------------

电气信号是匹配的,我现在可以驱动电机转,而且能控制转速,但出现了一点点问题:就是每次伺服驱动器掉电的话我要重新手动给驱动器调,然后就是我之前设计的程序本来控制电机转动方向的却控制了电机使能,现在不能控制电机转动的方向了

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:22帖 | 8128回
  • 年度积分:6
  • 历史总积分:27408
  • 注册:2005年3月09日
发表于:2021-04-02 20:29:32
9楼

"陌上倾城~凤舞妍" 的回复,发表在8楼
        对内容: 【"刘岩利" 的回复,发表在7楼        对内容: 【"陌上倾城~凤舞妍" 的回复,发表在5楼        对内容: 【"刘岩利" 的回复,发表在2楼        对内容: 【我猜是信号电气规...】进行回复:

        -----------------------------------------------------------------


那就是手动调试的参数没有保存?

陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 4回
  • 年度积分:23
  • 历史总积分:23
  • 注册:2021年3月28日
发表于:2021-04-06 11:30:11
10楼

"刘岩利" 的回复,发表在9楼
        对内容: 【"陌上倾城~凤舞妍" 的回复,发表在8楼        对内容: 【"刘岩利" 的回复,发表在7楼        对内容: 【"陌上倾城~凤舞妍" 的回复,发表在5楼        对内容: 【"刘岩...】进行回复:

        -----------------------------------------------------------------


手动调试的参数,,,可能是这个问题,然后,,这个参数怎么保存呀,是通过软件保存还是驱动器上的按键保存?

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:22帖 | 8129回
  • 年度积分:8
  • 历史总积分:27410
  • 注册:2005年3月09日
发表于:2021-04-07 09:39:21
11楼

N久以前用过台达伺服,调试软件,应该可以保存参数,设计的人但凡有点脑子,不会不留出这个功能,但是我确实没有用过调试软件。

驱动器上的按键保存参数我是用过的。具体怎么操作,和松下之类的日本伺服大致是一样的,对着驱动器试两下肯定能找到,但是要直接写出来,记得没有那么清楚了。您仔细看看手册?

liujian5118-PLC技术军团

  • 精华:2帖
  • 求助:10帖
  • 帖子:32帖 | 3078回
  • 年度积分:717
  • 历史总积分:16495
  • 注册:2009年3月25日
发表于:2021-04-07 11:48:04
12楼

1、你确认下,使能后,电机是否抱住;即使能信号是否生效?(如果没抱住,说明使能信号电路有问题;)

2、你驱动电路是共集极的还是差分的?你提供的接线没有看到回路

陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 5回
  • 年度积分:23
  • 历史总积分:23
  • 注册:2021年3月28日
发表于:2021-04-07 15:03:59
13楼

"liujian5118-PLC技术军团" 的回复,发表在12楼
        对内容: 【1、你确认下,使能后,电机是否抱住;即使能信号是否生效?(如果没抱住,说明使能信号电路有问题;)2、你驱动电路是共集极的还是差分的?你提供的接线没有看到回路...】进行回复:

        -----------------------------------------------------------------


开基极的线路


陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 6回
  • 年度积分:23
  • 历史总积分:23
  • 注册:2021年3月28日
发表于:2021-04-08 20:52:39
14楼

"liujian5118-PLC技术军团" 的回复,发表在12楼
        对内容: 【1、你确认下,使能后,电机是否抱住;即使能信号是否生效?(如果没抱住,说明使能信号电路有问题;)2、你驱动电路是共集极的还是差分的?你提供的接线没有看到回路...】进行回复:

        -----------------------------------------------------------------


存在这么一个问题,就是我本来程序是按键控制转动与方向的,但现在使能不了电机,只有方向才能控制低级转动,但不饿能控制方向。驱动电路是低速共集级的

陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 7回
  • 年度积分:23
  • 历史总积分:23
  • 注册:2021年3月28日
发表于:2021-04-08 20:55:49
15楼

"刘岩利" 的回复,发表在11楼
        对内容: 【N久以前用过台达伺服,调试软件,应该可以保存参数,设计的人但凡有点脑子,不会不留出这个功能,但是我确实没有用过调试软件。驱动器上的按键保存参数我是用过的。具体怎么操作,和松下之类的日本伺服大致是一样的...】进行回复:

        -----------------------------------------------------------------

台达这个驱动器好像是掉电自动保存的,现在的话还是之前那个问题:电机只能使能,不能控制方向,还有就是一旦驱动器掉电,当再次开始时无论怎么做,电机依然不能转动,驱动器是保持掉电之前参数的


陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 8回
  • 年度积分:23
  • 历史总积分:23
  • 注册:2021年3月28日
发表于:2021-04-08 21:00:37
16楼

这个是我连线用的接口,橘色是我连接的一部分,37接口高低电平控制方向,41接口输出PWM频率

接线的方法是按照之前论坛里的方法:开路集电极,也不知道对不对,

刘岩利

  • [版主]
  • 精华:2帖
  • 求助:0帖
  • 帖子:22帖 | 8130回
  • 年度积分:10
  • 历史总积分:27412
  • 注册:2005年3月09日
发表于:2021-04-09 18:27:27
17楼

掉电自动保存?我之前是用的 b2,好像没有这么高级的功能。如果是重新上电前能实现的动作,重新上电后做不出来了,那就多半是参数没有保存到驱动器。


您现在遇到的都有些什么问题?从头看下来很乱。捋一下这个过程

1、电机不能转,

2、电机能转了,但是驱动器每次上电都需要重调

3、但现在使能不了电机,只有方向才能控制低级转动,但不饿能控制方向。驱动电路是低速共集级的(这句话没有完全看懂,低级或者是电机的误输入?饿是纯粹多余的误输入?)


在程序给出个控制动作,无论是使能还是转动方向后,用万用表实际测量一下相应电气节点的电压有没有对应的变化(0V-12V),这个应该很容易区分出是硬件问题还是软件问题。

如果接线从来没有修改过,但是电机曾经能控制使能,能控制转动,那么硬件有问题的可能就很小,多半是软件问题。

一个是驱动器的状态,应该就是参数没有保存,至于您看到的,有没有可能是调试软件保存在电脑硬盘上的参数?

至于使能和方向控制的混乱,您自己的程序问题可能性更大。

liujian5118-PLC技术军团

  • 精华:2帖
  • 求助:10帖
  • 帖子:32帖 | 3082回
  • 年度积分:825
  • 历史总积分:16603
  • 注册:2009年3月25日
发表于:2021-04-09 23:26:41
18楼

首先1、使能是可以用的(不能用的话,你将P2-10百位改成01,就是使能逻辑反);2、你脉冲形式是  脉冲+方向;还是正脉冲+反脉冲控制方式(P1-00);

接线:   35接 +12V;   37接方向,41接脉冲,   com-,0V ,单片机另外输出短接;

              使能  COM+ 接12V   DI1- 接单片机控制脚   com-,0V ,单片机另外角短接

陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 9回
  • 年度积分:23
  • 历史总积分:23
  • 注册:2021年3月28日
发表于:2021-04-11 15:05:01
19楼

ADSA-B2确实是掉电自动保存,之前测试中电机没有转动是因为我没有开启伺服启动(servo on),如果我把伺服驱动打开(即P2-30设为1),电机依然可以转动。

目前电机的问题是:

    1、我利用按键1可以控制电机的转动与停止,按键2是控制电机正反转,但按键二按下时:为高电平(正反转就是按照37接口的高低电平来决定正转还是反转),电机逆时针转的速度很快,但当我把按键二设为低电平时,电机确实会反转(顺时针),但是电机转动速度很慢

    2、本来我程序设置的是按键一控制电机是否转动,但现在却是:按键一没有使能,按键二按下去的时候(高电平),电机也会转动,但与按键一按下去电机的方向相反,同样电机的速度也很慢

按照以上的现象,我就有点困惑:因为事实上我按键一是通过使能或失能PWM信号来进行控制电机的转动,但为什么我按键二按下去的时候(37接口为高电平)电机依然会转动?感觉怪奇怪的,明明都没有脉冲信号,居然还能转动起来


您所说的问题三,那个‘饿’是我误输入,那个低速共集级是我连线的方式,我记得还有差动方式连线的,只是我用的是共集级。

陌上倾城~凤舞妍

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 10回
  • 年度积分:23
  • 历史总积分:23
  • 注册:2021年3月28日
发表于:2021-04-11 15:14:04
20楼

"liujian5118-PLC技术军团" 的回复,发表在18楼
        对内容: 【首先1、使能是可以用的(不能用的话,你将P2-10百位改成01,就是使能逻辑反);2、你脉冲形式是  脉冲+方向;还是正脉冲+反脉冲控制方式(P1-00);接线:   35接 +12V;   37接方...】进行回复:

        -----------------------------------------------------------------


1、驱动器默认P2-10为101,我也去设置了,但不能控制电机转动与停止,我只好利用控制PWM输出的方式使能或失能电机

2、我的脉冲形式是 脉冲+方向(P1-00为2,脉冲列+符号,符号应该就是方向的意思)


接线的话我基本跟您所说的一样,只是有一点不太相同:35接12V。我之前尝试过一种接线方法也接有35,但没有成功,于是我采用了另一种接线方式:9 接单片机控制接口,COM+、39,43接12V电源,COM-接地,37接方向,41接脉冲


相关主题

官方公众号

智造工程师