位置比较脉冲调制输出
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
位置比较脉冲调制输出
在Turbo PMAC 系统中PMAC2型伺服IC 有自动脉冲宽度调制(PWM )和脉冲频率调制(PFM )两种电路。有些情况下,这些也不能提供所需要的频率和/或脉冲宽度范围。然而,对于一个备用的编码器通道,它可能使用位置比较输出的自动增加功能得到一个灵活的脉冲宽度或脉冲频率调制信号。
这个技术使用通道内部的PFM 电路,以固定比率增加通道编码器的计数。然后,通过调整A 和B 比较寄存器之间的距离,我们可以控制脉冲宽度,通过调整自动增加的值,我们可以控制脉冲频率。
分析
计数器频率是时钟频率的一个简单函数,这个时钟频率就是PFM 电路的时钟频率
(PFMCLK )并且这个指令值在PFM 寄存器里。默认的9.8304 MHz PFMCLK 频率几乎适合大多数应用。等式需要16位的PFM 指令值(使用24位字的高16位,与标准的M-变量定义一样)得到一个指定的计数器频率是:
PFMCLK
counter PFM f f C *216= 如果希望写整个的24位PFM 指令寄存器,比如在MACRO 站点,仅将以上等式中的216用224替代。
比较电路的输出频率是计数器频率和比较电路自动增加位置值的函数。根据给定的输出频率得到需要的自动增加值的等式是:
output
counter comp f f P =∆ 比较输出的占空比是A 和B 比较寄存器之间的距离和自动增加值的比例。根据给定的占空比(表示成百分比)和自动增加值得到这个距离的等式是:
100
%DutyCycle P AB comp comp ∆=∆ 注意的是当写A 和B 比较寄存器时,它们必须是在当前计数值的两侧;否则自动增加功能将不能正确工作。
简单设置和编程
以下的设置和程序部分可以用于实现这个功能。在这个示例中,我们设置一个计数器频率是500kHz ,它给我们一个占空比1%的分辨率或比较好的5kHz 的脉冲频率。
注意的是实现一个特定脉冲配置的指令可以在一个运动程序或一个PLC 程序里执行;它们甚至可以作为在线指令发送。通常它们将被嵌入到一个运动子程序的传递参数。
; 设置和定义
I7203=2258 ; IC2的默认时钟频率
I7204=2 ; IC2的PFM脉冲宽度
I7210=8 ; IC2通道1内部仿真
I7216=3 ; IC2通道1的AB为DAC输出C为PFM
输出
#define ServoCycCtr M100 ; 每个伺服周期的增量
ServoCycCtr->X:$0,0,24,S
#define SIC2Ch1EncPos M101 ; 当前计数器值
SIC2Ch1EncPos->X:$078201,0,24,S
#define SIC2Ch1OutC M107 ; C寄存器PFM输出
SIC2Ch1OutC->Y:$078204,8,16,S ; 定义寄存器高16位
#define SIC2Ch1CompPosA M108 ; 比较A寄存器
SIC2Ch1CompPosA->Y:$078207,0,24,S
#define SIC2Ch1CompPosB M109 ; 比较B寄存器
SIC2Ch1CompPosB->X:$078207,0,24,S
#define SIC2Ch1CompIncr M110 ; 比较自动增加
SIC2Ch1CompIncr->X:$078206,0,24,S
#define SIC2Ch1CompInitSta M111 ; 比较初始状态
SIC2Ch1CompInitSta->Y:$078205,11
#define SIC2Ch1CompInitEna M112 ; 比较初始化使能
SIC2Ch1CompInitEna->Y:$078205,12
#define Now P106 ; 当前伺服计数器
#define CounterFreq P107 ; 计数频率为Hz
#define PulseFreq P108 ; 输出频率为Hz
#define DutyCycle P109 ; %接通时间(0 – 100)
CounterFreq=500000 ; 计数频率,常数
; 用指令来实现特定的频率和占空比,这些可以在运动程序,PLC程序,或作为一个在
; 线指令(包括WHILE/ENDWHILE,不能以任何方式作为在线指令使用)
SIC2Ch1OutC=0 ; 冻结计数器用于设置
Now=ServoCycCtr ; 记录当前时间
WHILE (ServoCycCtr=Now) ; 为冻结提供延时
ENDWHILE
SIC2Ch1CompInitSta=0 ; 设置输出关闭
SIC2Ch1CompInitEna=1 ; 强制初始的输出状态
SIC2Ch1CompIncr=InternalFreq/PulseFreq ; 设置输出频率
SIC2Ch1CompPosA=SIC2Ch1EncPos+SIC2Ch1CompIncr*(100-DutyCycle)/200 SIC2Ch1CompPosB=SIC2Ch1EncPos-SIC2Ch1CompIncr*(100-DutyCycle)/200 SIC2Ch1OutC=CounterFreq*65536/98304000 ; 输出频率的PFM值
选通输出
通过设置通道n的I7mn1等于1,同一块IC上的其余的编码器比较电路可以设置为只作用于IC上的第一个编码器。如果任何的这些电路被分配到第一个通道的编码器,第一个通道的比较输出是所有被分配给它的比较电路的逻辑或(如果任何一个电路是“1”状态,输出就是1)。这个可以用于选通第一个比较输出。在这一节,我们使用第二个比较输出的“内部状态”写功能控制第一个比较输出是否一直打开,或输出一个频率。
; 额外设置和定义
I7221=1 ; IC2通道2的比较使用编码器1
#define SIC2Ch2CompInitSta M211 ; 比较的初始状态
SIC2Ch2CompInitSta->Y:$07820D,11
#define SIC2Ch2CompInitEna M212 ; 比较初始化使能
SIC2Ch2CompInitEna->Y:$07820D,12
; 命令输出一直打开
SIC2Ch2CompInitSta=1
SIC2Ch2CompInitEna=1
; 命令第一个比较电路驱动输出
SIC2Ch2CompInitSta=0
SIC2Ch2CompInitEna=1