找回密码
 注册
关于网站域名变更的通知
查看: 422|回复: 2
打印 上一主题 下一主题

串口转can通信控制伺服电机

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-26 14:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
$regfile = "m128def.dat"                                    '单片机型号头文件
. P" \, Y+ A4 |: |6 r$crystal = 8000000                                          '晶振频率
  I) h2 `6 d4 {5 V0 u7 ^$baud = 19200$ L" d# k0 F2 ?2 J$ t
$hwstack = 256) x& V1 L4 r* _
$swstack = 256
: D) |" \  E; y$ `, k  c$framesize = 2569 E) C2 f3 N: e6 c# e3 S5 D

. @6 h& V4 e: C+ `+ a! M* hDeclare Sub Send(byval Str_code As String)
' U9 d  p, ^. t5 k; O1 r; `
# D% ]  \! u6 W, r. T  f  uDeclare Function Can_data(byval Std_mode As Integer , Byval Data_length As Integer , _4 a2 I  Z! V  z+ N
                           Byval Func_code As String , Byval Node_id As String , _
1 u) X: q7 D7 b1 l% K# l                           Byval Str_data As String) As String
$ _) n8 v% C! n4 {, PDeclare Sub Set_enable(byval Node_id As String , Byval Ctrl_mode As Integer , Byval Value As Integer)
# c$ l  \7 V7 F8 Z  ]: c. C' I) {& @0 P) l
Config Portd = Output
" O2 K2 f/ E7 S. \6 c$ tConst Std_frame = 1                                         '标准帧
+ E2 G$ M! ~; oConst Ext_frame = 0                                         '扩展帧
& Q. t: r/ n$ a1 H7 k+ w' R! zConst Position_mode = 0                                     '位置模式
4 o6 u% ~7 V! IConst Speed_mode = 1                                        '速度模式
! a. h# V5 i/ D& X' i! M2 i, Q: r, ]0 [) d& g( }4 w- h4 n! r8 l
Dim Can_code As String * 26/ C; P8 Z4 a/ \' c0 G; B

% |! L7 o+ L! Q  y! a5 Z) L. d9 y3 JPortd = &HFF9 z& `7 `$ _% Y% ?2 D! Y0 o
Wait 12 j% i/ e+ D) [6 f+ l) s# A0 Z7 s
'1号伺服位置模式上使能
+ C9 F- m" j& E, f3 f4 }Set_enable "01" , Position_mode , 1
  Y( b# w6 M5 O5 j* L  O) VPortd.3 = 0
( T) V1 @9 L; b0 ?' w$ iWait 1
) Q' E# z% ]; o1 a'2号伺服速度模式上使能
* P3 c; A* U4 ~+ B- J8 WSet_enable "02" , Speed_mode , 12 z( W3 D" V! ~+ z7 b; F. K
Portd.4 = 0# I1 K$ Y; o- d! V+ Q
Wait 103 P/ S; J1 y9 V0 I
; ~2 |+ b9 L2 C* f) N  X1 f
'1号伺服掉使能. k: J; o  I3 \- d
Set_enable "01" , Position_mode , 04 s* l$ U" P! \  \
Portd.3 = 1" G+ U; B: D" N" M" V) y
Wait 1' N3 T5 d7 {3 H& Q" Z& e$ k% W
'2号伺服掉使能: `( x& e4 i1 K, I: e5 j0 w
Set_enable "02" , Speed_mode , 0  ?# J; f2 F" H; }3 w5 L0 r( a1 T
Portd.4 = 1
- u- F& g2 _  w: _Wait 1
0 j5 _9 t6 t3 `  m1 W6 U* {
. {7 l2 r% K( t% p# X( _4 rEnd  R, A  y: O( O) U% p+ _

: m* w, k& ?1 _, z'按值发送
/ ]' x3 O2 K: p2 R# y: eSub Send(byval Str_code As String )* ?, B/ g* ]2 e6 `2 R. x" F7 I
    Local I1 As Integer , Mystr As String * 4 , Mybyte As Byte , Length As Integer2 M, ]' v: k* w7 M
    Length = Len(str_code)
