➤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)肩关节角度极值范围
▲ 顺时针旋转,从左90°旋转刀右90°
(2)肘关节角度极值范围
▲ 顺时针旋转,从左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;
}
➤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)肩关节角度极值范围
▲ 顺时针旋转,从左90°旋转刀右90°
(2)肘关节角度极值范围
▲ 顺时针旋转,从左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;
}
举报