TMCM-6214模块控制

TMCM-6214模块控制

1.TMCL™ commands,

内部使用TMCL语言编程,

2.两种工作模式

Direct Mode 直接模式,由上位机控制

standalone operation 独立模式,在下位机独立运行

注意:两种模式是可以共存的。数据的交互主要是通过A 寄存器和X 寄存器。以及一些全局变量。

3.组成

tmc5160 motor controller

motor driver

4.接口:RS232 RS485 CAN USB

5.原理图

image-20240527162226197

6.TCML直接模式的数据格式

直接模式的二进制格式

(7字节 1+1+1+4)1byte 命令域 1 byte 类型域 1byte motor/bank域 4byte 数值域

can是7个字节

串口和usb中是9个字节

1个地址+7byte +1个校验字节

image-20240530134600000

image-20240530134816640

7.standalone mode编程

1.TMCL基础语法

常数
#include test.tmc
//常数
Speed = 1000
Speed2 = Speed/2
Mask = $FF /*16进制*/
Binary Value = %1010101 /*二进制*/
​
​
运算函数和运算符

image-20240527183155299

image-20240527183222999

ROL 0,7+9*8
Speed2=Speed*SIN(0.5)
MVP ABS,0,3*1000
Sin90=Sin(Rad(90))
标签
Loop: MVP ABS,0,1000
      WAIT POS,0,0
      WVP ABS,0,0
      WAIT POS,0,0
      JA Loop
注释
  1. //这是注释
    ​
    ​
    使用变量在TMCL/PC 和TMCL program之间通信  
    模式1:主机使用SGP命令改变用户变量的值,TCML主程序去轮询变量的值
    模式2:TMCL程序修改用户变量的值,让主机去使用GGP命令轮询
    模式3:通过PC在直接模式下下命令来启动standlone模式的程序。
    通过修改全局参数#77来控制stand-alone程序开机启动
    ​
    SGP  //设置用户变量为常数
    GGP  //读用户变量的值到Accumulator register
    AGP  //复制 AG的值到用户变量中
    STGP //保存用户变量的值到EEPROM
    RSGP //读EEPROM的值到用户变量中

8.TCML独立模式的命令学习

1.设置参数(轴参数 全局参数)

注意:轴参数掉电丢失,全局参数掉电可恢复,用户参数需要手动保存到内存中

SGP

与电机控制不是直接相关的描述参数都放在全局变量里面。这个命令可以设置全局全局变量和用户变量。

全局变量域与主机接口 外设 应用的参数有关。 这些参数被划分为不同的组,以方便扩展未来产品的更多数量。

bank0 ------全局变量的。 (注意:bank0的设置会自动的保存在非易失的内存中,这个保存只有在独立模式下生效,在直接模式下不会自动保存)

bank2 ------用户变量。

bank3 -------用来做中断相关的配置。。

GGP
SAP (参数不会保存到内存中)

这个命令用来描述大部分的电机运动控制参数。有一个表格描述了paramter number对应的含义。具体的见第9章axis parameter描述

SAP <parameter number>,<axis>,<value>

注意:这些设置可以保存在SRAM,因此他们是易使的,断电数据就会丢失

GAP
SGP <parameter number>,<bank>,<value>
SGP 66,0,3 //set serial address of the the device to 3
GGP 66,0
STGP <parameter number>,<bank>
STGP 42,2
RSGP 42,2
STGP

永久的保存全局变量在模块的内存里面。主要是存bank2(user variable),

注意:因为其他的变量(全局变量)会自动保存。

RSGP
SIO
SIO <port number>,<bank number>,<value>
SIO 0,2,1//bank=2 digital input
Loop:
    GIO 255,0
    SIO 255,2,-1 //user a resigter value
    JA Loop

//port=0,bank=0 是特殊用途,控制上拉二极管的输入状态。

SIO 0,0,0 //All off
SIO 0,0,1 //motor 0,1,2:on motor 3,4,5:off
SIO 0,0,2 //motor 0,1,2:off motor 3,4,5:on
SIO 0,0,3 //motor 0,1,2:on motor 3,4,5:on
​
//IO port=8,9 bank=0 使用来控制ADC的范围
SIO 8,0,0 //ADC0:0...+10v value=1:0-20 value=2:-10v-+10v
SIO 9,0,1 //ADC4:0...+10v

GIO
GIO <port number>,<bank number>
//get the value of ADC channel 0
GIO 0,1
GIO 255,0 //read all general purpose input(not the STO inputs)
不同的bank对应的含义

bank=2 数字输出的状态

bank =1 是模拟的输入

bank=0 数字的输入

注意:模式输入既可以同时被读作模式输入和数字输入。模式值在bank1获取,数字值在bank0获取。

