SVPWM在单片机上的简便合成方法
novakon2014/05/13软件综合 IP:河北
看了论坛里面几位同学的帖子,表示晕死,遂淘宝一批零件,自制三相全桥:

IMG_0358b.jpg

IMG_0359b.jpg

好了,那些都是后话了。

先简单讲讲SVPWM:电机内部的三个或者三组定子各成120度角,采用Y型连接(三个绕组的一端连在一起,另外一端分别连在三相电压上)。

这三相电压,可以用一个固定的直流电压配合三个半桥来合成,合成的电压介于0与VDC之间。三个半桥在Y型连接的三个或者三组电磁铁里能够产生最大磁通,也就是能够流过最大电流的状态,有6种,其中3种是某相接VDC,另两相接0;另3种是某两相接VDC,另一相接0。这六种状态产生的合磁场强度相等,分别指向相隔60度的6个方向。

要令电机转起来,需要产生旋转的磁场,这个磁场可以通过以上6个方向的磁场中的某两个方向混合产生。例如,产生指向30度的磁场,就可以用0度的磁场和60度的磁场按照一定比例混合叠加。

设我需要产生的磁场角度在0到60度之间变化(如果在60-120度或者120-180度之间变化,矢量混合的情况是一样的,所以只讨论一种)。
设我需要产生的磁场强度为m,角度为a,则我需要的磁场矢量b在xy平面上可以表示为

b=(mcos(a), msin(a))

或者 b=m(cos(a),sin(a)). 因为m只是决定强度,这里不妨设m等于1,等到求出三相电压之后,我们再把这个m乘上去。

指向0度的磁场b0,设其强度为1,坐标为(1,0).
指向60度的磁场b1,设其强度为1,坐标为(1/2,(根号3)/2).

用b0和b1两个矢量合成我们需要的矢量b, 可以表示为b=k0b0+k1b1,其中k0和k1就是混合比例。
显然,当b=0度时,混合比例k0=1,k1=0;当b=60度时,k0=0,k1=1. 而对应0到60度之间的每一个矢量b,都有一对k0与k1与之对应。

在我的程序里面,规定转动一周为1536单位,每个60度扇形有256单位。所以我可以建立一个长度为256的数组,数组中存储计算好的k0与k1,这样便可以通过输入的磁场角度值,直接得到k0与k1的值。然后用它们分别乘以组成当前角度所在的60度扇形的两条边的两个磁矢量的三相电压矢量并相加,就可以得到用于产生这个角度磁场的电压矢量(这个电压还应该乘以m以决定强度)。

首先,利用excel来计算k0和k1.实际上是对一个二元一次方程(x0k0+x1k1=x; y0k0+y1k1=y)求解。图中的字母关系是:b(x,y), b0(x0,y0), b1(x1,y1)

QQ截图20140513115253.jpg

解得的k为0和1之间变化的浮点数。为了加快在单片机上的运行速度,避免浮点运算,将k乘以255取整(将k从0~1映射到0~255). 注意到k0和k1的数值相对于中轴对称,所以只需存储k0数组.

举例:需要合成角度为299单位(一周1536单位),强度为127/256(强度范围从1/256~255/256)的磁场。首先计算299/256=1,知道该矢量落在6个矢量(0~5)中的1号与2号之间。
然后计算299mod 256=43单位。查表可得:在43单位处,混合系数k0=225, k1=51.
假设1号矢量对应的电压矢量为(0,0,1),2号对应的电压矢量为(1,0,1),则所需电压矢量为(0,0,225)+(51,0,51)=(51,0,225).

再乘以强度127/256,可得(25,0,111).

至此,直接将电压矢量数值作为pwm占空比控制全桥即可。

这个算法使用了两次查表,使用了三次/256,一次mod 256,两次乘法,若干次加法。全部控制在16bit整数运算范围内。
其中/256和mod 256 这两个操作分别用取高8位和取低8位就可以实现,故该算法速度极快,可以在8位单片机上流畅运行。
来自:计算机科学 / 软件综合
10
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
novakon 作者
10年0个月前 IP:未同步
688500
本帖最后由 novakon 于 2014-5-13 13:39 编辑

