引用 ShowMotion 的回复内容:
……你说不溢出就不溢出?你说位置走多远就走多远?溢出是不受您控制的,您不可能限制说:伺服是不能朝一个方向转多久的,否则溢出我就乱套了。那就要解决溢出后进位或修改溢出计数变量对吧?……
1、ShowMotion的这句话,说明了ShowMotion对伺服控制过程外部用户如何处理计数器溢出的基本方法不懂;
2、ShowMotion说,“你说不溢出就不溢出?你说走多远就走多远?溢出是不受你控制的”,大家想一想溢出是不受控制的吗?
3、我来讨论下用户如何控制计数器溢出的问题:
1)一个32为计数器,可以记65536×65536转个脉冲;
2)那么用户确定脉冲当量、确定周指令脉冲、电子齿轮比时,指令脉冲数就有一个范围,就是
指令脉冲数<65536×65536
3)如果用户确定
周指令脉冲数=65536,那么电机的转数要<65536转
周指令脉冲数=32768,那么电机的转数要<131072转
周指令脉冲数=16384,那么电机的转数要<262144转
周指令脉冲数=8192, 那么电机的转数要<524288转
周指令脉冲数=4096, 那么电机的转数要<1048576转
周指令脉冲数=2048, 那么电机的转数要<2097152转
周指令脉冲数=1024, 那么电机的转数要<4194304转
周指令脉冲数=512, 那么电机的转数要<8388608转
……
4)所以用户总可以把指令脉冲数控制在65536×65536个脉冲范围内,保证伺服一个伺服运行周期计数器不会溢出;
4、ShowMotion说“你说不溢出就不溢出?”,那当然说不溢出就不溢出;
5、ShowMotion说“你说走多远就走多远?”,那当然说走多远就走多远;
6、ShowMotion说“溢出是不受您控制的”,我说用户通过设定、给定参数,就是能有效地控制计数器的溢出!!!
7、这就是The external control must process the overflows!
下面谈谈关于系统解析度的问题
1、系统检测电机角位移的分辨率,即解析度;
2、用户设定的周指令脉冲数例如65536,为系统对电机角位移的检测分辨率的要求;
3、编码器的周反馈检测脉冲数例如4096,为系统检测电机角位移的分辨率;
4、当系统要求的分辨率即用户设定的周指令脉冲数,
周指令脉冲数>编码器的周反馈脉冲数
则系统检测电机角位移的分辨率=编码器的周反馈脉冲数;
5、当系统要求的分辨率即用户设定的周指令脉冲数,
周指令脉冲数<编码器的周反馈脉冲数
则系统检测电机角位移的分辨率=用户设定的周指令脉冲数;
6、通道的周脉冲数=编码器周反馈脉冲数×2n=编码器周反馈脉冲数/电子齿轮比=周指令脉冲数;
7、所以你使用高解析度的编码器,系统的实际分辨率可能很低,受用户的要求或设定的周指令脉冲数低的约束;
8、所以当用户要求分辨率高或设定的周指令脉冲数高,系统的实际分辨率可能很低,受编码器的周反馈脉冲数低的约束;
9、举例说
1)周指令脉冲数65536,编码器周反馈脉冲数4096,则系统分辨率即解析度是360°/4096;
2)周指令脉冲数4096,编码器的周反馈脉冲数65536,则系统分辨率即解析度是360°/4096;
10、所以影响系统分辨率即解析度的因数
1)用户设定的周指令脉冲数;
2)编码器的周反馈脉冲数;
3)电子齿轮比的作用是,总能使通道运行的周脉冲数与之兼容!
引用 ShowMotion 的回复内容:
……按刘老师的做法就是在加工文件拿到后,为了保证计数器不溢出,就根据加工的尺寸调整位置分辨率,也就是说加工距离越长我的精度要求越低,如果一直要同一个方向加工,还要求加工精度也很高,那是不是为了保证计数器不溢出,限制加工距离或者说我给您配更高计数宽度的驱动器,32位不行64位,64位不行128位?或者您说,对不起我干不了这个活。……
1、你的应对是有限的!
2、如果你的应对是无限的,那么就不需要32位计数器,可以是16位、8位,……
3、我的方法,如果在有限的范围内应对,相对于溢出1次、2次,系统分辨率下降最多3个脉冲;
4、如果我的方法对于“为了保证计数器不溢出,限制加工距离或者说我给您配更高计数宽度的驱动器,32位不行64位,64位不行128位?”,是可以做到的,虽然系统分辨率有下降;
5、你的应对,对于“为了保证计数器不溢出,限制加工距离或者说我给您配更高计数宽度的驱动器,32位不行64位,64位不行128位?”,是无法应对的,你能应对得了吗?
6、所以32位是科学的,允许用户有较大的选择;
7、更高位的要求,是虚假的分辨率,或者说是理论上的分辨率;
8、实际运行的分辨率,需要32位计数器的很少;
引用 ShowMotion 的回复内容:
………硬件上的溢出,可以采取两种方案:
1、基于指令输入和编码反馈不可能突变,我可以把它的进位或借位丢弃,比如两个计数值都是32位无符号数,计数范围0~+(2^32-1),假设实际输入的脉冲数和反馈脉冲数分别达到0xffff ffff,0xffff fff0,再输入一个脉冲,输入脉冲应该是0x1 0000 0000,我把它就当成0。因为反馈脉冲不可能突变,反馈脉冲的下一刻的计数值应该在0xffff fff0左右变化。如果反馈也溢出,我同样丢弃,那么反馈应该在0x ffff xxxx~0x 0000 xxxx之间变化,用输入脉冲0x0000 0000-反馈脉冲0x ffff xxxx~0x 0000 xxxx,那么就可以得到+0x0000 yyyy~-1*(0x 0000 xxxx),注意此时差是有符号数,这个差值没问题,那么执行就不会有偏差。……
1、"差值没问题,那么执行就不会有偏差"。差值有问题,那么执行就会有偏差。差值为零,停车;
2、指令脉冲数用户运行前输入,如果指令脉冲数是2^32-1+2^6,输入溢出后的读数是2^6;
3、运行后,编码器的脉冲数由零开始累加,累加到2^6时,差值为零,停车了怎么办???
引用 ShowMotion 的回复内容:
……
2、采用专门的两个变量来保存溢出次数,那么上溢1次,变量+1,下溢1次,变量-1.假设32位计数器,由(溢出变量*(2^32)+32位计数值)组成一个更大的数来处理,如果是浮点处理器,这个计数值是相当大的,你想溢出都难,这个解决了硬件的技数宽度的限制。
……
1、“采用专门的两个变量来保存溢出次数”,用这个方法和用更高位的计数器相比,用更高位的计数器更简单;
2、例如,如果用两个变量来保存溢出次数,和增加2数位比较,增加两数位的效果更好、更简单!
3、这个应对的方法我已经说过了,没有意义!