6 Q9 s; f% L3 {6 r& ]+ L    For I1 = 1 To Length Step 2* D% k* k' ?. }1 P9 }8 W
        Mystr = Mid(str_code , I1 , 2)
( d  p. T  t  J4 m" j4 R& t        Mybyte = Hexval(mystr). J( E4 w5 T6 n# T+ |9 j
        Printbin Mybyte& F* ~' s/ }! q% _$ G+ h6 F$ I. S
    Next5 o0 p% C* p- t+ A
End Sub
. T4 B& v' m# l" |2 S/ P* U0 G( f4 F3 O. N2 _
'Can帧数据Std_mode=1为标准帧=0为扩展帧,
4 ^8 E, J" A- e4 `$ r! \# y! g6 n8 t'Data_length为数据区长度最大8字节,
  E/ R" m" t5 N. m'Func_code为功能码一个字节,
2 j& @7 Z+ I1 \" h'Node_id为节点ID一个字节,  R' _: H" w+ ^# o" G
'Str_data数据区十六进制字符串,最大8个字节) K+ T9 }" O( _5 x
Function Can_data(byval Std_mode As Integer , Byval Data_length As Integer , _
5 g2 o) s$ {6 |" M0 t1 Y                  Byval Func_code As String , Byval Node_id As String , _8 `; V5 b! G/ u4 D% }$ U
                  Byval Str_data As String) As String+ n1 n: p) z' i1 B3 m* e  J3 {2 l
, |5 L' c3 d: s) U
   Local Count As Integer , Str_code As String * 26 , I As Integer( W+ @* {/ O( O
: u0 I% W% n3 H2 \# A2 ?
   Select Case Std_mode! i& b5 M# |  ]0 w, Z
   Case Is = Std_frame' }$ Y, F7 p* X3 e0 C# o
      Str_code = "0" + Str(data_length)                     '标准帧的第一个字符为0第二个字符为数据区的字节数(最大8字节)4 J/ Q- z9 L7 P, c& O1 n
   Case Is = Ext_frame) z' t& w. O4 m" w0 d- k
      Str_code = "8" + Str(data_length)                     '扩展帧的第一个字符为8第二个字符为数据区的字节数(最大8字节)$ X- Y) `+ l$ ?  d' c
   End Select% B! w! ]7 s0 f8 r) b( O6 V
) k& i* }+ f0 M
   Str_code = Str_code + "0000"8 L  f. j; A, F3 Y

& {1 Y$ k0 o- g) `' x9 }1 {   If Len(func_code) = 1 Then3 I9 y8 A6 S  c$ j6 ~" U. {  B
      Str_code = Str_code + "0"( l! R. m. q; K
   End If
# s- ?1 p$ ^  K( U+ w   Str_code = Str_code + Func_code6 I0 s8 S# k1 Y9 b! R/ L9 t5 R. ]

. e6 C0 J3 g7 T1 @   If Len(node_id) = 1 Then Str_code = Str_code + "0"7 s  W2 b) Z; Z  m/ p) C3 ^8 A
   Str_code = Str_code + Node_id( O0 I+ u9 |0 w0 z
4 E8 Q3 ]% u7 g3 @. P8 W
   Count = Len(str_data)/ L' ^' ]1 T8 J5 N4 i
   Count = 16 - Count
1 o) X: U3 L* H' D& B) _   Str_code = Str_code + Str_data3 I- K2 `' [% s6 R9 m6 }
   For I = 1 To Count
6 u  v* R: ~4 y      Str_code = Str_code + "0"
! \( K+ Q4 W7 u  k   Next I2 B; b7 X8 @) Y& p  j$ K
   Can_data = Str_code4 h7 j1 H; R% e' b( a1 v+ ~
End Function6 B3 Z) F2 i8 K' @

