电机第一贴:分享关于电机开发中关于速度方面的代码和经验
[复制链接]
做了2年电机开发,特写一些贴子和大家分享,水平其实很烂,没玩过电机的可以看看,电机老手就算了.我的水平实在不怎么样.
基础的一些电机的知识,我后面再发一些贴子和大家分享,今天我写一点关于限速方面的,我拿到手的第一个代码,是公司的前辈写的,用STM32的芯片的一个二轮车,因为前辈已经离职,所以后续的一些代码我改了一些.最早我改的一个功能就是限速.因为车子分为高中低三档,然后分别是5,10,15公里限速.由于电机不一样,这里的代码需要调整,最早给我的代码,里面没有限速的,就是全速的,大概最高速可以到38公里,由于刚开始接触电机,我也是一头雾水,所以一天到晚在群里,论坛还有认识的朋友那问关于电机的知识和程序.其中有几位给了我很大的帮助.特别是一位电机厂的设计师,和我成了好朋友,对我帮助很大.在些也谢谢他们.刚开始其实我是乱调的,我直接在油门程序这改代码,把油门值改大,改小.这样虽然可以实现限速,但是有一个非常非常严重的问题,带载烧MOS管.当负载加重到5A电流的时候,MOS严重发烫,然后MOS就会出现问题.不加载用测速仪是可以的,显示速度很稳定.后面想这样调不行,那就换思路,然后从别的地方入手改代码.实际上限速,除了油门,就是输出力大小进行限制,同样限制住了速度.也就是控制IQ,VQ的值.目前我做了3档调节,暂时还算可以,后面有机会再改进.要加PI代码.没有PI代码会一直电机速度在10-15公里之间震荡.下面这个是我写的没有PI的代码,实际就是稳不住,就是一直在振荡.
if((g_u16_torqueTempValue > tend_value)&&(speed_value > 40)&&((speed_value <= 33)))
{
tend_value = tend_value + 10;
if(tend_value >= MAX_IQ) tend_value = MAX_IQ;
}
else if((g_u16_torqueTempValue < tend_value)&&(speed_value)&&((speed_value <= 33)))
{
if(tend_value >= 10)
tend_value = tend_value - 10;
}
else if((g_u16_torqueTempValue < tend_value)&&(speed_value > 39))
{
if(tend_value >= 100)
tend_value = tend_value - 100;
}
else if((g_u16_torqueTempValue > tend_value)&&(speed_value > 39))
{
if(tend_value >= 100)
tend_value = tend_value - 100;
}
else
tend_value = g_u16_torqueTempValue;
后面在网上查了PI的资料,网上PI的程序很多,我随便抄了一个
struct PID {
unsigned int SetPoint; // 设定目标 Desired Value
unsigned int Proportion; // 比例常数 Proportional Const
unsigned int Integral; // 积分常数 Integral Const
unsigned int Derivative; // 微分常数 Derivative Const
unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
unsigned int SumError; // Sums of Errors
};
unsigned int PIDCalc(struct PID *pp, unsigned int NextPoint)
{
unsigned int dError,Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 积分
dError = pp->LastError - pp->PrevError; //当前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error //比例
+ pp->Integral * pp->SumError //积分项
+ pp->Derivative * dError); //微分项
}
这个是我网上抄的,实际使用还要改的,因为实际的代码,工作中有保密协议,遵守职业规范,我就不从我的程序里抄出来给大家看了,只要稍微修改一下,懂里面的原理,限速还是很容易实现的.首先我们要加入一个实际速度,然后设定速度,设定速度减于实际速度的差值做为积分项,积分项的另一个乘数可以自己根据电机或者转速的情况自己定,这样比例项就有了,再加上积分项,积分项就是累加的差值和做为一个乘积,另一个微分项,我们不要随意加,我是根据转速的情况做了条件判断,再加上微分项.加了PI算法后,再调好输出值,基本上工作就可以了,然后带载测试的话,比如你加上负载,你限速10公里,速度仍旧可以达到10公里,只是电流上升,总之速度保持不变.基本上限速就是这么一个思路.电机这个东西开发上比较依速于实验室,特别是测功机,负载仪这些.今天我先分享限速这块的思路,做为电机方面的新手.我也在慢慢学习电机,后面再写贴和大家分享.如果里面有错的,请大家包涵.
|