
做电机控制的,就不免会跟编码器(本人是做编码器研发)打交道,ST的电机库也一直支持增量编码器做速度环控制,随着位置环控制的需求,特别是在机器人关节应用的兴起,迫切需要驱动器能能增加对绝对值编码器的支持,通常地讲,绝对值编码器的信息通常是以数据协议的方式给出,主要有两种方式,一种是时钟驱动下的同步数据传输,尤以SSI协议和BISS-C协议为代表,它是在驱动器(主机)的时钟来临时,编码器(从机)要立即锁存位置数据(或者还需要采集sin/cos,计算角度等,有些还需要计算CRC)发出,另一种是命令驱动下的异步数据传输,常见于日系的编码器协议,该协议属于半双工通信,通常是驱动器发命令请求数据,然后释放总线的控制,编码器器随后也是准备好数据发出,它的硬件层基于RS485,异步传输的一个要求是时钟要比较精准,相对灵活,因为不同的命令报文提供了对编码器的多种访问可能性。BISS-C协议作为此贴的主题。 BISS-C协议本质上是同步通信,硬件实现上可以采用SPI的外设加持,对应于SPI的模式(CPOL=1,表示idle电平为高,CPHA=0,表示下降沿采),有一点区别的是BISS-C的传输位数可以任意,而SPI通常都是以字节的倍数,为了利用SPI外设接收数据,可以要求数据的位数是字节的倍数。第二个不同的是,BISS-C允许编码器有一段时间处理和准备数据,此时编码器会维持一段可变时长的ACK低电平,因此驱动器需要考虑这个因素,增加裕量的时钟个数,完美的BISS-C主机实现是会探测start bit,从而会保持有效数据位的时钟个数,换句话说,每一帧的时钟个数不一定完全一样,这点对SPI来说比较难,因为SPI的时钟个数需要预先配置,不过这也可以克服,前提是发多余的时钟保证有效数据的传输,同时在数据末端也会收到垃圾数据,需要在程序处理,只要判断出start bit的位置,往后截取规定的数据长度即可。 了解了它们的共同点,显而易见的方法就是把驱动器的SPI按照规定的模式配置成主机,启动SPI读数据,程序过滤出数据,听起来很简单,殊不知,这样做并不可靠,隐藏着隐患。SPI是常用于电路板内芯片之间的通信,它可以做得非常可靠,因为芯片之间的参数全都可以固定。但是驱动器与编码器之间的通信已经跨越出这个范畴,往往需要线缆来连接,因此,通信频率,线缆的材质,长度,跟温度变化的特性,板子上的线驱动芯片的延时等等这些参数都会不同,因此存在这样的情况,驱动器这边的时钟发出,到编码器端的时钟已经产生了延时,编码器是看到“当地”的时钟上升沿发送数据,下降沿时数据是稳定的,而数据串传到驱动器这边时,会发现驱动器“当地”的时钟沿已经跟采集数据的时刻已经发生了变化,而SPI主机只会用“当地”的时钟沿来采数据,可能就会发生错位,采错(也就是上升沿时刻才是正确的采集数据的时刻),有些情况下可能改配置貌似可以,有些情况下是任何一个配置都时对时错,何况其他因素的变化都会导致通信的不可靠。因此,单纯的简单地利用SPI外设模拟BISS-C协议并不总是奏效,或者说存在隐患。 只要揪出同步问题,多加2路定时器,就可以完美解决上述问题,打字太累了,感兴趣的朋友可以留言私聊。 |
您好,能大致说下这2路定时器用法吗 |
您好,能大致说下这2路定时器用法吗 |
你好,可以交流下怎么写这个控制吗! e6 m- n& a, A1 R9 T j! k2 S |