基于STC8H1K28的双轴机械臂驱动模块:步进电机42HS348E,BH32角度传感器

作者:卓晴博士,清华大学自动化系
更新时间:2020-08-08 Saturday
 

■ 设计背景


这是一款用于化学实验室样品上样器的机械臂。设置有肘关节、肩关节以及上下移动关节。

▲ 双轴机械臂结构

▲ 双轴机械臂结构

肘关节和肩关节运动驱动电机使用的是 42HS48EIS闭环步进电机 , 该电机的 转动角度使用高精度角度传感器 进行测量过。两个关节的步进电机的外部接口是一致的,只是输出在肩关节所使用得到功率(输出扭矩)大一些,体积长。

  • 存在的一个问题:步进电机42HS48EIS 资料中提到该电机是一款闭环步进电机,带有不丢步高效低发热编码器。这个性能在后面实验中需要加以验证。

□ 说明:关于42HS48EIS闭环特性在下面博文中进行了验证: 双轴机械臂调试:步进电机42HS348E,BH32角度传感器,MCU:STC8H1K28

▲ 角度传感器、步进电机

▲ 角度传感器、步进电机

角度传感器使用了 BH38绝对位置14bit角度传感器 ,使用MODBUS RS485协议读取角度。采用该角度传感器是为了形成两个关节运动的角度闭环。

  • 相关工作:
  1. 双轴机械臂调试

01模块设计


1.性能指标

(1) 设计要求

  • 具有两路步进电机驱动脉冲输出
  • 具有两路MODBUS接口,读取两路BH38绝对角度穿就穿数值;
  • 具有统一的WiFi调试接口。

(2) 设计参考

▲ 使用二极管与门合成两路RS485输入到单片机

▲ 使用二极管与门合成两路RS485输入到单片机

2.电路设计1

(1) 原理图设计

(2) PCB设计

  • 角度传感器接口定义:
PIN 符号 功能
1 +5V 工作电源
2 GND 电源地
A RS485 A+
B RS485 B-
5 CLR 清楚传感器角度(+5V)
6 INIT 设置(+5V)
  • 步进电机控制接口定义:
PIN 符号 功能
1 +5V 上拉电源
2 PUL 脉冲输出
3 DIR 方向控制
4 ENA 使能控制

3.单片机软件2

  • OSC:35MHz, DEBUG UART:460800bps

(1) 设置UART2波特率

在35MHz时钟频率下, UART2输出19200的波特率设置。 T 2 = 0 x F E 38 T_2 = 0xFE38

测量TXD2发送0x55波形,可以确定输出的波特率为19200bps。

▲ 测量TXD2发送波形

▲ 测量TXD2发送波形

(2) 测试IO

测试其它IO的功能。

02双路角度传感器读取


1.BH60文件模块拷贝与修改

(1) 拷贝生成BH60文件模块

将在博文基于STC8H1K28的BH60的角度读写模块对应的BH60头文件和C语言文件拷贝到当前工程文件中。

(2) 对BH60进行修改

  • 增加DIR1_PIN,DIR2_PIN的定义以及初始化;
  • 去除PROGRAM_PIN, CLEAR_PIN的定义和初始化
  • 定义g_ucBH60Channel定义;
  • 增加BH60DirOnOff()定义。
  • 对BH60SendBuffer()函数进行更新。

2.测试BH60读写角度

(1) 传感器接口

按照BH38绝对位置14bit角度传感器中对于BH38传感器的接口定义来制作传感器的接头。这与本电路板的接口定义是一样的。

(2) 角度读写实验

将两个端口的CLEARx_PIN, PROGRAMx_PIN都初始化为0。分别测试PANG1,PANG2上的对于传感器的读取功能。

注意: BH60Init(1):其中的地址使用缺省的1。

▲ 第一通道RS485的DIR(蓝色)与接收到RI(青色)信号

▲ 第一通道RS485的DIR(蓝色)与接收到RI(青色)信号

