1、PCD4641驱动芯片
PCD4641总结
命令发送格式:
Axis selection code + command + data;即轴选择+命令+数据
Axis selection code://轴选择
S7 S6 S5 S4 S3 S2 S1 S0
B A
S7 S6:Device selection area;外部电平,芯片设备选中硬件DS0 DS1
S5:Type selection B
S4:Type selection A
S3:U axis selection:1
S2:Z axis selection:1
S1:Y axis selection:1
S0:X axis selection:1
S5 S4 Axis selection code
B A
0 0 写命令,写寄存器 ‘S7S600UZYX’,硬件ID=0,X=0x01,Y=0x02,Z=0x04,U=0x08
0 1 读命令,读状态 ‘S7S601UZYX’,硬件ID=0,X=0x11,Y=0x12,Z=0x14,U=0x18;
1 0 读取通用端口状态(相位等) ‘S7S610UZYX’,硬件ID=0,X=0x21,Y=0x22,Z=0x24,U=0x28;
1 1 读取主状态 ‘S7S611UZYX’,硬件ID=0,X=0x31,Y=0x32,Z=0x34,U=0x38;
写入命令:Axis selection code + command
Axis selection code X:0x01 Y:0x02 Z:0X04 U:0X08
举例:X轴写入以FL启动,0x01+ 0x15;
写入寄存器:Axis selection code + command + data_in[7:0] + data_in[15:8] + data_in[23:16]
读命令:Axis selection code + Read command + data_out[8bit start mode cmmand]
+ data_out[8bit control mode cmmand]
+ data_out[8bit regs cmmand]
读状态: Axis selection code + Read command + MSTS[7:0]+RSTS[7:0] + RSTS[15:8]
举例: Axis selection code+0x10
主状态MSTS:
bit0 :ISTP 停止时产生中断。 0-已开启,1-未开启
bit1 :ISDP ramping-down 产生中断。0-已开启,1-未开启
bit2 :ISTA 外部启动中断请求。 0-已开启,1-未开启
bit3 :BUSY 0-已停止,1-正在运行
bit4 :PLSZ 1- RMV=0;
bit5 :SDP 监控器通过一个下降点,1: RMV ≤ RDP
bit6 :FUP 1-加速
bit7 :FDWN 1-减速
扩展状态RSTS:
bit0 :SMEL 监控-EL电平,0-高电平,OFF;1-低电平,ON
bit1 :SPEL 监控+EL电平,0-高电平,OFF;1-低电平,ON
bit2 :SORG 监控ORG电平,0-高电平,OFF;1-低电平,ON
bit3 :SSTP 监控STP电平,0-高电平,OFF;1-低电平,ON
bit4 :SSTA 监控STA电平,0-高电平,OFF;1-低电平,ON
bit5 :SMSD 监控-SD电平,0-高电平,OFF;1-低电平,ON 负方向减速点
bit6 :SPSD 监控+SD电平,0-高电平,OFF;1-低电平,ON 正方向减速点
bit7 :SPHZ 励磁源位置监测器
bit8~bit11:监控PH1~PH4 信号,0-低电平,1-高电平
bit12:SMPO:监视-PO/DIR 方向信号,0-低电平,1-高电平
bit13:+PO/PLS 监视 脉冲信号,0-低电平,1-高电平
bit14:SPTS 监控OTS信号,0-低电平,1-高电平
bit15:SINT 监控中断请求
读寄存器:Axis selection code + Read command + data_out[7:0] + data_out[15:8] + data_out[23:16]
读取通用端口状态: Axis selection code + data_out[Port status]
读取主状态: Axis selection code +data_out MSTS[7:0]
X:0x31 Y:0x32 Z:0x34 U:0x38
命令列表
一、start mode command(启动/停止模式命令)
7 6 5 4 3 2 1 0
0 0 SCM5 SCM4 SCM3 SCM2 SCM1 SCM0
INT
INT:0 INT信号不输出,1-电机停止后会输出INT信号。
10H 中断关 停止状态:FL 恒速启动 运行状态:立即改变到FL 速度
11H 中断关 停止状态,FH 恒速启动 运行状态:立即改变到FH 速度
14H 中断关 停止状态,FL 恒速启动 运行状态:减速到FL 速度
15H 中断关 停止状态,FH 恒速启动 运行状态:加速到FH 速度
12H 中断关 停止状态:FL恒速保持起动 运行状态:禁止
13H 中断关 停止状态:FH恒速保持起动 运行状态:禁止
17H 中断关 高速保持起动 运行状态:禁止
08H - 运行状态:立刻停止
1DH - 运行状态:减速停止
二、control mode command(操作模式命令)
XX
------------------- [-]<- 操作方向 ->[+]---------------------
-EL ORG -SD +SD +EL
7 6 5 4 3 2 1 0
0 1 CCM5 CCM4 CCM3 CCM2 CCM1 CCM0
CCM0 :ORG 控制信号; 0:ignores ORG input,1:ORG input 为低,即刻停止或者减速停止
CCM1 :+SD,-SD控制信号(1-变为低电平是,开始减速到FL速度;0-忽略+SD -SD信号)
CCM2 :定位操作控制;0-操作不受RMV设置影响,适合连续模式;1-脉冲输出根据RMV设置的值,到了后,立即停止
CCM3 :方向选择,0-选择[+]方向,1-选择[-]方向;
CCM4 :OTS引脚输出,0-输出低电平,1-输出高电平;
CCM5 :0-直线加速度,1-S曲线加速度
举例:
limit 模式
CCM5 CCM4 CCM3 CCM2 CCM1 CCM0
01 0 0 0 0 1 0 :0x42 忽略原点信号,忽略RMV的值,线性加速度,[+]方向运动,遇到SD信号开始减速
01 0 0 1 0 1 0 :0x4A 忽略原点信号,忽略RMV的值,线性加速度,[-]方向运动,遇到SD信号开始减速
01 1 0 0 0 1 0 :0x62 忽略原点信号,忽略RMV的值,曲线加速度,[+]方向运动,遇到SD信号开始减速
01 1 0 1 0 1 0 :0x6A 忽略原点信号,忽略RMV的值,曲线加速度,[-]方向运动,遇到SD信号开始减速
ORG 模式
01 0 0 0 0 1 1 :0x43 原点信号停止,忽略RMV的值,线性加速度,[+]方向运动,遇到SD信号开始减速
01 0 0 1 0 1 1 :0x4B 原点信号停止,忽略RMV的值,线性加速度,[-]方向运动,遇到SD信号开始减速
01 1 0 0 0 1 1 :0x63 原点信号停止,忽略RMV的值,曲线加速度,[+]方向运动,遇到SD信号开始减速
01 1 0 1 0 1 1 :0x6B 原点信号停止,忽略RMV的值,曲线加速度,[-]方向运动,遇到SD信号开始减速
位置模式:RMV
01 0 0 0 1 0 0 :0x44 忽略原点信号,采用RMV的值,线性加速度,[+]方向运动,忽略SD信号
01 0 0 1 1 0 0 :0x4C 忽略原点信号,采用RMV的值,线性加速度,[-]方向运动,忽略SD信号
01 1 0 0 1 0 0 :0x64 忽略原点信号,采用RMV的值,曲线加速度,[+]方向运动,忽略SD信号
01 1 0 1 1 0 0 :0x6C 忽略原点信号,采用RMV的值,曲线加速度,[-]方向运动,忽略SD信号
01 0 0 0 1 0 1 :0x45 原点信号停止,采用RMV的值,线性加速度,[+]方向运动,忽略SD信号
01 0 0 1 1 0 1 :0x4d 原点信号停止,采用RMV的值,线性加速度,[-]方向运动,忽略SD信号
三、Reg selection command(寄存器选择命令)
7 6 5 4 3 2 1 0
1 0 RCM5 RCM4 RCM3 RCM2 RCM1 RCM0
RCM3~0 :寄存器选择
RCM4:0-经过ramping-down点不输出INT信号;1-经过ramping-down点 输出INT信号
RCM5:0-STA信号输入,INT信号不输出;1-STA信号输入,INT信号输出
RCM3~0
10 RCM5 RCM4 0000b :0x80 RMV bit23~bit0 输出脉冲的设定数。DCSP=0,会向下计数
10 RCM5 RCM4 0001b :0x81 RFL bit15~bit0 设置RFL速度
10 RCM5 RCM4 0010b :0x82 RFH bit15~bit0 设置RFH速度
10 RCM5 RCM4 0011b :0x83 RUD bit15~bit0 设定加减速特性
10 RCM5 RCM4 0100b :0x84 RMG bit15~bit0 设定的速度放大率
10 RCM5 RCM4 0101b :0x85 RDP bit23~bit0 设置减速点,在手动模式下, RPLS(number of remaining pulses) <= RDP,开始减速
10 RCM5 RCM4 0110b :0x86 RIDL bit7~bit0 设置空速脉冲数
10 RCM5 RCM4 0111b :0x87 RENV bit15~bit0 设置操作环境
10 RCM5 RCM4 1000b :0x88 RCUN bit23~bit0 当前位置计数器;PREV=0,[+]递增,[-]递减
10 RCM5 RCM4 1001b :0x89 --
10 RCM5 RCM4 1010b :0x8A RIOP bit7~bit0 设置和监控通用输入输出端口
10 RCM5 RCM4 1011b :0x8B RSPO bit7~bit0 监控SP0-SP5的设置
10 RCM5 RCM4 1100b :0x8C RSPM bit7~bit0 设置SP0-SP5
10 RCM5 RCM4 1101b :0x80 --
10 RCM5 RCM4 1110b :0x80 --
10 RCM5 RCM4 1111b :0x80 --
RENV:设置操作环境
bit15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
IPM4 IPM3 IPM2 IPM1 IOPM MSKM PREV PSTP ORRS ORDS ELDS SPDS ASPD DCSP 46MD PMD
0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 :0x4B
0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 :0x7B
0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 :0x87
PMD: 0-双脉冲模式;1-方向脉冲模式
46MD: 0-PCD45x1;1-PCD46x1;
DCSP: 0-每发一个脉冲递减,1-不计数。关联RMV
ASPD: 设置减速操作。 0-手动;1-自动;
SPDS: 外部STP输入停止方式。 0-立即停止,1-减速停止;
ELDS: 极限位(+EL –EL)停止方式。0-立即停止,1-减速停止;
ORDS: ORG 输入停止方式。0-立即停止,1-减速停止;
ORRS: 自动复位 RCUN。0-自动关闭,1-ORG信号为低时,自动清空
PSTP: 选择RCUN的计数操作。 0-计数每一个脉冲,1-停止计数
PREV: 选择RCUN的计数方向。 0-[+]方向加1,[-]方向减1。1-[+]方向减1,[-]方向加1。
MSKM: 0: PH1 = L, PH2 = L, PH3 = L, PH4 = L;1: PH1 = L, PH2 = L, PH3 = H, PH4 = H
比如需要向X轴 RMV寄存器写入值:
Axis selection code + RCM command + data
0x01 + 0x80 + data
然后写入操作模式,启动模式即可
四、output mode command(输入输出命令)
7 6 5 4 3 2 1 0
1 1 OCM5 OCM4 OCM3 OCM2 OCM1 OCM0
1 1 1 0 0 0 0 0 :0XE0 DIR->H [+]方向 无滤波
1 1 1 0 0 0 0 1 :0XE1 DIR->L [+]方向 无滤波
1 1 0 1 0 0 0 1 :0xd1 标准正脉冲输出模式 ?
1 1 0 1 0 0 0 0 :0xd0 标准负脉冲输出模式 ?
1 1 1 1 0 0 0 1 :0XF1 DIR->L [+]方向 滤波 扩展正脉冲输出模式 ?
1 1 1 1 0 0 0 0 :0XF0 DIR->H [+]方向 滤波 扩展负脉冲输出模式 ?
OCM0:关系到脉冲信号与方向信号:即+PO/PLSu,-PO/DIRu。脉冲模式下PMD=1,0CM=0 正方向为H,负方向为L; 脉冲模式下PMD=1,0CM=1 正反向为L,负方向为H;
OCM1:0-在电机运行时输出脉冲,正常模式;1-电机运行时不输出脉冲,位置计数模式;
OCM2:
OCM3:
OCM4:0-无滤波,1-滤波 Applying ORG, +EL, -EL, STP signal filter
OCM5:0-标准模式监控;1-扩展监控模式
初始化
1、OCM 选择输出模式,0XE0
2、设置环境参数 RENV(0x87),val=0x4B
3、设置速度放大倍数 RMG(0x84)
4、设置 RFL(0x81)、RFH(0x82)
5、设置加速度 RUD(0x83)
6、设置设置减速点 RDP(0x85)RENV.ASPD=0时,手动设置减速点
原点复位
1、写入操作模式命令 control mode command 0x4b[-],0x43[+] 原点信号停止,忽略RMV的值,线性加速度,[+]方向运动,遇到SD信号开始减速
2、启动 start mode command (FL 恒速启动 0x10)。读状态(Axis selection code+0x10 )。
3、停止后,清空 RCUN=0 当前位置计数器。
移动极限位:
1、写入操作模式命令 control mode command 0x4a[-]; 0x42[+]忽略原点信号,忽略RMV的值,线性加速度,[+]方向运动,遇到SD信号开始减速
2、启动 start mode command (FH 恒速启动 0x15)。读状态(Axis selection code+0x10 )。
移动到某一个位置:
1、读出当前位置,计算出RMV需要写入多少。
2、写入RMV。读状态(Axis selection code+0x10 )。
相关计算:
1、速度放大倍数 RMG 的计算
Output pulse speed [pps] = (a value in the register to set speed) × (speed magnification)
Speed magnification [times] = (reference clock frequency [Hz]) / (a setting value in RMG × 8,192)
输入参数:速度放大倍数Mul,求速度放大倍数参数RMG的值
参考值:4.9152MHZ 4915200HZ
#define Motor_clk 4096000
RMG_Val= Motor_clk/8192/Mul;
举例1:放大倍数Mul为1倍,Motor_clk为4915200HZ,求 RMG_Val ?
RMG_Val=4915200/8192/1=600=0x0258H
举例2:放大倍数Mul为600倍,Motor_clk为4915200HZ,求 RMG_Val ?
RMG_Val=4915200/8192/600=1=0x0001H
2、RFL的计算
细分数 p/r 即转一圈需要的脉冲数。
pps=pulse per second 即每秒的脉冲数。
首先注意单位:我们给的参数set_speed是 r/min,即可转每分钟。而RFL 单位是pps
输入参数:set_speed r/min;细分数 PluseNumPerCycle;速度放大倍数 Mul;求RFL?
set_speed/60 =r/s ;
set_speed/60*PluseNumPerCycle=pps;
set_speed/60*PluseNumPerCycle/Mul = RFL;
举例:如果将速度为60r/min,FL=60/60*25600=25600pps 。如果你将Mul=10倍,实际速度变为了600r/min
此时,除以FL/Mul=25600/10=2560pps,即变回了60r/min
所以通过上面得知,经过处理后RFL、RFH与放大倍数无关。
如果放大倍数固定,速度不能过大,否则超出了FL、FH的范围
3、RUD 加速度的计算
1.线性加减速
Acceleration / deceleration time [s] = (a setting value in RFH- a setting value in RFL) × (a setting
value in RUD) / (reference clock frequency [Hz])
2.曲线加减速
Acceleration / deceleration time [s] = (a setting value in RFH – a setting value in RFL) × (a setting
value in RUD) × 2 / (reference clock frequency [Hz])
由上面关系变换得出:
直线:RUD = Acc_Dec_Time*Motor_clk/(RFH-RFL)
曲线:RUD = Acc_Dec_Time*Motor_clk/((RFH-RFL)*2)
注意单位:Acc_Dec_Time 为s,RFH RFL为 pps
4、RDP 减速点
手动模式下(RENV.ASDP = 0)
当RPLS(剩余脉冲数) <= RDP,开始减速
自动模式下(RENV.ASDP = 1)
2 TLV5614 DAC芯片
void DacWrite(unsigned char wr_channel,unsigned short wr_vol)
{
unsigned short j,i;
unsigned short k;
static unsigned char channel;
static unsigned short vol;
static unsigned char chip_id;
vol = wr_vol;
channel = wr_channel;
chip_id = channel/4;
channel%= 4;
vol&=0xfff;
if (channel==0)
{
vol&=0xfff;
}
else if (channel==1)
{
vol|=0x4000;
}
else if (channel==2)
{
vol|=0x8000;
}
else
{
vol|=0xc000;
}
Set_DACS(chip_id);
for (j=0;j<DelayIo_Ms;j++);
Set_DAFS();
Set_DACLK();
for (j=0;j<DelayIo_Ms;j++);
Clr_DACS(chip_id);
for (j=0;j<DelayIo_Ms;j++);
Clr_DAFS();
for (j=0;j<DelayIo_Ms;j++);
k=0x8000;
for (i=0;i<16;i++)
{
if (k & vol)
{
Set_DADIN();
}
else
{
Clr_DADIN();
}
for (j=0;j<DelayIo_Ms;j++);
Clr_DACLK();
for (j=0;j<DelayIo_Ms;j++);
Set_DACLK();
k/=2;
}
Set_DACLK();
for (j=0;j<DelayIo_Ms;j++);
Set_DAFS();
for (j=0;j<DelayIo_Ms;j++);
Set_DACS(chip_id);
for (j=0;j<DelayIo_Ms;j++);
}