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.原理图
6.TCML直接模式的数据格式
直接模式的二进制格式
(7字节 1+1+1+4)1byte 命令域 1 byte 类型域 1byte motor/bank域 4byte 数值域
can是7个字节
串口和usb中是9个字节
1个地址+7byte +1个校验字节
7.standalone mode编程
1.TMCL基础语法
常数
#include test.tmc //常数 Speed = 1000 Speed2 = Speed/2 Mask = $FF /*16进制*/ Binary Value = %1010101 /*二进制*/
运算函数和运算符
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
注释
-
//这是注释 使用变量在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的值
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
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>
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
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
从中断中返回
使用中断的步骤
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 搜索满足条件,同上设置时间
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).来控制独立模式的程序开机运行