观察到表格中k0+k1的最大值为147*2=294:

QQ截图20140513132425.jpg

所以此算法计算出的电压矢量中单个分量的最大值为294. 故设定pwm周期为294即可

但不幸发现,294乘以强度255/256过程中会超过uint16范围,故实际使用时规定最大强度为127/128. 当然,也可以将k0和k1按256/294比例缩小。如果在32位单片机上运行,则可以利用32bit运算的优势,不必做这样的简化。16bit的动态范围,控制电机不一定够。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹
10年0个月前 IP:未同步
688505
上波形 上波形
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
10年0个月前 IP:未同步
688651
本帖最后由 novakon 于 2014-5-14 11:26 编辑

根据实际驱动电路的情况(接近0的占空比会被驱动过滤掉),稍微修改了代码。同时重做了k0的查找表,采用了四舍五入的数据。现在电机运转更稳定,振动更小。

QQ截图20140514110803.jpg

IMG_0370v.jpg
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
10年0个月前 IP:未同步
688652
张静茹 发表于 2014-5-13 13:56
上波形 上波形


波形你们都看过几百遍了。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹
10年0个月前 IP:未同步
688684
novakon 发表于 2014-5-14 11:17
根据实际驱动电路的情况(接近0的占空比会被驱动过滤掉),稍微修改了代码。同时重做了k0的查找表,采用了 ...


好迷你的小伺服
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yanli12321
10年0个月前 IP:未同步
688814
本帖最后由 yanli12321 于 2014-5-15 15:45 编辑

路过,膜拜叉叉一下
被高考折腾着死去活来.........脑子里好多灵感只能先搁着了.........空间矢量调制配合上FOC会比较高大上,假期准备玩下
顺便问下叉叉的伺服啥参数?带编码器没?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
10年0个月前 IP:未同步
689628
该伺服的编码器是配套三菱的驱动器用的,无资料,难搞。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon作者
10年0个月前 IP:未同步
689631
本帖最后由 novakon 于 2014-5-19 15:54 编辑

空间矢量合成实际上和SPWM是等价的,其驱动占空比波形也可以通过SPWM波形转换得到。上面讲的计算SVPWM的方法真的很难搞懂!实际上通过下面的方法,一样可以获得svpwm的波形,且两种方式得到的波形没有任何不同。

首先,产生三相正弦波a,b,c ,表达式分别为 sin(wt), sin(wt+120), sin(wt+240), 这三相正弦波电压互相相差120度。

a b c 三相电压随角度变化如下图:

QQ截图20140519153700.jpg

三相电机线圈中的电流,只和这三相电压之间的差值有关。比如将这三个电压同时抬高n伏特, 得到n+sin(wt), n+sin(wt+120)... 每两相之间的电压仍然不变,通过线圈的电流也不变。

设SVPWM的三相电压为 d e f, 对于给定的时刻t, 令

m=min(a,b,c)
d=a-m
e=b-m
f=c-m

这样一来,就使得:

1、 d e f三相电压,每两相之间的电压差仍与原a b c相同,作用在电机上的效果相同。
2、在任一时刻,d e f 中必有一相电压为0. 此时此相PWM占空比为0,不需要开关功率晶体管,比SPWM少1/3开关损耗。
3、供电电源电压一定时,相比SPWM波形,可以在绕组中产生的最大电流更大
d e f 三相电压随角度变化如下图:

QQ截图20140519153711.jpg
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
天天来看你2014
9年9个月前 IP:未同步
712296
厉害楼主!听你讲的很不错,回头多多请教,好吗?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
novakon
学者 机友 笔友
文章
1256
回复
8385
学术分
16
2008/03/29注册,2年3个月前活动

已走,勿送

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}