2 \* c' f4 g- m0 G8 _6 c'伺服驱动器使能Node_id为驱动器节点ID,2 J# J& X2 R* G7 T" j
'Ctrl_mode有两种模式,位置模式Position_mode = 0和速度模式 Speed_mode = 13 f0 P/ k8 a) _; \" x
'Value值设置非0为上使能,设置为0为掉使能0 I4 G5 Z! c" j/ X' K- Q
Sub Set_enable(byval Node_id As String , Byval Ctrl_mode As Integer , Byval Value As Integer)0 E! s+ ?' N* `+ y3 n
   If Value <> 0 Then
; `# M- a! h' c      '上使能4 ^5 I+ @& y- f; B0 u* L
      '02 00 00 02 0A 00 00 00 00 00 00 00 00   '控制字清0" C9 I# J$ n0 G/ y
      Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0000" )       '获得完整can报文# h! d4 O6 M6 f8 ~; }. j  a- F4 q
      Send Can_code                                         '发数据# O% P" L0 I$ M1 j$ q$ t
      Waitms 5
4 w0 t, d( b0 W; D      Select Case Ctrl_mode4 G& q$ o6 A# `4 B. O* d
      Case Is = Position_mode
7 B1 g- s; S0 f" S! h        '01 00 00 03 0A 01 00 00 00 00 00 00 00    '速度模式/ f/ O* {# \4 G4 M9 O3 E+ [
        Can_code = Can_data(std_frame , 1 , "03" , Node_id , "01" )       '获得完整can报文
! N" N8 B$ c1 P3 r' h0 r9 L; o        Send Can_code                                       '发数据# c4 U) l: i5 T3 F( K- n
        Waitms 5
: [) n! t0 i+ U" L4 T2 Q      Case Is = Speed_mode8 |* M- [5 h2 {& M$ ^; q% c
        '01 00 00 03 0A 03 00 00 00 00 00 00 00    '位置模式
/ a/ J( B; u+ O" K% Z        Can_code = Can_data(std_frame , 1 , "03" , Node_id , "03" )       '获得完整can报文( C6 M  A2 _% e% N' f. n5 B
        Send Can_code                                       '发数据
: i& Z- j; c8 e* b        Waitms 5
7 ^2 g2 D3 Z, R0 j: C( ?& _  a      End Select
& V9 v  |8 H$ |# u      '02 00 00 02 0A 06 00 00 00 00 00 00 00   '始能第一步
3 |; y$ p% `1 {, l+ j      Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0600" )       '获得完整can报文+ l9 v& [/ ^) Z' M
      Send Can_code                                         '发数据( [: k& b! _! f8 b6 Y' U/ |
      Waitms 5
1 Q/ k" c, n6 @+ k9 O, ]      '02 00 00 02 0A 07 00 00 00 00 00 00 00   '始能第二步' |9 p, K3 A: T) o
      Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0700" )       '获得完整can报文% O$ H1 [; l- V# X/ H" ]
      Send Can_code                                         '发数据
# h( j& ^0 Y. G6 ]. D      Waitms 5
; ]! U+ [' z+ B- B* a% o& `      '02 00 00 02 0A 0F 00 00 00 00 00 00 00   '始能第三步6 U6 ]9 I- @7 e9 B
      Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0F00" )       '获得完整can报文
2 b0 g, z! B2 c+ C7 ^      Send Can_code                                         '发数据9 J+ Z8 G+ w5 `" ~6 y# i
      Waitms 5" O! j1 d) M- o, v5 M$ V) O5 W* B
   Else' V# L* }' d0 c- a0 I0 V
      '掉使能02 00 00 02 0A 05 00 00 00 00 00 00 00: t' {; k& R) Z" b6 d, ]/ p: ^
      Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0500" )       '获得完整can报文  ?  q6 X5 P& N- t0 @/ `# C/ A
      Send Can_code                                         '发数据
! r2 u" h- z7 b/ \( D   End If( J1 l5 k) a1 b5 ~. ]& K5 A
End Sub+ D; }/ E- a1 T7 K

该用户从未签到

2#
发表于 2021-9-26 14:55 | 只看该作者
感觉清零有些繁琐: f" U) q0 Z: T% P& N

该用户从未签到

3#
发表于 2021-9-26 17:31 | 只看该作者
学习了   感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-4 11:07 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表