DSP以及电机控制的总结

断断续续,搞了一段时间的电机控制,随着手里的项目基本结束,感觉可能很久都不会再接触电机了,虽然积累的知识和经验并不多,还错误百出,但是做一个总结还是非常有必要的。

无刷直流电机(BLDC)
  这种电机,反电动势为梯形波,通常采用的控制方法是六步换向。通过检测霍尔电平,判断换向次序。霍尔有两种摆放位置,60度或者120度。

对于120度的霍尔,霍尔次序为231546

对于60度的霍尔,霍尔次序为673104

要使电机反转,只需要对霍尔取反即可

除此之外,虽然理论上无刷直流电机的反电动势为梯形波,但是实际上我手里的几个无刷直流电机,反电动势却是正弦波,没有深入探究原因。但是因为是正弦波,所以我在做无感FOC控制的时候,可以使用和永磁同步电机的FOC无感控制完全一致的程序。

永磁同步电机(PMSM)

 

        永磁同步电机的反电动势为正弦波,所以需要使用FOC控制的方式。FOC的基本控制流程为:检测三相电流,然后对其做clarke变换,转换到两轴极坐标系,再做park变换,转换到相对转子静止的d、q坐标系。然后,对d、q进行pid调制后,再依次做反park变换和反clarke变换,转换到三轴坐标系,再将结果输入svpwm模块来控制逆变器。

  通过以上流程可以看出,要实现算法,需要进行电流采集,以及角度采集。其中,角度采集用于park变换和反park变换。电流采集和电压采集是一样的,因为电压等于电流乘电阻。另外,只需要采集两相电流即可(基尔霍夫电流定律)。
  电流采集没有太多需要解释的,一般用霍尔电流传感器即可,如果使用电阻采样,注意电阻一般接在下半桥上,需要下半桥的场效应管闭合才能采样,在epwm的计数器到零中断你们获取电压即可。对于角度采集。我在项目中使用过旋变和磁编。我不太明白它们的底层原理,但是知道一些它们的使用方式。

  旋变需要一个解码芯片(其实也可以软解,但是算法太阴间了),我用的AD2S1205,它与旋变相连,输出角度和速度给dsp,网上资料比较多,很容易找到教程什么的。

  在使用角度传感器之前,需要判断传感器的0位,可以将电机的U相接到电源正极,V、W相接到电源负极,这时电机会自动转到一个位置,这时角度传感器的读数就是0位。

  磁编用的…(忘记了,也懒得查),磁编不能直接输出速度,但是它不需要解码芯片,比较方便,不过我手里的磁编总是坏,他们说是这地方风水不好(静电?),我也没找到其它原因,就暂时相信了吧。

  驱动电机的PWM波频率为10k,多点少点其实无所谓。要控制电机转速,其实就是控制q轴电压,d轴电压始终控制为0。要使电机反转,就是控制q轴电压为负值。所谓的d,q轴,其实是数学上虚拟的轴,不用太在意实际意义。

电机的无感控制

所谓的无感,并不是没有传感器,而是指电机里面没有传感器。对于BLDC电机,因为我手里的BLDC电机有点奇怪(反电动势为正弦波),所以,就当成PMSM电机玩了。对于PMSM电机,分为表贴式和内嵌式。对于表贴式电机,相电感Ls=Ld=Lq,对于内嵌式电机,这三个值不等。判断一个电机是标贴式还是内嵌式,可以将电机拆开,转子外面贴有磁铁,就是表贴式,磁铁插到转子里面,就是内嵌式。

无感控制的关键就是要获得角度信息,根据永磁同步电机的电压电流公式可知,角度信息包含在反电动势中。反电动势不可以直接测量,需要根据电流信息估算得到。估算的算法为SMC(滑膜)算法。还有其它算法可以估算反电动势(比如拓展卡尔曼滤波,没看懂),但是SMC是最简单的了,代码短的感人,不到10行……

TI公司的代码里面有滑膜算法的实现,也可以看看microchip的文档AN1078。有了反电动势后,做一次低通滤波+反正切就可以得到角度。但是,滤波会导致角度延迟,需要进行角度补偿,通过实验得到即可,要注意的是,不同转速的补偿值不同,管它的,差不多能转就行。实际上不补或者补个平均值也行,就是转起来有噪音,并且电流大些。还有,C语言的atan函数会丢失像限信息,为了方便,可以使用atan2函数。

电机的无感启动

通过反电动势来估算角度的前提就是要有反电动势,而反电动势要转起来才会有….我测试了两个电机,一个小功率电机和一个大功率电机。小功率电机不需要特殊的无感启动方案,抖一抖就自己转起来了,而大功率电机,有概率一直抖,转不起来,即使转起来了,方向也有可能是反的。要无感启动,可以采用V/F启动。V是指电压,也就是q轴电压。F是角度(频率?)。通过增大q轴电压,以及角度增大的速度,即可使电机开环转起来。通过上面的描述可以知道,电压增大的速度,角度增大的速度,都是通过实验得到的(或许可以通过计算,但是我不会),不同的电机可能不同,甚至不同的带载情况也可能不同,需要慢慢调。另外,还需要确定电机的初始位置,参照上面的角度传感器0位获得方法,让电机强行旋转到0位即可。

  对于内嵌式的电机,可以使用高频注入的方式来启动,但是因为我手里没有这种电机,所以没做探究。

