大家好,
首先,我开始用Simulink编程Arduino Uno。金宝app一切都很完美。对于我们的DRS系统,我们希望使用Herkulex Drs 0201伺服电机。它将由RX TX信号控制而不是PWM。因此,有一个描述伺服处理的库。但图书馆用C代码编写。现在我想以某种方式在我的Simulink模型中获取此代码。金宝app你有什么想法如何?
这是图书馆:
#
IFNDEF.
__HERKULEXSERVO_H__
#
定义
__HERKULEXSERVO_H__
#
包括
<
arduino.h.
>
#
包括
<
CircularBuffer.h.
>
#
定义
HERKULEX_BROADCAST_ID
以0 xfe
#
IFNDEF.
HERKULEX_PACKET_RX_TIMEOUT
#
定义
HERKULEX_PACKET_RX_TIMEOUT
One hundred.
//
微秒
#
万一
#
IFNDEF.
HERKULEX_PACKET_RETRIES
#
定义
HERKULEX_PACKET_RETRIES
6
#
万一
#
IFNDEF.
HERKULEX_PACKET_RESEND_DELAY
#
定义
HERKULEX_PACKET_RESEND_DELAY
70
//
微秒
#
万一
#
IFNDEF.
herkulex_packet_rx_max_data.
#
定义
herkulex_packet_rx_max_data.
10
//
字节
#
万一
#
IFNDEF.
HERKULEX_SERIAL_RX_BUFFER
#
定义
HERKULEX_SERIAL_RX_BUFFER
30.
//
字节
#
万一
#
IFNDEF.
herkulex_max_scheduled_servos.
#
定义
herkulex_max_scheduled_servos.
10
#
万一
#
IFNDEF.
herkulex_serial_tx_buffer.
#
定义
herkulex_serial_tx_buffer.
(
1
+ HERKULEX_MAX_SCHEDULED_SERVOS *
5
)
#
万一
#
如果定义了
HERKULEX_DEBUG
#
定义
HERKULEX_DEBUG_RX_STATS
#
万一
枚举
类
Herkulexcommand.
{
Eepwrite =.
0x01
,
EepRead =
0x02
,
RamWrite =
0x03
,
RamRead =
0x04
,
IJog =
0x05
,
sjog =
0x06
,
统计=
0x07
,
回滚=
0x08
,
重启=
0x09.
};
枚举
类
Herkulexeepregister.
{
modelno1 =
0
,
modelno2 =
1
,
Version1 =
2
,
Version2 =
3.
,
baudrate =
4
,
id =
6
,
Ackpolicy =
7
,
AlarmLedPolicy =
8
,
torquopolicy =
9
,
MaxTemperature =
11
,
MinVoltage =
12
,
MaxVoltage =
13
,
AccelerationRatio =
14
,
maxaccelerationtime =.
15
,
Deadzone =
16
,
SaturatorOffset =
17
,
Sateratorslope =
18
,
PwmOffset =
20.
,
minpwm =
21
,
MaxPwm =
22
,
OverloadPwmThreshold =
24
,
minposition =.
26
,
maxPosition =.
28.
,
positionkp =
30.
,
positionkd =
32.
,
PositionKi =
34.
,
PositionFF1stGain =
36.
,
PositionFF2ndGain =
38.
,
LedBlinkPeriod =
44.
,
AdcFaultCheckPeriod =
45.
,
PacketGarbageCheckPeriod =
46.
,
stopdetectionPeriod =
47.
,
OverloadProtectionPeriod =
48.
,
StopThreshold =
49.
,
InpositionMargin =
50.
,
CalibrationDifference =
53.
};
枚举
类
HerkulExramregister.
{
id =
0
,
Ackpolicy =
1
,
AlarmLedPolicy =
2
,
torquopolicy =
3.
,
MaxTemperature =
5
,
MinVoltage =
6
,
MaxVoltage =
7
,
AccelerationRatio =
8
,
maxaccelerationtime =.
9
,
Deadzone =
10
,
SaturatorOffset =
11
,
Sateratorslope =
12
,
PwmOffset =
14
,
minpwm =
15
,
MaxPwm =
16
,
OverloadPwmThreshold =
18
,
minposition =.
20.
,
maxPosition =.
22
,
positionkp =
24
,
positionkd =
26
,
PositionKi =
28.
,
PositionFF1stGain =
30.
,
PositionFF2ndGain =
32.
,
LedBlinkPeriod =
38.
,
AdcFaultCheckPeriod =
39.
,
PacketGarbageCheckPeriod =
40
,
stopdetectionPeriod =
41.
,
OverloadProtectionPeriod =
42.
,
StopThreshold =
43.
,
InpositionMargin =
44.
,
CalibrationDifference =
47.
,
statusError =.
48.
,
StatusDetail =
49.
,
torquecontrol =
52.
,
LEDCONTROL =
53.
,
电压=
54.
,
温度=
55.
,
CurrentControlMode =
56.
,
勾选=
57.
,
CalibratedPosition =
58.
,
absoluteposition =.
60.
,
差异=
62.
,
Pwm =
64.
,
absolutegoalposition =.
68.
,
absolutedesiredtrajpos =
70
,
DesiredVelocity =
72.
};
枚举
类
HerkulexLed
:
uint8_t
{
了=
0x00.
,
红色=
0x04
,
绿色=
0x01
,
蓝色=
0x02
,
黄色=
0x05
,
青色=
0x03
,
紫色的=
0x06
,
白色=
0x07
,
忽视=
0 xff
};
#
定义
enum_flag_operator.
(
T X
)
排队
T
操作员
X
(T lhs, T rhs) {
返回
(t)(
static_cast.
<
uint8_t
>(lhs)x
static_cast.
<
uint8_t
> (rhs));}
#
定义
ENUM_FLAG_ASSIGNMENT_OPERATOR
(
T, X, Y
)
排队
T&
操作员
X
(t lh,
Const.
T&RHS){
返回
lhs = (lhs Y rhs);}
枚举
类
HerkulexPacketError
:
uint8_t
{
没有一个=
0
,
超时=
0 b00000001
,
长度=
0 b00000010
,
命令=
0 b00000100
,
校验和=
0 b00001000
};
enum_flag_operator.
(Herkulexpacketerror,|)
ENUM_FLAG_OPERATOR (HerkulexPacketError &)
ENUM_FLAG_ASSIGNMENT_OPERATOR (HerkulexPacketError | = |)
枚举类HerkulexStatusError: uint8_t {
没有一个=
0
,
InputVoltage =
0 b00000001
,
PotLimit =
0 b00000010
,
TemperatureLimit =
0 b00000100
,
InvalidPacket =
0 b00001000
,
超载=
0 b00010000
,
driverfault =
0B00100000
,
Eepdistorted =
0 b01000000
,
保留=
0 b10000000
};
enum_flag_operator.
(HerkulexStatusError |)
ENUM_FLAG_OPERATOR (HerkulexStatusError &)
enum_flag_assignment_operator(herkulexstatusError,| =,|)
枚举类HerkulexStatusDetail: uint8_t {
没有一个=
0
,
移动=
0 b00000001
,
inposition =.
0 b00000010
,
ChecksumError =
0 b00000100
,
UnknownCommand =
0 b00001000
,
faveredregrange =.
0 b00010000
,
GarbageTetected =.
0B00100000
,
Motoron =
0 b01000000
,
保留=
0 b10000000
};
enum_flag_operator.
(HerkulexStatusDetail,|)
enum_flag_operator(herkulexstatusdetail,&)
enum_flag_assignment_operator(herkulexstatusdetail,| =,|)
枚举类Herkulexchedulestate:UINT8_T {
没有一个=
0
,
个体,
SynchronizedMove
};
结构体
Herkulexpacket.
{
uint8_t
尺寸;
uint8_t
ID;
HerkulexCommand CMD;
uint8_t
checksum1;
uint8_t
checksum2;
uint8_t
数据(HERKULEX_PACKET_RX_MAX_DATA);
uint8_t
status_error;
uint8_t
status_detail;
HerkulexPacketError错误;
};
类
HerkulexServo
;
类
HerkulexServobus.
{
民众:
HerkulexServobus.
(流&serial_connection);
无效
sendPacket
(
uint8_t
id, HerkulexCommand cmd,
Const.
uint8_t
*数据=
nullptr
,
uint8_t
data_len =
0
);
赃物
sendPacketAndReadResponse
(HerkulexPacket职责,
uint8_t
id, HerkulexCommand cmd,
Const.
uint8_t
*数据=
nullptr
,
uint8_t
data_len =
0
);
无效
更新
();
赃物
getPacket.
(HerkulexPacket包);
#
如果定义了
HERKULEX_DEBUG_RX_STATS
无效
resetRxStatistics
();
无效
printrxstatistics.
(流和输出);
#
万一
无效
prepareIndividualMove
();
无效
准备同步帆
(
uint8_t
播放时间);
无效
executeMove
();
保护:
流* m_serial;
CircularBuffer <
uint8_t
,herkulex_serial_rx_buffer> m_rx_buffer;
无符号
长
m_last_serial =
0
;
HerkulexPacket m_rx_packet = {};
赃物
m_rx_packet_ready =.
假
;
uint8_t
m_tx_buffer [herkulex_serial_tx_buffer];
uint8_t
m_move_tags =.
0
;
Herkulexschedulestates m_schedule_state = herkulexschedulestate :: none;
#
如果定义了
HERKULEX_DEBUG_RX_STATS
uint16_t
m_stats_attempts [herkulex_packet_retries] = {};
uint16_t
m_stats_fails =.
0
;
uint16_t
m_stats_totals =
0
;
#
万一
无效
processpacket.
(
赃物
超时);
朋友
类
HerkulexServo
;
};
类
HerkulexServo
{
民众:
HerkulexServo
(Herkulexservobus&Bus,
uint8_t
ID);
无效
重返者
(HerkulexRamRegister注册,
uint8_t
val);
无效
writeRam2
(HerkulexRamRegister注册,
uint16_t
val);
无效
Wreiteep.
(Herkulexeepregister reg,
uint8_t
val);
无效
WRITEEEP2.
(Herkulexeepregister reg,
uint16_t
val);
uint8_t
Readram.
(Herkulexramregister reg);
uint16_t
ReadRam2.
(Herkulexramregister reg);
uint8_t
readEep
(HerkulexEepRegister注册);
uint16_t
readEep2
(HerkulexEepRegister注册);
无效
重启
();
无效
rollbackToFactoryDefaults
(
赃物
跳过,
赃物
skipBaud);
uint8_t
getid.
();
无效
的getStatus
(HerkulexStatusError &status_error, HerkulexStatusDetail &status_detail);
uint16_t
格子
();
uint16_t
getrawposition.
();
无效
setLedColor
(HerkulexLed颜色);
无效
setTorqueOn
();
无效
settorweyoff.
();
无效
setBrake
();
无效
enutionPositionControlMode.
();
无效
EnableSpeedControlMode.
();
无效
setPosition
(
uint16_t
pos机,
uint8_t
游戏时间=
0
, HerkulexLed led = HerkulexLed::忽略);
无效
setspeed
(
int16_t
速度,
uint8_t
游戏时间=
0
, HerkulexLed led = HerkulexLed::忽略);
保护:
HerkulexServoBus * m_bus;
uint8_t
m_id;
Herkulexled M_LED = Herkulexled :: Off;
赃物
m_position_control_mode =
真正的
;
静态
HerkulexPacket m_response;
静态
uint8_t
m_tx_buffer [
5
];
无效
慢跑
(
uint8_t
JOG_LSB,
uint8_t
JOG_MSB,
uint8_t
集,
uint8_t
播放时间);
};
#
万一