//GIO 的bank1对应的模拟输入的值,可以获取一些特殊的IO的值

image-20240531092028584

image-20240531092440929

image-20240531092536448

SIV

这个命令用来复制一个直接数到用户变量中。这个用户变量的索引由X寄存器指出。X寄存器的索引范围是0-255,超出这个范围无效

SIV 3 //将数值3复制到X寄存器索引指定的用户变量

GIV

读用户变量并将他的内容复制到A寄存器。具体是哪个用户变量是根据X 寄存器的索引指定的。

//读取X寄存器指定的用户变量的值
GIV
AIV

复制累计器的值到用户变量中,具体哪个用户变量也是有X寄存器控制的

AIV //复制累计器的值到用户变量中
AAP

复制累加器的值到轴参数中,一般是使用场景是,通过GAP获取参数值,然后又通过运算改变了值,再将值存在轴参数中,让其生效

AAP <parameter number>,<motor number>
Start:
    GIO 0,1//get value of analog input line 0
    CALC MUL,4 //multiply by 4
    AAP 0,0 
    JA Start

AGP

复制累加器的值到全局变量中,当全局变量被CALC或者CALX运算修改值,将其保存回来

AGP <parameter number>,<motor number>
AGP 42 2
ACO

复制累加器的值到坐标中,根据全局参数#84,坐标可以被设置为存在RAM中,或者存在内存中在启动的时候复制回去, 默认是存在RAM中的

Copy the actual value of the accumulator to coordinate #1 of motor #0.
ACO <coordinate number>, <motor number>
ACO 1,0

2.运算指令

注意1:累加器也叫做A寄存器,当运行在独立模式时,所有读值的命令都将结果存在累加器中。 当进行一些计算时,X寄存器可以用作附加的内存,他可以从累加器中加载数值

注意2:在直接模式下读一个数值并不会影响到累加器,所以在独立模式运行的同时,主机可以通过直接模式的方式去获取轴参数和全局变量)

注意3:指令名后面只有一个字母的时候,结果存放在累计器中;有两个字母的时候结果存放在第一个字母所指的变量中

CALC

(累加器和直接数之间的数学运算)

CALC <opreration>,<operand>
CALC MUL,-5000

image-20240530164517905

CALCV

用户变量和直接数之间的运算

COMP 0
COMP

与A寄存器的值做比较,将结果存在内部算法状态标志中来控制JC,所以COMP和JC一般是一组

COMP <operand>
GAP 1,0//get actual positon of motor 0
COMP 1000 //compare actual value with 1000
JC GE,Lable //jump to Lable if greater or equal to 1000
JC <condition>,<label>

image-20240530170451521

CALCX

累加器和X寄存器之间的数学运算,j结果还是保存在累计器中

CALCX <operation>
CALCX ADD
​
CALCVV

两个用户变量之间做运算,将结果存在第一个用户变量中

CALCVV <operation>,<var1>,<var2>
CALCVV SUB,65,42 //将用户变量65减去用户变量42的值

CALCVA

修改用户变量的值,用户变量和累加器之间的数学运算

CALCVA <operation>, <var>
CALCVA SUB,27 //从用户变量27中减去累计器的值

CALCAV (用户文档有一个错误)

修改累计器的值,累加器和用户变量之间的数学运算

CALCAV <operation>, <var>
CALCAV SUB,27 //从累计器中减去用户变量27的值

CALCVX

用户变量和X寄存器的数学运算,修改用户变量

CALCVX <operation>, <var>
//Subtract X register from user variable #27.从用户变量中减去X寄存器
CALCVX SUB,27

CALCXV

修改X寄存器,X寄存器和用户变量之间的数学运算

CALCXV <operation>, <var>
//将X寄存器的值减去用户变量27的值

3.分支

注意:COMP运算符和所有的条件分支语句一起使用,条件判断根据的是COMP的运算结果

JC 条件跳转
JC <condition>, <label>
GAP 1,0
COMP 1000
JC GE,Label
...
Lable:ROL 0,1000
​

JA绝对跳转
JA <label>

CALL

条件满足时调用子分支

CALL <condition>, <label>
Loop:
    GIO 0,1
    CALC SUB,512
    COMP 0
    CALL LT,RunLeft //call routine "RunLeft" if accu <0
    JA Loop
RunLeft:
    CALC MUL,-1
    ROLA 0
    RSUB
    

image-20240531103126271

CSUB

进入子函数 :最多只支持8层嵌套

注意:CSUB和RSUB一般是成对出现

CSUB <label>
Loop:
    MVP ABS,0,10000
    CSUB subW //save program counter and jump to label SubW
    MVP ABS,0,0
    CSUB SubW
    JA Loop
SubW:
    WAIT POS,0,0
    WAIT TICKS,0,50
    RSUB//continue with the command following the CSUB command
