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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
$regfile = "m128def.dat"                                    '单片机型号头文件7 t3 o  X$ \6 H% C3 ~
$crystal = 8000000                                          '晶振频率
/ x& X6 H, ?% ?" \, m$baud = 19200- K  v* u& H  H5 @
$hwstack = 256
! E0 s8 K! v/ \* m$swstack = 256
" L) S: |/ l3 q; r) t$framesize = 256/ Y0 A) T) A. [. ?
0 q$ T: P2 d' e+ c/ Z: ^
Declare Sub Send(byval Str_code As String)) v" D' j% S  ?1 j3 V* g, j
: e" Q* G, b, o6 ]" X. Y) j
Declare Function Can_data(byval Std_mode As Integer , Byval Data_length As Integer , _
, ~1 i3 B1 ?( S                           Byval Func_code As String , Byval Node_id As String , _; _" Q2 [# ?$ u& Y. i# ^
                           Byval Str_data As String) As String
* o' V! g3 p6 ]* P3 o  u2 ZDeclare Sub Set_enable(byval Node_id As String , Byval Ctrl_mode As Integer , Byval Value As Integer)
0 @  e1 d( _( `. t
; A+ G3 R0 z& p' EConfig Portd = Output
* ]. n3 W5 y" H- H1 X* `Const Std_frame = 1                                         '标准帧  s5 D) R' z! e3 d
Const Ext_frame = 0                                         '扩展帧: T6 O+ m- ?. ?3 N: y, c
Const Position_mode = 0                                     '位置模式
- D) Y3 P9 F1 s) C; `  v* x, v1 H; QConst Speed_mode = 1                                        '速度模式
+ z- a1 t* Q5 n' J$ A0 F: ?+ y/ B$ v  P; _4 o
Dim Can_code As String * 269 b% Y& K' G+ s& O

5 `% c6 ?8 ^5 BPortd = &HFF% C! N7 h. o6 b
Wait 1( N8 h: k0 L3 n  c, O5 D
'1号伺服位置模式上使能0 j: l7 i& y$ `0 R3 S! V; c) o% k
Set_enable "01" , Position_mode , 1, w3 h/ q9 h+ h- w/ y
Portd.3 = 0
" L3 Y, f# D* R, gWait 1
/ X% {0 o/ k# w7 p: x'2号伺服速度模式上使能
: M. F0 @. X9 U* PSet_enable "02" , Speed_mode , 1
& K# c5 q# }6 V  {* q3 z9 sPortd.4 = 0
% \! N( G: H3 O( U# e6 |8 h3 kWait 108 X+ {( T/ A/ }7 Z0 ~* x& }% c( }, P( `
; L3 e3 n: I: L/ ~' N+ `3 b* p
'1号伺服掉使能: H2 \& U( n' U
Set_enable "01" , Position_mode , 0
: Y* }( K- R* O, [8 K6 ^( jPortd.3 = 13 ]! X0 b% y  g% O4 h5 A
Wait 1/ H; ~+ M4 U$ l) I" Z# H  E
'2号伺服掉使能# c) b1 f/ ]. V5 S
Set_enable "02" , Speed_mode , 0+ v# t% L& Z0 P: h  W9 H
Portd.4 = 1( ]% L) o2 W. l
Wait 1% `( `: Y3 W* N, p4 ~/ J6 w- G

8 a: e; D  `$ x) {End: P# L+ F8 O) h$ ^. y5 s- ^6 Q

& _2 o% X; r0 M, l" i'按值发送
- |" W$ e# s1 \Sub Send(byval Str_code As String )' o. K. e4 S( C% C
    Local I1 As Integer , Mystr As String * 4 , Mybyte As Byte , Length As Integer
4 N2 a3 B+ S% f6 Q2 C    Length = Len(str_code)
$ N$ a, g& {  v) k( W' ^    For I1 = 1 To Length Step 2
9 b8 P) t# [( {        Mystr = Mid(str_code , I1 , 2)
5 a5 H3 L6 y% B( ?$ o; s        Mybyte = Hexval(mystr)0 _( T) g4 _. Y+ a
        Printbin Mybyte
; E3 o% T) d4 s$ d  |- T/ @' F    Next( Z/ t/ h( ?. R7 `
End Sub
, t! i$ |, S! i3 Z0 B
: X; n0 j5 s& V; `* A+ \# z'Can帧数据Std_mode=1为标准帧=0为扩展帧,  v9 j: x4 U6 R' q1 [8 r
'Data_length为数据区长度最大8字节," X! L! R9 L5 r( g" i
'Func_code为功能码一个字节,; l) \1 n6 K6 t. I' ]) n& n
'Node_id为节点ID一个字节,
+ b. |* y- C  p8 k* y- i'Str_data数据区十六进制字符串,最大8个字节$ M: T! [; J4 ]+ A4 p* Z8 }
Function Can_data(byval Std_mode As Integer , Byval Data_length As Integer , _
5 D0 @3 n8 f  v4 U2 B                  Byval Func_code As String , Byval Node_id As String , _, B6 a( G" m( o' Q/ w# q7 o5 o
                  Byval Str_data As String) As String
0 U7 {. c% G1 I. \1 n: Q
% |4 d! N& i- V  h, {! K   Local Count As Integer , Str_code As String * 26 , I As Integer4 l; o9 W: Y& ?8 ]" G

! o0 D2 |6 o$ ^- B, Q+ h5 S   Select Case Std_mode
7 j. k; C' G7 y( [: z6 g3 ~3 z9 a   Case Is = Std_frame
& g$ G3 @) M& _7 Y6 K9 l7 @0 o4 k      Str_code = "0" + Str(data_length)                     '标准帧的第一个字符为0第二个字符为数据区的字节数(最大8字节), _& ]; l; u+ \* p( p+ S3 m2 Q6 _
   Case Is = Ext_frame
  I6 v% K) n- V2 v      Str_code = "8" + Str(data_length)                     '扩展帧的第一个字符为8第二个字符为数据区的字节数(最大8字节)/ S7 p2 |5 T$ |5 ~" q/ \
   End Select
: l( b, @5 L1 ?3 Z$ R* r) G) U8 G& A; W+ K8 A; H
   Str_code = Str_code + "0000"7 W/ G' k" |% _( n" H4 X& Q
- b% C3 n% r. X, ]0 g
   If Len(func_code) = 1 Then
2 D1 R# }7 i3 Y& n; b      Str_code = Str_code + "0"
- Y7 j- \" S1 M" t   End If
2 d0 ?. T6 [. q5 W+ \" c/ N0 S1 J   Str_code = Str_code + Func_code
! M$ b% l* z* J$ \" W+ Q( R& W& ~: {- k/ Z! H4 x% N% m; x2 `
   If Len(node_id) = 1 Then Str_code = Str_code + "0"6 U) I' `! Y4 K+ Q3 w8 O
   Str_code = Str_code + Node_id
+ d6 F% X  E0 x* S) B6 ~- r3 c& Q9 G8 o9 p' s
   Count = Len(str_data)( z/ f* c# K* M& A: x/ {* z
   Count = 16 - Count
$ X" M$ c5 N* U6 z   Str_code = Str_code + Str_data1 h+ B. a& J' }0 |" [0 h/ W% C* j
   For I = 1 To Count
9 E* y4 ], o7 @! p( J$ _3 T      Str_code = Str_code + "0"
( |2 {! [1 N/ a   Next I
9 a, ]( P4 r, V$ _7 W9 _/ U+ u$ F   Can_data = Str_code
! M% V( Y1 g. a+ S: {5 T0 W1 yEnd Function+ A( P- W& P  s4 T" s
9 e5 G. L' z4 T/ |( [
'伺服驱动器使能Node_id为驱动器节点ID,1 B  P7 ^+ D% h  G4 L1 U3 X3 X* I; H/ Q
'Ctrl_mode有两种模式,位置模式Position_mode = 0和速度模式 Speed_mode = 1
9 `2 K  r: q9 S2 Q; g; }& k'Value值设置非0为上使能,设置为0为掉使能7 G3 E# I2 Q% S# C( p/ D
Sub Set_enable(byval Node_id As String , Byval Ctrl_mode As Integer , Byval Value As Integer)
$ _6 h8 Q( ?. g0 w- C   If Value <> 0 Then. m1 G6 O$ M9 C
      '上使能
. O, S. u9 j( q* p8 v      '02 00 00 02 0A 00 00 00 00 00 00 00 00   '控制字清01 R3 a. W( E/ a* B  [& j% U
      Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0000" )       '获得完整can报文
+ [) n  f* U$ Y  v      Send Can_code                                         '发数据
% v! ~6 L- z% g: N  P, V( Y4 }      Waitms 5- P# r9 \2 M! |, G
      Select Case Ctrl_mode! s( x/ z1 f+ c2 n, [
      Case Is = Position_mode% x( d. |6 O1 A3 E' F/ b
        '01 00 00 03 0A 01 00 00 00 00 00 00 00    '速度模式4 f& t- i7 G, p  [
        Can_code = Can_data(std_frame , 1 , "03" , Node_id , "01" )       '获得完整can报文
, |8 t& T( b4 M: n        Send Can_code                                       '发数据
( `: R6 `6 S: t2 p+ [- B        Waitms 5  |3 n7 ^' c+ Y
      Case Is = Speed_mode% V% S8 |# [6 {- u, M6 r
        '01 00 00 03 0A 03 00 00 00 00 00 00 00    '位置模式
+ n! C& E& \; f! I' O        Can_code = Can_data(std_frame , 1 , "03" , Node_id , "03" )       '获得完整can报文# T+ K- V/ {8 \; _( M8 Z  m
        Send Can_code                                       '发数据
4 M8 u4 W6 e: [" B$ i' u        Waitms 54 n$ q. N% A$ ^& V
      End Select9 y) {4 z2 N' {& Q2 V1 R
      '02 00 00 02 0A 06 00 00 00 00 00 00 00   '始能第一步
: O, d" Y0 q2 F% }      Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0600" )       '获得完整can报文
7 P6 b/ ]8 ]" O, u* p; [      Send Can_code                                         '发数据1 O- j8 c& ^# ?( y8 @' `
      Waitms 5: B& P# ~6 @9 ^6 N6 R
      '02 00 00 02 0A 07 00 00 00 00 00 00 00   '始能第二步  Y5 y& a" z! H' S  w1 ^
      Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0700" )       '获得完整can报文+ p' Z* M5 z# K
      Send Can_code                                         '发数据" a& L7 r/ _- u* z; K9 f
      Waitms 5
; X3 X1 m% p/ H4 k( ]      '02 00 00 02 0A 0F 00 00 00 00 00 00 00   '始能第三步7 @: y5 J6 V2 }) d0 O9 ?9 z& Z
      Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0F00" )       '获得完整can报文: N9 d' n$ D- w1 q0 G: X
      Send Can_code                                         '发数据, X: A6 U- ?7 D
      Waitms 55 [4 C, X( c  B0 N' ^. a. z
   Else$ _7 \6 F# p( w% J( s
      '掉使能02 00 00 02 0A 05 00 00 00 00 00 00 00
0 |% B- V6 C8 Q$ }1 V      Can_code = Can_data(std_frame , 2 , "02" , Node_id , "0500" )       '获得完整can报文) T' `5 m' ^) p% M+ k( ~
      Send Can_code                                         '发数据7 X7 ^$ ]8 W, B& s' M: \$ b
   End If7 m7 z' M+ _0 D2 f  y: a
End Sub
% A. Y& Y+ P7 b. z. L( Q/ O9 ^

该用户从未签到

2#
发表于 2021-9-26 14:55 | 只看该作者
感觉清零有些繁琐
$ a0 E5 y# k( D4 l2 Y

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 23:18 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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