5.1 各芯片驱动整理

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[-]方向减11-[+]方向减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=10CM=0 正方向为H,负方向为L; 脉冲模式下PMD=10CM=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(0x825、设置加速度 RUD(0x836、设置设置减速点 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;//RMG_Val
举例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 //放大倍数最大为600,如果Motor_clk=4096000,放大倍数最大设置为500


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++)
    {
        //Set_DACLK();
        //for (j=0;j<DelayIo_Ms;j++);
        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;
    }         //  结束循环 for (i=0;i<16;i++)

    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++);
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值