RSUB 从子函数返回
COMP

比较累加器和一个常数,结果提供给分支使用

COMP <operand>

循环

DJNZ 如果用户变量大于0,则递减用户变量并跳转。实现类似于for循环的功能

//Loop 循环100次
SGP 42,2,100
Loop:
    MVP ABS,REL,51200
    WAIT POS,0,0
    WAIT TICKS,0,500
    DJNZ 42,Loop
​
RST

在程序的任何地方重启冲虚,重启程序可以从指定的地址

RST <label>
Entry:
    MVP ABS,0,51200
    CSUB Subroutine
    ...
    ...
Subroutine:
    RST Entry
    RSUB

STOP

停止运行

RETI

从中断返回

4.关于中断

TMCL中有多种不同的中断,比如定时器中断,切换中断,位置到达中断,IO口值变化中断,每种中断都有其对应的中断向量,这个中断函数由中断号来标识

进入中断分支后,当前上下文的A寄存器和X寄存器以及标志位都会被自动保存起来。退出中断后,上下文又会自动恢复。

有一些中断需要更多的配置,比如定时器中断需要时间间隔的参数、可以通过设置bank 3的全局参数来实现. 表3.6.7

SGP <type>,3,<value>

导入Interrupts.inc 来包含中断号的符号常量,固件说明书p21

EI

使能中断

EI <interrupt number>

DI
DI <interrupt number>

去使能中断

VECT
VECT <interrupt number>, <label>

设置一个中断矢量(中断函数)

RETI

从中断中返回

image-20240530145504684

image-20240530145523192

image-20240530145623644

使用中断的步骤

1.定义一个中断向量

2.设置中断的参数(不是必须)

3.使用EI命令使能中断

4.全局的使能中断,使用EI 255命令

5.中断向量的分支里面必须包含RETI命令

6.不要让正常的程序流进入中断处理程序中

VECT 0,Timer0Irq
SGP 0,3,1000
EI 0
EI 255
//main program
Loop:
	SIO 3,2,1
	WAIT TICKS,0,50
	SIO 3,2,0
	WAIT TICKS,0,50
	JA Loop
Timer0Irq:
	GIO 0,2 //查询out0是不是高
	COMP 1
	JC NZ,Out0off //jump if not
	SIO 0,2,1 //switch out0 to high
	RETI //end of interrupt
Out0off:
	SIO 0,2,0 //switch out0 low
	RETI
#include Interrupts.inc
	VECT TI_TIMER0,Timer0Irq
	SGP TI_TIMER0,3,1000
	EI TI_TIMER0
	EI TI_GLOBAL

5.等待函数

WAIT

在条件满足之前,打断程序的执行。条件满足时,程序继续执行。等待特定的事件到达

WAIT TICKS, <motor number>, <ticks>
WAIT POS, 0, 0
时间的类型有:

TICKS ----时间满足要求

POS --位置满足要求,还需要设置一个最长等待时间(0 for no timeout)

REFSW 等待由电机参数指定的电机参考开关被触发,同上设置时间

LIMSW 电机限位开关被触发,同上设置时间

RFS 搜索满足条件,同上设置时间

image-20240530171924663

6.运动指令

ROR
ROL
MST
MVP

补充一下利用坐标来运动;

MVP ABS,0,10000
MVP REL,0,-10000
MVP COORD,0,8
MVP CORD,$47,2 //#01000111 //第6位设置为使用插值方式移动多个电机,0-5位分别代表一个电机
//这里是让0,1,2电机同时运动到坐标2 注意是同时运动到目标位置

MVP CORD,$85,5 //#10000111 //第7位用来设置为多电机运动不插值(6个轴独立运动)
//使用插值方式移动电机0,1,2到坐标5
//CORd

MVPA

移动到累加器的位置

MVPXA

移动到由累加器指定的位置,并由X寄存器指定的电机位置。,

ROLA
RORA
ROLXA
RORXA
MSTX
SCO 存储坐标

系统中有单独分配一片内存用来存储坐标

SCO 1,0,1000//设置电机0的坐标#1为1000
SCO,0,255,0//储存所有坐标到内存中
SCO,0,0,255//恢复所有的坐标

CCO 获取坐标
CCO 3,0//捕获0轴的实际位置到坐标3中

GCO 获得坐标
GCO 0,255,0//从内存中恢复坐标
GCO 1,255,0 //从内存中恢复指定轴的坐标

10.Axis Parameter

• Bank 0: Global configuration of the module.

• Bank 1: Not used.

• Bank 2: TMCL user variables.

• Bank 3: TMCL interrupt configuration.

SGP 77, 0, 1 in direct mode (using the Direct Mode tool in the TMCL-IDE).来控制独立模式的程序开机运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值