关于电机通讯
本次电机通讯使用的是I2C通讯,不过目前I2C仍然会有一定概率传输脏数据,正在尝试通过加入CRC改善这个问题。
电机目前尚未加入自动确定I2C从机功能,计划添加。目前需要自行改动地址
- <font size="5">// 初始化电机
- void Moto_Init(Moto_Config *p)
- {
- p->set_uq = 0;
- p->set_speed = 300;
- p->set_postion = -300;
- if (Iap_Read(Flash_OK) == 0x01) // 如果参数保存标志位存在,则自动加载参数
- {
- _dir = Iap_Read(Flash_DIR);
- _pp = Iap_Read(Flash_PP);
- _zero = Iap_Read(Flash_ZeroH);
- _zero <<= 8;
- _zero |= Iap_Read(Flash_ZeroL);
- }
- I2CSLADR = 0x04; // 重置
- save_addr = 0x04;
- // if (Iap_Read(Flash_Addr) != -1 && Iap_Read(Flash_Addr) != 0)
- // {
- // I2CSLADR = Iap_Read(Flash_Addr);
- // save_addr = Iap_Read(Flash_Addr);
- // }
- }</font>
复制代码
地址的定义改动是I2CSLADR和save_addr,改动规则是高7位为地址,最低位必须为0。例如这个程序例子中,I2C从机地址就是0x02,使用I2C进行读写时,写地址是0x40,读地址是0x41(最低位为读写位)
==========以下截取自说明书=============
这里是FOC的通讯协议说明:
stcfoc lite说明书.docx
(80.64 KB, 下载次数: 135)
有关STC-FOC Lite的I2C控制说明 设备I2C通讯支持高达1Mhz的I2C速率,I2C通信中,地址的[7:1]字节为设备地址,[0:0]为RW读写控制位,写数据为0,读数据为1。 注:因为I2C地址只是高7位,所以后面的地址描述都是右对齐方式,即0xxxxxxx,实际使用时请使用'i2c_addr<<1'的方式进行使用,寄存器地址默认都是8位。 为了方便设置的参数同步,设备拥有两个设备地址,一种是广播地址0x00[7:1],一种是可以设置的私有地址。设备第一次启动时,地址默认为0x00,此时可以通过通用寄存器0x00[7:1]设置私有地址,设置完成后将返回ACK标志并立即生效。 快速控制: 通过设置了私有地址以后,可以通过设置启动寄存器0x00[7:0]的bit0进行启动控制,bit1进行方向控制。上电后的默认模式是速度模式,默认速度500rpm。 完全控制:
异步模式-立即生效:Ctrl寄存器中,EN为使能位,默认为0。此时为异步模式。 此时只能操作Ctrl寄存器。操作其他寄存器不会有反应。 同步模式-同时生效,Ctrl设置EN为1后,此时操作其他寄存器不会触发生效。在修改其他寄存器后,设置同步标志位SYNC为1,此时I2C设备自动转移地址为0x00广播地址。等待广播同步触发。触发完成后将转移地址回私有地址等待继续操作。此时SYNC会被清零,等待下一次同步操作。
R/W:设置0,速度与位置寄存器是设定值,设置1,速度与位置寄存器是实际值。 EN:设置0,异步操作模式,立即生效,只允许操作Ctrl寄存器,设置1,同步操作模式,设置其他的值时不会立刻生效,等待设定完成后通过触发SYNC进入广播状态,广播状态接收bit0(update)为1后生效。 SYNC:设置1触发广播等待状态,异步模式下也可以触发,但是没啥用。 MODE1,MODE0:共同组成模式选择,按顺序为10时,速度模式,11为位置模式,其余无效。 AC:all-clear功能,用于清除电机私有地址,进行重新设置。 ON/OFF:设置1启动电机,设置0停止电机,并进入0扭矩状态。
第一次上电时可以通过写地址ADDR6~0实现电机私有地址设置。I2C设备第一次上电后,同时检测到广播地址和速度超过指定阈值后响应主机并且写入私有地址。 具体操作是主控上电后,设定指定轮子地址广播,并且扭动相应的轮子,此时单个轮子地址设定完成,以此类推可以顺序操作挂载在同一条I2C总线上的许多设备。推荐的挂在设备数量是2个或者4个,此时可以做两侧轮速度同步。
|