gzlai
发表于 2023-12-22 11:36:56
学习学习,谢谢
wzaefd
发表于 2023-12-25 09:00:59
高手{:4_174:}{:4_174:}
lzl1okOK
发表于 2023-12-25 10:32:47
厉害{:4_250:}
lzl1okOK
发表于 2023-12-30 14:47:10
FOC好高端,我连原理都不懂
10086001
发表于 2024-1-2 02:50:14
学习学习
小涵子爸爸
发表于 2024-1-2 08:10:54
楼主厉害,向您学习,另外期待STC的新产品上市
王昱顺
发表于 2024-1-18 11:55:09
关于无电流环FOC进行堵转保护
相信有关电机的使用中,很多时候的烧电机和烧MOS管都是因为电流超过了额定值。所以电机驱动做限流保护是非常有必要的。
虽然我这版FOC没有加入电流传感器,但是并不能说不能控制电流的大小。
因为电机的线圈电阻是确定的。且经过磁编码器跟踪位置解耦,就可以保证使用多大的驱动电压,可以输出固定的堵转电流。
虽然因为电机的线圈属于LR串联模型,受到多方面因素的限制。但是从效果出发,只需要记下到达自己预先电流值的堵转电压。并且带入速度环中作为保护,就可以完成限流保护了。
检测逻辑是判断速度是否低于一个“低速阈值”,这里我设置的是300rpm。
if (abs(Read_Speed_Int_Data()) < 300 && moto.set_uq > 1.3)
moto.set_uq = 1.2;
setTorque(moto.set_uq, moto.angle_dat); // PID控制
逻辑比较简单,就是在起步或者阻力较大的时候,判断如果这时候的PID输出想要超过我设置的电压值(对应一个限制电流值,需要用可调电源调试查看)
那么就切入堵转保护,输出固定的电压。对应到实际的现象就是堵转的时候保持恒定的力矩,但是电流和力矩都不会再增加。
王昱顺
发表于 2024-1-18 12:08:51
关于电机通讯
本次电机通讯使用的是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的通讯协议说明:
有关STC-FOC Lite的I2C控制说明 设备I2C通讯支持高达1Mhz的I2C速率,I2C通信中,地址的字节为设备地址,为RW读写控制位,写数据为0,读数据为1。注:因为I2C地址只是高7位,所以后面的地址描述都是右对齐方式,即0xxxxxxx,实际使用时请使用'i2c_addr<<1'的方式进行使用,寄存器地址默认都是8位。为了方便设置的参数同步,设备拥有两个设备地址,一种是广播地址0x00,一种是可以设置的私有地址。设备第一次启动时,地址默认为0x00,此时可以通过通用寄存器0x00设置私有地址,设置完成后将返回ACK标志并立即生效。 快速控制:通过设置了私有地址以后,可以通过设置启动寄存器0x00的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个,此时可以做两侧轮速度同步。
王昱顺
发表于 2024-1-20 21:44:26
关于位置环和这个开源项目
研究了两天,撞了两天的南墙。
本来是想试一下能不能没有电流环调出位置环来,后来发现很可惜,这并不是一件容易解决的事情。因为无刷电机运行的时候存在齿槽效应
也就是常说的转矩脉动。这会导致速度环低速的时候因为驱动力气小的缘故无法克服齿槽效应的不平衡力矩。进而位置环根本就没法调。
上面这个图便是低速时的转矩脉动,可以看到其实转了两圈,扰动的还是有规律的。一般来说,电流环就是用来克服这个问题的。
现在觉得应该暂时完成这个开源了,目前看起来这个项目也维护的差不多了。
等我稍作整理便会发布最终版本的项目代码文件,之后我会去继续维护STC-FOC,就是带电流环的非Lite版本。
经过在STC-FOC Lite版本这边的摸索和实践,说实话也学会了很多东西。
现在再来看这个小小的项目,甚至已经有些规模了。能在三块钱的单片机上实现无刷驱动,并且还有很多对性能的极限追求。
很满意了。
WHX
发表于 2024-1-21 12:21:09
赞一个,学习了。
页:
1
2
3
[4]
5
6
7
8
9
10
11