异步电机每隔固定圈数会抖动一下
做实验的时候(跑矢量控制)发现,异步电机每隔固定圈数会抖动一下,但是程序什么的都是对的。
刚好我保存了之前的版本(会抖动的版本)。
会抖动的版本,转速的代码生成程序是这样子的(如下图):
不会抖动的版本(对的,这个问题我已经解决了,只是在这里记录一下)是这样的(如下):
大体上相同是吧,没错,这两张图基本一样,只是将tmpg(data store memory)这个模块省略了,直接用线连接,然后问题就解决了。
可以看一下原来有问题的时候,tmpg、qposcnt、qdf这几个信号是什么样子的吧(如下图,不要看图上红色的字,不对的):
第一个是qposcnt信号、第二个是tmpg信号(tmpg=qposcnt(k)-qposcnt(k-1))、第三个是qdf信号。
第一个波形图是我将计数器最大值设置成了80000,并且是达到最大值复位模式,所以,在每次达到最大值复位的时候,如果不在程序中做保护,就会出现qposcnt(k)=100、qposcnt(k-1)=79000(数字随便给的,大致是这么个意思)这样的情况,导致tmpg为-70000多,这个时候去算转速肯定是算不准的,所以,我有保护的,就是这个部分(如下图):
qposcnt这个值总会加到最大值然后复位,所以这个保护部分的意思就是:
你正转的时候,这个时候如果tmpg的值如果不大于-70000(出现了达到最大值然后复位的情况,正常情况不可能不大于-70000),就给它补充一个80000。同理,你反转(qdf是0还是1你自己可以选,这个无所谓的)的时候,如果tmpg的值如果大于70000,就给它减去一个80000。很清楚叭,不清楚多看看。至于为什么要用70000,你用个75000也行。
回到前面那个问题,我之前的版本也是这样写的,只不过用的是data store memory模块,不是直接连线,为什么就会出现好像是保护没做好的这种情况呢。
我可能和data store memory模块有read和write两个部分有关,
大概是程序执行的时候先执行了磁链角度计算模块(在PWM中断里面),且在执行这个模块之前,QEP中断服务函数中的转速计算函数已经执行到算出tmpg了但是还没执行到保护这一块,所以就将没有被保护过的tmpg数值用去计算磁链角度,所以表现出来的样子就是电机每隔10圈左右会抽动一下。
然后还有一个问题:
转速与转矩电流一起变大
这个问题之前还有一个小问题是:程序一启动,电机就失控(这个问题的原因有太多种了,大多都和相序、正反转等有关系)
这里就是我将qdf这个东西正方向选反了,导致,我给它100rpm的转速指令,它也按照转速环的设定给了一个正的isq给定值,按照电流环的设定给了一个正的usq给定值,按道理这个时候,SVP算出IGBT的通断时间,执行之后就会让转速增加。
但是由于我正方向选反了,导致这个时候算出来的rpm值是朝着反方向增大的(负值),这个情况被转速环和电流环看见了,这还得了? 转速环和电流环直接加大转矩电流和转矩电压的输出,试图挽回反方向远走的rpm,但是越挽回走的越快。
这个时候我发现了这个现象,但是没察觉到是正方向选择错了的缘故造成的,我以为,既然rpm是负的,我将rpm的系数(speed_base)也变成负的不就挽回rpm(使rpm为正)了吗,但是我做了之后就出现了:转速与转矩电流一起变大这个问题。