电机参数测量

一般情况下,电机参数测定是由设计电机的工程师来做的,然后通过阅读电机参数文档即可知道。但是也可以自己测(如果有沟通上的困难的话)。

测Ls:随便两相,接在电感表(LCR测试仪)上,然后读数除以2。

测Rs:随便两相,接在电阻表(万用表的电阻档)上,然后读数除以2。

测Ld、Lq:需要电机转起来,随便接两项,测得的最大电感除以2为Lq,最小电感除以2为Ld。

  注意,以上方法测得的数据是不准确的,但是用来做滑膜控制算法的参数基本够了。如果需要准确数据,我不知道怎么测。

DSP工程的建立

  大致就是创建一个工程,然后把controlSUITE里面的DSP2833x_common和DSP2833x_headers加入到工程里面去。Cmd文件使用DSP2833x_Headers_nonBIOS.cmd和F28335.cmd或者28335_RAM_lnk.cmd。

  其中F28335.cmd会使得代码烧进dsp的flash中,掉电不丢失,而28335_RAM_lnk.cmd为在ram中运行,掉电丢失。

使用延时函数

dsp中有些函数必须在ram中运行,比如DELAY_US函数。所以,如果使用烧录的方式运行,这些函数需要手动移入ram中才行。具体方法为在InitSysCtrl()函数调用之后,添加以下两行代码:
    MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd,&RamfuncsRunStart);
    InitFlash();

使用快速浮点运算库

  dsp28335自带了一些用于快速浮点运算的函数,比如sincos函数,这些函数通过查表实现(dsp内部的rom中就有这些表,不用的话就浪费了),速度很快,标准库可能是通过级数展开来算的。从controlSUITE里面把lib文件和头文件移入工程即可,注意不要将源文件和汇编文件移进去了,那些是用来编译lib文件的。另外,还需要在编译脚本(makefile)里面确保rts2800_fpu32_fast_supplement.lib的链接在rts2800_fpu32.lib之前,这样程序才会真的调用快速浮点运算库,而不是调用标准库。可以在编译后查看自动生成的map文件,里面指明了每个函数的来源,可以确保真的使用了快速浮点运算库。

增大代码段RAM空间

  dsp28335内部的ram其实挺大的,但是默认空闲了很多ram,导致如果仿真运行的时候代码太多,默认的ram装不下,无法仿真运行。如果写代码的时候发现代码段不能全部装进ram中,可以配置下仿真用的cmd文件,把空闲的ram用起来。如果想要烧录运行的时候也想把大量代码放入ram中运行,那么烧录用的cmd文件也需要配置。

使用串口

串口的难点在于波特率计算。dspf28338使用的是30M的晶振,经过锁相环10倍频,再经过2分频,最后的到的LSPCLK(低速外设时钟频率)为150Mhz。假设要配置的波特率为9600,那么实际需要设置的sciband值为:150Mhz / 4 / 9600 / 8 = 488.28125,也就是488。其它波特率依次类推。

使用定时器

  定时器的使用是比较简单的,只需要设置低速外设时钟频率(150Mhz)和定时周期即可。

使用AD

  dsp28335有两个ad转换器,各有8个通道,共16个通道。这里设置成顺序采样,并且设置软件触发中断,然后在读取数据前通过轮询来判断中断为是否被设置。注意读取完数据后要清除中断标记位,以开始下一次采样。网络上一些程序使用epwm模块来自动触发中断采样,也行,实测最终效果一样。但是使用软件触发中断的方式,看起来耦合性更低些。

配置EPWM

Epwm可以配置成增减计数方式,事件发生后为计数增,增计数值过cmpa之后,电平为高,减计数器值过cmpa后,电平为低。死区要配置成AHC模式,也就是延长电平上升前的低电平时间,以及在电平下降前提前下降。延长时间和提前时间根据实际电机参数而定,一般2.5微妙即可。可以配置计数器到0事件,事件发生后进入中断,在中断函数里面进行电机控制相关的计算。pwm的频率配置成10k,有些文档上建议配置成20k。

一些其它细节

  如果使用dsp的定点运算库,可能会算的快些,TI的SMC代码里面就用了Q15格式的定点数来代替浮点运算,但是我实际在项目中没有使用,速度也还行,没有碰到瓶颈。另外,浮点一定要使用(float)float32,使用(double)float64会严重拖慢速度。

这次项目使用的电机电压均为24V。如果使用高压电机,可能逆变板上会有自举升压电路,这时需要在运行前以及运行中对自举电容充电,控制方式会有一些改变,不过因为这次没接触到,故不做探究。

 

  另外,标准的FOC控制需要对转速和q轴电压分别进行PID调节,而我只对速度和d轴电压进行了PID调节,PID参数也是随便设置的,反正项目要求能转能控速就行。
  dsp默认不会对中断进行嵌套,但是也需要做一些措施来防止竞争冒险,比如,在和中断共用一个变量时,需要关中断。
  还有好多没搞懂的东西的说,不过电机能转了,以后有机会再研究吧,看起来这个以后可能不会太久。

posted @ 2022-07-09 12:31  super1207  阅读(615)  评论(0)    收藏  举报