STM32
直播中

fejlkel

8年用户 1094经验值
擅长:制造/封装
私信 关注
[问答]

如何对基于STM32的三轴机械臂控制器进行调试呢

如何对三轴机械臂控制电路读取肩部角度编码器ST-3806-15-RS数据进行调试呢?
如何对三轴机械臂控制电路读取肘部角度编码器ST-3806-15-RS数据进行调试呢?

回帖(1)

倪驰銮

2021-12-14 10:53:38

  ➤01 机械臂调试

    1.简介

  对 基于STM32对于三轴机械臂控制器设计 中对应的控制电路读取肩部和肘部两个 角度编码器 ST-3806-15-RS 数据进行调试。
  2.接口电路1

  
  

  

   ▲ 角度读取的相关电路和PCB  
  2.单片机软件

  单片机软件所在目录:
  
   D:zhuoqingwindowARMIARSTM32ApplicationXQWF2020CNTSTM103Srcmain.c
  
   
  ➤02 基本调试2

    1. UART2输入输出

  通过UART2发送字符,测试在MAX485的输出波形显示互补的信号。
  2.建立ST3806文件

  从 角度编码器 ST-3806-15-RS 拷贝 ST3806的头文件和C文件并建立相应的文件,加入Project。 具体文件内容参见附录。
  注意:Control中调用ST3806Init()初始化的时候,需要注意到它的输入参数应该设置为1。
  通过下面的过程,可以测量读取两个角度值所需要的缠绵大约在3 ~ 4ms。
     
    if(++nShowCount >= 500) {
        nShowCount = 0;
        int nBegin = HAL_GetTick();
        unsigned int nNumber1 = ShoulderAngle(); //ST3806ReadNumber(ST3806_CHANNEL_1);
        unsigned int nNumber2 = ElbowAngle();  //ST3806ReadNumber(ST3806_CHANNEL_2);
        int nEnd = HAL_GetTick();
        printf("%d %d %drn", nNumber1, nNumber2, nEnd-nBegin);
    }


3.读取两个关节的最大值和最小值

  从顶部看肩关节和肘关节的角度极值分别为:
  (1)肩关节角度极值范围

  

  • 顺时针: 11157
  • 逆时针: 23376
  
  

  

   ▲ 顺时针旋转,从左90°旋转刀右90°  
  (2)肘关节角度极值范围

  

  • 顺时针: 23913
  • 逆时针: 27646
  
  

  

   ▲ 顺时针旋转,从左135°旋转刀右135°  
  4.角度左右补偿

  (1)目标

  由于传感器一周的分辨率是15bit,角度是以为周期重复的。所以机械臂在旋转过程中它的数值可能会从0x8000→0,或者0→0x8000突变。
通过角度增加一个偏置 ,使得修正后的角度,在机械臂旋转范围内,不会出现上述的突变。实际的角度通过如下公式计算:
   
  (2)获得偏移量

如何获得最佳的偏移量使得输出的角度值范围能够位于0x0 ~ 0x8000的中间位置0x4000呢?
下面给出了角度偏移量的计算公式。
  

  


#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2020-12-21
#
# Note:
#============================================================
from headm import *
from tsmodule.tsstm32       import *
def deltaA(amin, amax):
    amax = amax if amax >= amin else 0x8000+amax
    a0 = (amin + amax) // 2
    delA = 0x4000-a0 if a0 <= 0x4000 else 0xc000-a0
    return delA
#------------------------------------------------------------
data = stm32memo(1)
delA = deltaA(data[0], data[-1])
newdata = [(a + delA) % 0x8000 for a in data]
printf('DeltaA:%d'%delA)
printf(data, newdata)
plt.plot(data, label='Origin')
plt.plot(newdata, label='Modifier')
plt.xlabel("Sample")
plt.ylabel("Angle")
plt.grid(True)
plt.tight_layout()
plt.legend(loc='upper right')
plt.show()
#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================


(3)测试数值

  对于肩关节:ΔA=15176
  
  

  

   ▲ 肩关节经过修正后的角度变化范围  
  对于肘关节的数据: ΔA=7433

  

  

   ▲ 肘关节角度补偿前和补偿后的曲线  
   
  ➤03 程序接口

    下面分别是在control.h, control.c下的两个接口程序:
  


//------------------------------------------------------------------------------
#define ARM_SHOULDER_OFFSET     15176
#define ARM_ELBOW_OFFSET        7433


unsigned int ShoulderAngle(void);
unsigned int ElbowAngle(void);
//------------------------------------------------------------------------------
unsigned int ShoulderAngle(void) {
    unsigned int nAngle;
    nAngle = ST3806ReadNumber(ST3806_CHANNEL_1);
    return (nAngle + ARM_SHOULDER_OFFSET) & 0x7fff;
}


unsigned int ElbowAngle(void) {
    unsigned int nAngle;
    nAngle = ST3806ReadNumber(ST3806_CHANNEL_2);
    return (nAngle + ARM_ELBOW_OFFSET) & 0x7fff;   
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分