■ 简介
在博文 BH60绝对位置编码器测试 中介绍了对BH60,通过其MODBUS(485)读取相应绝对角度的方式。为了便于为了进行高精度角度实验,制作基于STC8H1K28的BH60角度读取模块。并使其可以通过 串口ISPHUB 通过命令统一进行读取。
01模块设计
1.实验威廉希尔官方网站
设计1
2.接口定义
除了上面的四芯ISP接口之外,下面的6芯接口定义为:
[tr]管脚123456[/tr]
3.单片机软件2
- 工作OSC:35MHz, UART1:460800bps
□ 拷贝BH60文件: 将BH60.H,BH60.C拷贝到当前的工作目录下并添加到工程中去。
□ 修改STC8H文件:增加UART2gsng ; 将UART2的波特率定时器2的时间常数修改为:0xFE38
□ 在BH60中增加对于485的DIR管脚定义与控制: 在BH60中增加DIR_PIN的定义。
#define DIR_PIN 1, 2
□ 测试BH60读取功能: 读取正常。
□ 增加BH60的一些功能: 增加BH60Clear的功能。通过测试,将清零(红线)线设置为VCC超过100ms,可以将BH60的内部计数清零。
4.单片机接口命令
if(strcmp("hello", (char *)STD_ARG[0]) == 0)
printf("%s is ready !rn", VERSION_STRING);
else IFARG0("bh60clear") {
ON(CLEAR_PIN);
WaitTime(100);
OFF(CLEAR_PIN);
} else IFARG0("bh60read") {
printf("%ldrn", BH60ReadNumber());
} else IFARG0("bh60readb") {
lnNumber = (unsigned long)BH60ReadNumber();
SendChar((unsigned char)(lnNumber >> 24));
SendChar((unsigned char)(lnNumber >> 16));
SendChar((unsigned char)(lnNumber >> 8));
SendChar((unsigned char)(lnNumber));
}
02测试ISPHUB的读取功能
1.增加相应命令
使用在 ISPHUBALL 中的STC8H1K28的下载板3的STC8H1K28工程文件增加对BH60读取的相关程序。
在ISPHUBALL工程的serialtxt增加了如下的命令。
if(strcmp("hello", (char *)STD_ARG[0]) == 0)
printf("%s is ready !rn", VERSION_STRING);
else IFARG0("adt") {
ADT7410ReadT(nDim);
printf("%5.3f ", nDim[0] / 128.0);
printf("%5.3f ", nDim[1] / 128.0);
printf("%5.3f ", nDim[2] / 128.0);
printf("%5.3frn", nDim[3] / 128.0);
} else IFARG0("readhctl") {
printf("%drn", HCTL2020Read());
} else IFARG0("bh60read") {
printf("%ldrn", BH60ReadNumber());
} else IFARG0("bh60clear") {
BH60Clear();
} else IFARG0("pulse") {
sscanf(SDA(1), "%d", &nNumber);
ULC2003Pulse(nNumber);
}
else printf("Error command : %s !rn", STD_ARG[0]);
2.测试实验
使用 STC8K28步进电机OC触发器 模块驱动步进电机带动BH60旋转。设置驱动器的拨码开关处于OFF,OFF,OFF,OFF,即40000步/周。
读取对应的角度:
▲ 在步进电机带动下BH60读取的旋转角度
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2020-07-15
#
# Note:
#============================================================
from headm import *
from tsmodule.tsstm32 import *
stm32cmd('bh60clear')
time.sleep(.5)
angle = []
for i in range(100):
stm32cmd('pulse 100')
time.sleep(.1)
stm32cmd('CLEAR')
stm32cmd('bh60read')
time.sleep(.1)
value = stm32memo(1)[0]
printf(value)
angle.append(value)
tspsave('angle', angle=angle)
plt.plot(angle)
plt.xlabel("Steps")
plt.ylabel("Angle")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
※ 结论
设计的BH60角度读取模块工作符合前期设计的要求。
■ 简介
在博文 BH60绝对位置编码器测试 中介绍了对BH60,通过其MODBUS(485)读取相应绝对角度的方式。为了便于为了进行高精度角度实验,制作基于STC8H1K28的BH60角度读取模块。并使其可以通过 串口ISPHUB 通过命令统一进行读取。
01模块设计
1.实验威廉希尔官方网站
设计1
2.接口定义
除了上面的四芯ISP接口之外,下面的6芯接口定义为:
[tr]管脚123456[/tr]
3.单片机软件2
- 工作OSC:35MHz, UART1:460800bps
□ 拷贝BH60文件: 将BH60.H,BH60.C拷贝到当前的工作目录下并添加到工程中去。
□ 修改STC8H文件:增加UART2gsng ; 将UART2的波特率定时器2的时间常数修改为:0xFE38
□ 在BH60中增加对于485的DIR管脚定义与控制: 在BH60中增加DIR_PIN的定义。
#define DIR_PIN 1, 2
□ 测试BH60读取功能: 读取正常。
□ 增加BH60的一些功能: 增加BH60Clear的功能。通过测试,将清零(红线)线设置为VCC超过100ms,可以将BH60的内部计数清零。
4.单片机接口命令
if(strcmp("hello", (char *)STD_ARG[0]) == 0)
printf("%s is ready !rn", VERSION_STRING);
else IFARG0("bh60clear") {
ON(CLEAR_PIN);
WaitTime(100);
OFF(CLEAR_PIN);
} else IFARG0("bh60read") {
printf("%ldrn", BH60ReadNumber());
} else IFARG0("bh60readb") {
lnNumber = (unsigned long)BH60ReadNumber();
SendChar((unsigned char)(lnNumber >> 24));
SendChar((unsigned char)(lnNumber >> 16));
SendChar((unsigned char)(lnNumber >> 8));
SendChar((unsigned char)(lnNumber));
}
02测试ISPHUB的读取功能
1.增加相应命令
使用在 ISPHUBALL 中的STC8H1K28的下载板3的STC8H1K28工程文件增加对BH60读取的相关程序。
在ISPHUBALL工程的serialtxt增加了如下的命令。
if(strcmp("hello", (char *)STD_ARG[0]) == 0)
printf("%s is ready !rn", VERSION_STRING);
else IFARG0("adt") {
ADT7410ReadT(nDim);
printf("%5.3f ", nDim[0] / 128.0);
printf("%5.3f ", nDim[1] / 128.0);
printf("%5.3f ", nDim[2] / 128.0);
printf("%5.3frn", nDim[3] / 128.0);
} else IFARG0("readhctl") {
printf("%drn", HCTL2020Read());
} else IFARG0("bh60read") {
printf("%ldrn", BH60ReadNumber());
} else IFARG0("bh60clear") {
BH60Clear();
} else IFARG0("pulse") {
sscanf(SDA(1), "%d", &nNumber);
ULC2003Pulse(nNumber);
}
else printf("Error command : %s !rn", STD_ARG[0]);
2.测试实验
使用 STC8K28步进电机OC触发器 模块驱动步进电机带动BH60旋转。设置驱动器的拨码开关处于OFF,OFF,OFF,OFF,即40000步/周。
读取对应的角度:
▲ 在步进电机带动下BH60读取的旋转角度
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2020-07-15
#
# Note:
#============================================================
from headm import *
from tsmodule.tsstm32 import *
stm32cmd('bh60clear')
time.sleep(.5)
angle = []
for i in range(100):
stm32cmd('pulse 100')
time.sleep(.1)
stm32cmd('CLEAR')
stm32cmd('bh60read')
time.sleep(.1)
value = stm32memo(1)[0]
printf(value)
angle.append(value)
tspsave('angle', angle=angle)
plt.plot(angle)
plt.xlabel("Steps")
plt.ylabel("Angle")
plt.grid(True)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
※ 结论
设计的BH60角度读取模块工作符合前期设计的要求。
举报