注意:在上述波形中,返回的RI波形低电平大于1.5V,实际上STC8H1K28无法接收到这个波形。通过更换MAX487芯片之后,接收到的波形低电平接近0V,此时STC8H1K28才能够正常接收到返回的数据。

通过改造BH60ReadNumber(ucChannel),可以分别读取两个角度传感器的角度。

//----------------------------------------------------------------------
if(++nShowCount >= 500) {
    nShowCount = 0;            
    printf("%ld %ld\r\n", BH60ReadNumber(0), BH60ReadNumber(1));
}

▲ 分别使用BH60,BH38进行双通道读取实验

▲ 分别使用BH60,BH38进行双通道读取实验

通过验证,可以正确的读取两个通道的角度。

(3) 读取角度的时间

读取两个通道的角度所需要的时间:20mS。
如果没有连接角度传感器:读取两个通道的角度所需要的时间14ms。
因此,平均读取一个通道的角度,所需要的时间:没有安装角度传感器时需要7ms,安装角度传感器的时候需要10ms

//----------------------------------------------------------------------
if(++nShowCount >= 500) {
    nShowCount = 0;            
    g_ucTime0MS = 0;
    BH60ReadNumber(0);
    BH60ReadNumber(1);
    nShowCount = g_ucTime0MS;
    
    printf("%ld %ld, %d\r\n", BH60ReadNumber(0), BH60ReadNumber(1), nShowCount);
}

03步进电机驱动


★ 注意:电机的供电电压需要大于15V。可以选择16~24V的电压。

1.改造主循环频率

将原来的主循环中的WaitTime(1)修改成Delay(100),主循环的周期变为:Tp=0.0358ms。如果形成脉冲,则可以形成的频率为: f p = 1 2 T p = 13.85 k H z f_p = {1 \over {2 \cdot T_p }} = 13.85kHz

下图是设置Delay(50)情况下的旋转情况。

2.串口命令

下面给出了串口命令。其中

  • angle : 读取两个角度数值
  • step1,step2,step12分别控制pulse1,2的数量。参数是一个长整数。大于0:你是转旋转;小于0:顺时针旋转。
else IFARG0("angle") {
    printf("%ld %ld\r\n", BH60ReadNumber(0), BH60ReadNumber(1));
} else IFARG0("step1") {
    sscanf(SDA(1), "%ld", &g_lnPulse1Number);
    if(g_lnPulse1Number > 0) {
        ON(DIR1_PIN);
    } else {
        g_lnPulse1Number = -g_lnPulse1Number;
        OFF(DIR1_PIN);
    }

} else IFARG0("step2") {
    sscanf(SDA(1), "%ld", &g_lnPulse2Number);
    if(g_lnPulse2Number > 0) {
        ON(DIR2_PIN);
    } else {
        g_lnPulse2Number = -g_lnPulse2Number;
        OFF(DIR2_PIN);
    }

} else IFARG0("step12") {
    sscanf(SDA(1), "%ld", &g_lnPulse1Number);
    sscanf(SDA(2), "%2ld", &g_lnPulse2Number);
    if(g_lnPulse1Number > 0) {
        ON(DIR1_PIN);
    } else {
        g_lnPulse1Number = -g_lnPulse1Number;
        OFF(DIR1_PIN);
    }  

    if(g_lnPulse2Number > 0) {
        ON(DIR2_PIN);
    } else {
        g_lnPulse2Number = -g_lnPulse2Number;
        OFF(DIR2_PIN);
    }

※ 结论


制作了基于STC8H1K28单片机的双轴机械臂的控制板。并给出的基于ASCII串口命令的调试方式。使用基于WiFi调试模块,可以方便进行远程下载程序和调试参数。


  1. AD设计工程文件:AD\XQWF\2020\机械臂\CNT2AXESSTC8H.SchDoc * ↩︎

  2. C51工程文件:C51\STC\Project\XQWF\2020\STC8H2AXES\STC8H2AXES.uvproj ↩︎

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/107870135