搜索
bottom↓
回复: 83

有偿求指点FOC SVPWM输出旋转的磁场

  [复制链接]

出0入0汤圆

发表于 2018-10-25 10:00:32 | 显示全部楼层 |阅读模式
现在遇到以下不解的问题求指点。
在看完ST的FOC2.O及AN1078_cn后我想实现输出SVPWM(不管PI部分)
我自认为了看了个大概:
clarke:把三相交流电变换成两项交流电流Ia及Ib。
park变换:把两项Ia及Ib通过旋转电角度(通过测速*时间(这个时间一般是系统时间))的变换得到Id(转子的磁通)及Iq转矩的输出。
PI:把实际的Iq与参考Iq差值比较经过PI得到Vq。实际的Id与参考Id(一般设置为0)差值经过PI得到Vd
逆park:把Vq与Vd转换成两项电压Ua,Ub。
SVPWM:Ua与Ub经过SVPWM算法转换得到PWM三相每项的占空比。而且中间还要根据Ua与Ub判断得到不同的扇区。扇区不同合成力矩所需要的公司不一样。
最终通过通过不听去触发ADC检测(系统周期)同时计算霍尔传感器的速度*时间的电角度得到了选择的磁场这个根据电机选择位置都可以得到。
不知道以上我理解的对不对。
我现在想实现单纯的旋转的SVPWM。但是没有丝毫的头绪。 如果单独执行:
void SVPWM_3ShuntCalcDutyCycles (Volt_Components Stat_Volt_Input)
这个里面的电压要怎么给,旋转的过程中他又会有什么结果
在电机启动的SVPWM的扇区又停留在哪了。(不知道霍尔传感器的位置跟这个扇区之间有什么关系)
希望大虾指点····· 给我个思路怎么得到SVPWM波形,可以示波器测量的。 在线等··· 当然也可以有偿求指点。怎么有偿可以商量的·······

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2018-10-25 10:26:16 | 显示全部楼层
没有看,自己顶一下!!!

出0入0汤圆

发表于 2018-10-25 10:56:14 | 显示全部楼层
苹果520 发表于 2018-10-25 10:26
没有看,自己顶一下!!!

人家不会说。会的不会给你做。钱太少。

出0入0汤圆

 楼主| 发表于 2018-10-25 11:19:12 | 显示全部楼层
ya496928541 发表于 2018-10-25 10:56
人家不会说。会的不会给你做。钱太少。

嗯嗯, 有道理···

出0入0汤圆

发表于 2018-10-25 11:24:49 | 显示全部楼层
本帖最后由 lcw_swust 于 2018-10-25 11:27 编辑

还是先用SPWM代替吧,因为
SVPWM我也不懂...
另外我觉得这个帖子里说的“开关损耗最小正弦PWM”更简单易懂:
https://blog.csdn.net/yi412/article/details/59547094
(其实就是把三相波形平移,使得最低的那一相PWM为0。)

出0入0汤圆

 楼主| 发表于 2018-10-25 11:32:12 | 显示全部楼层
lcw_swust 发表于 2018-10-25 11:24
还是先用SPWM代替吧,因为
SVPWM我也不懂...
另外我觉得这个帖子里说的“开关损耗最小正弦PWM”更简单易懂 ...

谢谢了···

出0入4汤圆

发表于 2018-10-25 11:43:39 | 显示全部楼层
SVPWM:是根据 Uα Uβ的角度来判断区间。然后每个区间再根据角度分成多段矢量(常用的有七段  五段),每个区间多段矢量的顺序不同而已,然后再计算出VA VB VC PWM的占空比,再就是直接发波

出0入0汤圆

 楼主| 发表于 2018-10-25 11:51:23 | 显示全部楼层
carefree1986 发表于 2018-10-25 11:43
SVPWM:是根据 Uα Uβ的角度来判断区间。然后每个区间再根据角度分成多段矢量(常用的有七段  五段),每 ...

这个原理倒是知道,现在就想测试出来这。还在找方法。

出0入4汤圆

发表于 2018-10-25 11:53:33 | 显示全部楼层
苹果520 发表于 2018-10-25 11:51
这个原理倒是知道,现在就想测试出来这。还在找方法。

用TI例程的代码就可以,讲原理的就TI得最清楚了,还附有代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2018-10-25 11:58:52 | 显示全部楼层
carefree1986 发表于 2018-10-25 11:53
用TI例程的代码就可以,讲原理的就TI得最清楚了,还附有代码

好的,谢谢。立马去看看····

出0入10汤圆

发表于 2018-10-25 12:02:28 | 显示全部楼层
支持一下

出0入0汤圆

 楼主| 发表于 2018-10-25 12:03:08 | 显示全部楼层
carefree1986 发表于 2018-10-25 11:53
用TI例程的代码就可以,讲原理的就TI得最清楚了,还附有代码

在启动的时候怎么判断SVPWM所在的扇区呢?(有霍尔传感器的前提下)

出0入0汤圆

发表于 2018-10-25 12:47:01 | 显示全部楼层
1,首先给一个假的电角度,电角度隔一段时间增加一次,确保输出的PWM占空比的值打印出来,用matlab或excel把图画出来,看看图是不是对的。
2,把真实的电角度放进去,电角度是通过霍尔或编码器获得的,跟电机参数极对数有关,给一个Iq=500(视情况确定值大小),Id=0,如果电机电角度对的,那电机就能转了。

出0入0汤圆

 楼主| 发表于 2018-10-25 12:56:29 来自手机 | 显示全部楼层
1.电角度有了,但是没有矩力电压跟磁通量电压阿。2.电机启动的初始化电角度是怎么来的?跟霍尔传感器有关系吗?

出0入4汤圆

发表于 2018-10-25 14:21:53 | 显示全部楼层
苹果520 发表于 2018-10-25 12:56
1.电角度有了,但是没有矩力电压跟磁通量电压阿。2.电机启动的初始化电角度是怎么来的?跟霍尔传感器有关系 ...

霍尔传感器的信号就是区间,你已经吧SVPWM和foc搞混了

出0入0汤圆

发表于 2018-10-25 14:29:57 | 显示全部楼层
电角度就是A相的反电势相位角度,霍尔传感器可以把一个电角度周期分成6份,每个区间60度,所以只有3个霍尔的电平状态的时候只能得到60度范围内的电角度,而霍尔的跳变沿就可以对应到精确的角度了

出0入0汤圆

发表于 2018-10-25 14:50:20 | 显示全部楼层
苹果520 发表于 2018-10-25 12:56
1.电角度有了,但是没有矩力电压跟磁通量电压阿。2.电机启动的初始化电角度是怎么来的?跟霍尔传感器有关系 ...

电角度初始化要根据你的实际电机参数确定,霍尔可以用来初始化电角度,但是这个角度精度不高的。一旦电机转起来了,要把编码器和霍尔结合起来。

出0入0汤圆

 楼主| 发表于 2018-10-25 15:02:38 | 显示全部楼层
carefree1986 发表于 2018-10-25 14:21
霍尔传感器的信号就是区间,你已经吧SVPWM和foc搞混了

我应该没有搞混,在SVPWM里面有6个扇区。想要实现当前的扇区合成磁通。需根据线电压的正负电压来计算。而在启动的时候线电压等于0.顾不知道怎么计算这个启动的时候怎么给电压

出0入0汤圆

 楼主| 发表于 2018-10-25 15:05:04 | 显示全部楼层
xiangbin099 发表于 2018-10-25 14:50
电角度初始化要根据你的实际电机参数确定,霍尔可以用来初始化电角度,但是这个角度精度不高的。一旦电机 ...

是不是一旦转起来再根据A相,B相,C相线电压判断所在扇区。

出0入0汤圆

 楼主| 发表于 2018-10-25 15:05:53 | 显示全部楼层
mandzy 发表于 2018-10-25 14:29
电角度就是A相的反电势相位角度,霍尔传感器可以把一个电角度周期分成6份,每个区间60度,所以只有3个霍尔 ...

嗯,你这么说,是可以大致确定SVPWM的扇区。

出0入8汤圆

发表于 2018-10-25 17:03:04 来自手机 | 显示全部楼层
svpwm函数的输入就是输出电压的幅值以及相位;电流环算出Ud,Uq,平方根求出电压幅值,反正切求的角度。原理就是这样的,lz说的Ua,Ub算,只不过是这个原理的另外的一个写法而已,lz要了解FOC的原理,而不是先看程序

出0入0汤圆

 楼主| 发表于 2018-10-25 17:17:17 | 显示全部楼层
mtswz.213 发表于 2018-10-25 17:03
svpwm函数的输入就是输出电压的幅值以及相位;电流环算出Ud,Uq,平方根求出电压幅值,反正切求的角度。原理就 ...

谢谢,正在理解。

出0入0汤圆

发表于 2018-10-25 22:39:04 来自手机 | 显示全部楼层
foc,一起学习

出0入0汤圆

 楼主| 发表于 2018-10-26 09:03:30 | 显示全部楼层

出0入0汤圆

发表于 2018-10-26 16:26:24 | 显示全部楼层
lcw_swust 发表于 2018-10-25 11:24
还是先用SPWM代替吧,因为
SVPWM我也不懂...
另外我觉得这个帖子里说的“开关损耗最小正弦PWM”更简单易懂 ...

收藏这一篇

出0入0汤圆

 楼主| 发表于 2018-10-26 18:11:32 | 显示全部楼层
大锤小趴 发表于 2018-10-26 16:59
正变换不用看,直接在逆park中 给定Valph = 20000;Vbeta = 0; theta角0 - 360 递增循环。 ...

嗯,已经实现这个功能了。串口也打印出来SVPWM了。打开TIM1也可以看到电机特别缓慢的选择··电机特别的烫。谢谢了

出50入0汤圆

发表于 2018-10-26 23:11:55 | 显示全部楼层
苹果520 发表于 2018-10-26 18:11
嗯,已经实现这个功能了。串口也打印出来SVPWM了。打开TIM1也可以看到电机特别缓慢的选择··电机特别的 ...

电机发烫是因为给定的V/F曲线跟电机的特性不一致,你给个电压,转子提前转到指定的位置了,角度还没及时更新,然后电机就堵转在这里了,电流就会很大

出0入0汤圆

 楼主| 发表于 2018-10-27 12:39:53 来自手机 | 显示全部楼层
嗯嗯,是的。现在把那些转换都加进去了。电机在轻微的抖动。单步运行会感觉正转一下反转一下。电角度没有变化。

出0入0汤圆

发表于 2018-10-27 13:15:46 | 显示全部楼层
苹果520 发表于 2018-10-26 18:11
嗯,已经实现这个功能了。串口也打印出来SVPWM了。打开TIM1也可以看到电机特别缓慢的选择··电机特别的 ...

秀出你的战绩svpwm

出0入0汤圆

发表于 2018-10-27 13:16:04 | 显示全部楼层
爱啃苹果的葱 发表于 2018-10-26 23:11
电机发烫是因为给定的V/F曲线跟电机的特性不一致,你给个电压,转子提前转到指定的位置了,角度还没及时 ...

秀出你的VF控制

出0入4汤圆

发表于 2018-10-27 13:31:49 | 显示全部楼层
微芯应用笔记里有一个有hall的SVPWM的例子。

出0入0汤圆

发表于 2018-10-27 15:50:36 | 显示全部楼层
liguangqang 发表于 2018-10-27 13:31
微芯应用笔记里有一个有hall的SVPWM的例子。

传上来大家分享下

出0入0汤圆

 楼主| 发表于 2018-10-27 16:20:28 | 显示全部楼层
看上去帖子有一点点热的迹象。希望能够活一点点····

出50入0汤圆

发表于 2018-10-27 22:49:32 | 显示全部楼层

把28楼好好多读几遍,真正读懂了就知道我秀没秀出来了

出0入4汤圆

发表于 2018-10-28 10:12:12 | 显示全部楼层
#include "svm.h"
//-------------------------------------------------------------------------------------
//空间矢量区间
#define        VECTOR1                0x0000                        // 0   degrees
#define        VECTOR2                0x2aaa                        // 60  degrees
#define        VECTOR3                0x5555                        // 120 degrees
#define        VECTOR4                0x8000                        // 180 degrees
#define        VECTOR5                0xaaaa                        // 240 degrees
#define        VECTOR6                0xd555                        // 300 degrees
#define        SIXTY_DEG        0x2aaa                       

//最大电压值
#define VOLTS_LIMIT        28300  
         
//正弦波表60度171点
const int sinetable[] =
{
            0,  201,  401,  602,  803, 1003, 1204, 1404, 1605, 1805, 2005, 2206, 2406,
         2606, 2806, 3006, 3205, 3405, 3605, 3804, 4003, 4202, 4401, 4600, 4799, 4997,
         5195, 5393, 5591, 5789, 5986, 6183, 6380, 6577, 6773, 6970, 7166, 7361, 7557,
         7752, 7947, 8141, 8335, 8529, 8723, 8916, 9109, 9302, 9494, 9686, 9877,10068,
        10259,10449,10639,10829,11018,11207,11395,11583,11771,11958,12144,12331,12516,
        12701,12886,13070,13254,13437,13620,13802,13984,14165,14346,14526,14706,14885,
        15063,15241,15419,15595,15772,15947,16122,16297,16470,16643,16816,16988,17159,
        17330,17500,17669,17838,18006,18173,18340,18506,18671,18835,18999,19162,19325,
        19487,19647,19808,19967,20126,20284,20441,20598,20753,20908,21062,21216,21368,
        21520,21671,21821,21970,22119,22266,22413,22559,22704,22848,22992,23134,23276,
        23417,23557,23696,23834,23971,24107,24243,24377,24511,24644,24776,24906,25036,
        25165,25293,25420,25547,25672,25796,25919,26042,26163,26283,26403,26521,26638,
        26755,26870,26984,27098,27210,27321,27431,27541,27649,27756,27862,27967,28071,
        28174,28276,28377
};
//-------------------------------------------------------------------------------------
//描述: SVPWM发生器
//参数: volts:电压向量 angle:角度(0-0xFFFF)
//返回:        无
//-------------------------------------------------------------------------------------
void SVM(int16_t volts, uint16_t angle)
{
        // These variables hold the normalized sector angles used to find
        // t1, t2.
        uint16_t angle1, angle2;

        // These variables hold the space vector times.
        uint16_t half_t0,t1,t2,tpwm;

        // Calculate the total PWM count period, which is twice the value
        // in the PTPER register.
        tpwm = PTPER << 1;

        // Limit volts input to avoid overmodulation.
        if(volts > VOLTS_LIMIT) volts = VOLTS_LIMIT;

        if(angle < VECTOR2)
        {
                angle2 = angle - VECTOR1;                // Reference SVM angle to the current
                                            // sector
                angle1 = SIXTY_DEG - angle2;        // Calculate second angle referenced to
                                            // sector

                t1 = sinetable[(uint8_t)(angle1 >> 6)];        // Look up values from
                                                            // table.
                t2 = sinetable[(uint8_t)(angle2 >> 6)];

                // Scale t1 to by the volts variable.
                t1 = ((int32_t)t1*(int32_t)volts) >> 15;
                // Scale t1 for the duty cycle range.
                t1 = ((int32_t)t1*(int32_t)tpwm) >> 15;
                // Scale t2 time
                t2 = ((int32_t)t2*(int32_t)volts) >> 15;
                t2 = ((int32_t)t2*(int32_t)tpwm) >> 15;

                half_t0 = (tpwm - t1 - t2) >> 1;                // Calculate half_t0 null time from
                                                    // period and t1,t2
       
                // Calculate duty cycles for Sector 1  (0 - 59 degrees)
                PDC1 = t1 + t2 + half_t0;
                PDC2 = t2 + half_t0;
                PDC3 = half_t0;
        }
        else if(angle < VECTOR3)
        {
                angle2 = angle - VECTOR2;                // Reference SVM angle to the current
                                            // sector
                angle1 = SIXTY_DEG - angle2;        // Calculate second angle referenced to
                                             // sector

                t1 = sinetable[(uint8_t)(angle1 >> 6)];        // Look up values from
                                                     // table.
                t2 = sinetable[(uint8_t)(angle2 >> 6)];

                // Scale t1 to by the volts variable.
                t1 = ((int32_t)t1*(int32_t)volts) >> 15;
                // Scale t1 for the duty cycle range.
                t1 = ((int32_t)t1*(int32_t)tpwm) >> 15;
                // Scale t2 time
                t2 = ((int32_t)t2*(int32_t)volts) >> 15;
                t2 = ((int32_t)t2*(int32_t)tpwm) >> 15;

                half_t0 = (tpwm - t1 - t2) >> 1;                // Calculate half_t0 null time from
                                                    // period and t1,t2
       
                // Calculate duty cycles for Sector 2  (60 - 119 degrees)
                PDC1 = t1 + half_t0;
                PDC2 = t1 + t2 + half_t0;
                PDC3 = half_t0;
        }
        else if(angle < VECTOR4)
        {
                angle2 = angle - VECTOR3;                // Reference SVM angle to the current
                                              // sector
                angle1 = SIXTY_DEG - angle2;        // Calculate second angle referenced to
                                             // sector

                t1 = sinetable[(uint8_t)(angle1 >> 6)];        // Look up values from
                                                      // table.
                t2 = sinetable[(uint8_t)(angle2 >> 6)];

                // Scale t1 to by the volts variable.
                t1 = ((int32_t)t1*(int32_t)volts) >> 15;
                // Scale t1 for the duty cycle range.
                t1 = ((int32_t)t1*(int32_t)tpwm) >> 15;
                // Scale t2 time
                t2 = ((int32_t)t2*(int32_t)volts) >> 15;
                t2 = ((int32_t)t2*(int32_t)tpwm) >> 15;

                half_t0 = (tpwm - t1 - t2) >> 1;                // Calculate half_t0 null time from
                                                    // period and t1,t2
       
                // Calculate duty cycles for Sector 3  (120 - 179 degrees)
                PDC1 = half_t0;
                PDC2 = t1 + t2 + half_t0;
                PDC3 = t2 + half_t0;
        }
        else if(angle < VECTOR5)               
        {
                angle2 = angle - VECTOR4;                // Reference SVM angle to the current
                                            // sector
                angle1 = SIXTY_DEG - angle2;        // Calculate second angle referenced to
                                            // sector

                t1 = sinetable[(uint8_t)(angle1 >> 6)];        // Look up values from
                                                       // table.
                t2 = sinetable[(uint8_t)(angle2 >> 6)];
               
                // Scale t1 to by the volts variable.
                t1 = ((int32_t)t1*(int32_t)volts) >> 15;
                // Scale t1 for the duty cycle range.
                t1 = ((int32_t)t1*(int32_t)tpwm) >> 15;
                // Scale t2 time
                t2 = ((int32_t)t2*(int32_t)volts) >> 15;
                t2 = ((int32_t)t2*(int32_t)tpwm) >> 15;

                half_t0 = (tpwm - t1 - t2) >> 1;                // Calculate half_t0 null time from
                                                    // period and t1,t2
       
                // Calculate duty cycles for Sector 4  (180 - 239 degrees)
                PDC1 = half_t0;
                PDC2 = t1 + half_t0;
                PDC3 = t1 + t2 + half_t0;
        }
        else if(angle < VECTOR6)
        {
                angle2 = angle - VECTOR5;                // Reference SVM angle to the current
                                             // sector
                angle1 = SIXTY_DEG - angle2;        // Calculate second angle referenced to
                                             // sector

                t1 = sinetable[(uint8_t)(angle1 >> 6)];        // Look up values from
                                                // table.
                t2 = sinetable[(uint8_t)(angle2 >> 6)];

                // Scale t1 to by the volts variable.
                t1 = ((int32_t)t1*(int32_t)volts) >> 15;
                // Scale t1 for the duty cycle range.
                t1 = ((int32_t)t1*(int32_t)tpwm) >> 15;
                // Scale t2 time
                t2 = ((int32_t)t2*(int32_t)volts) >> 15;
                t2 = ((int32_t)t2*(int32_t)tpwm) >> 15;

                half_t0 = (tpwm - t1 - t2) >> 1;                // Calculate half_t0 null time from
                                                // period and t1,t2
       
                // Calculate duty cycles for Sector 5  (240 - 299 degrees)
                PDC1 = t2 + half_t0;
                PDC2 = half_t0;
                PDC3 = t1 + t2 + half_t0;
        }
        else
        {
                angle2 = angle - VECTOR6;                // Reference SVM angle to the current
                                            // sector
                angle1 = SIXTY_DEG - angle2;        // Calculate second angle referenced to
                                        // sector

                t1 = sinetable[(uint8_t)(angle1 >> 6)];        // Look up values from
                                                    // table.
                t2 = sinetable[(uint8_t)(angle2 >> 6)];

                // Scale t1 to by the volts variable.
                t1 = ((int32_t)t1*(int32_t)volts) >> 15;
                // Scale t1 for the duty cycle range.
                t1 = ((int32_t)t1*(int32_t)tpwm) >> 15;
                // Scale t2 time
                t2 = ((int32_t)t2*(int32_t)volts) >> 15;
                t2 = ((int32_t)t2*(int32_t)tpwm) >> 15;

                half_t0 = (tpwm - t1 - t2) >> 1;                // Calculate half_t0 null time from
                                                // period and t1,t2
       
                // Calculate duty cycles for Sector 6  ( 300 - 359 degrees )
                PDC1 = t1 + t2 + half_t0;
                PDC2 = half_t0;
                PDC3 = t1 + half_t0;
        }
}

出0入0汤圆

 楼主| 发表于 2018-10-28 10:14:59 | 显示全部楼层
liguangqang 发表于 2018-10-28 10:12
#include "svm.h"
//--------------------------------------------------------------------------------- ...

给一个大写的赞··· 看了那么多帖子。楼上兄弟是少有的几个贴code的。

出0入0汤圆

发表于 2018-10-28 11:29:04 来自手机 | 显示全部楼层
我也是来学习的,svpwm

出0入0汤圆

 楼主| 发表于 2018-10-30 17:08:44 | 显示全部楼层
liguangqang 发表于 2018-10-28 10:12
#include "svm.h"
//--------------------------------------------------------------------------------- ...

现在发现电机可以转起来,但是抖动跟发热比较严重·········

出0入4汤圆

发表于 2018-10-30 19:45:49 | 显示全部楼层
有hall的是吧,看一下相电压波形,是不是马蹄形并有没有二次开启现像。抖动说明换相不对。

出0入0汤圆

 楼主| 发表于 2018-10-31 08:41:50 | 显示全部楼层
liguangqang 发表于 2018-10-30 19:45
有hall的是吧,看一下相电压波形,是不是马蹄形并有没有二次开启现像。抖动说明换相不对。 ...

是用示波器监控向电压对吧,有没有什么好的办法检测huall的电角度对不对?目前正在找办法测试HALL的电角度对不对!

出0入0汤圆

 楼主| 发表于 2018-11-14 15:17:45 | 显示全部楼层
liguangqang 发表于 2018-10-30 19:45
有hall的是吧,看一下相电压波形,是不是马蹄形并有没有二次开启现像。抖动说明换相不对。 ...

可以具体点再说说方法吗?我现在发现-3500的Id比正在顺畅多了。现在我自己有点不知道怎么才算调试好了。···············

出0入4汤圆

发表于 2018-11-14 16:59:22 | 显示全部楼层
先将三相电压滤波后就是马蹄形,三相互差180度。不用管hall开环测试就好了。出来三相波形对了后再根据hall边沿信号直接给定 0,60,120等角度。每一个边沿置相应的角度中间人为以上次转速加角度变化量

出0入0汤圆

 楼主| 发表于 2018-11-14 17:03:52 | 显示全部楼层
liguangqang 发表于 2018-11-14 16:59
先将三相电压滤波后就是马蹄形,三相互差180度。不用管hall开环测试就好了。出来三相波形对了后再根据hall ...

嗯,那个波形出来了。上下都是
                   .-' _..`.
                  /  .'_.'.'
                 | .' (.)`.
                 ;'   ,_   `.
.--.__________.'    ;  `.;-'
|  ./               /
|  |               /
`..'`-._  _____, ..'
     / | |     | |\ \
    / /| |     | | \ \
   / / | |     | |  \ \
  /_/  |_|     |_|   \_\
|__\  |__\    |__\  |__\帝行。1.现在是低速的时候抖动严重。2.我现在不知道现在这个转法对不对。3.PI的参数我也是随便改的。不知如果调节它

出0入4汤圆

发表于 2018-11-20 10:59:58 | 显示全部楼层
carefree1986 发表于 2018-10-25 11:43
SVPWM:是根据 Uα Uβ的角度来判断区间。然后每个区间再根据角度分成多段矢量(常用的有七段  五段),每 ...

请问如果我有磁编码器读出绝对位置,譬如0~32767,那么能否用这些数值划分区间?
如果可以,是否就可以取消所有电流检测,直接用svpwm驱动马达转动?

出0入4汤圆

发表于 2018-11-20 11:18:42 | 显示全部楼层
jetta2014 发表于 2018-11-20 10:59
请问如果我有磁编码器读出绝对位置,譬如0~32767,那么能否用这些数值划分区间?
如果可以,是否就可以 ...

闭环矢量就是用编码器反馈的脉冲数计算扇区的,电流检测去掉后你怎么做电流环?如何知道转矩输出是多少?

出0入4汤圆

发表于 2018-11-20 14:03:06 | 显示全部楼层
carefree1986 发表于 2018-11-20 11:18
闭环矢量就是用编码器反馈的脉冲数计算扇区的,电流检测去掉后你怎么做电流环?如何知道转矩输出是多少? ...

谢谢回复,我先实践一下。

至于电流检测疑惑,起因是我拆解了一个3轴的手持云台,这个云台号称foc驱动,却没看到任何电流检测电阻,但性能非常不错。

然后我用同一个pcba,写入自己的spwm驱动,实测轻载可以,但重载明显比原来的差。

后来上网对比了spwm与svpwm的差异,所以打算用svpwm试下。

另外,在网上也有提到简化foc模式,视乎真是可以不用电流检测的:
http://www.olliw.eu/2017/field-oriented-control/

出0入4汤圆

发表于 2018-11-20 14:25:00 | 显示全部楼层
本帖最后由 carefree1986 于 2018-11-20 14:26 编辑
jetta2014 发表于 2018-11-20 14:03
谢谢回复,我先实践一下。

至于电流检测疑惑,起因是我拆解了一个3轴的手持云台,这个云台号称foc驱动, ...


不用电流检测  其实还不是完整的系统,因为可能只是用了速度环还有可能连速度环都不用,实际输出转矩是不知道的,要求不高玩玩没问题,真正的产品的话肯定会有问题

出0入0汤圆

发表于 2018-11-20 16:41:55 | 显示全部楼层
1000元,指点你直到完全懂了为止!

出0入0汤圆

 楼主| 发表于 2018-11-22 09:31:06 | 显示全部楼层
zf12862177 发表于 2018-11-20 16:41
1000元,指点你直到完全懂了为止!

已经私信给你了····

出10入12汤圆

发表于 2018-11-22 10:50:21 | 显示全部楼层
输出正弦波就可以了

出0入0汤圆

发表于 2018-11-22 15:03:21 | 显示全部楼层
虽然没有给出源代码,但是讨论也是给出很多思路了,谢谢前辈

出0入0汤圆

 楼主| 发表于 2018-11-23 14:07:05 | 显示全部楼层
jetta2014 发表于 2018-11-20 14:03
谢谢回复,我先实践一下。

至于电流检测疑惑,起因是我拆解了一个3轴的手持云台,这个云台号称foc驱动, ...

不用电流检测他怎么实现电流环呢?力矩怎么控制呢?··········

出0入4汤圆

发表于 2018-11-23 15:58:03 | 显示全部楼层
liguangqang 发表于 2018-10-28 10:12
#include "svm.h"
//--------------------------------------------------------------------------------- ...

还是你的代码管用!修改一下就马上可以转了,用Jscope看了下Tim1,2,3的数据,还真是马蹄形的!

出0入4汤圆

发表于 2018-11-23 16:13:34 | 显示全部楼层
carefree1986 发表于 2018-11-20 14:25
不用电流检测  其实还不是完整的系统,因为可能只是用了速度环还有可能连速度环都不用,实际输出转矩是不 ...

我的马达也已经用svpwm驱动起来了。打算加 速度环试下,请问速度环应该怎么加(是将 原 位置环 输出接入 速度环给定?最后控制马达?),有没参考资料推荐一下,谢谢!

出0入4汤圆

发表于 2018-11-23 16:51:48 | 显示全部楼层
苹果520 发表于 2018-11-23 14:07
不用电流检测他怎么实现电流环呢?力矩怎么控制呢?··········

是的,这也是我在思考的问题。
但看回我的应用,做位置定位,有磁编,云台马达转动慢。大家提到的电流环在我应用中,无非就是当力矩不足时,可以自动调高电流(也就是调高SVM(int volts, unsigned int angle)中的volts),保证力矩输出。
而对于固定负载,力矩间接决定了转速度,所以我测出转速,做速度环,是否也起到电流环的作用?

出0入4汤圆

发表于 2018-11-23 17:05:21 | 显示全部楼层
jetta2014 发表于 2018-11-23 16:51
是的,这也是我在思考的问题。
但看回我的应用,做位置定位,有磁编,云台马达转动慢。大家提到的电流环 ...

只是起到了稳速的作用,不知道实际的力矩是多少,你要求低的话没有问题的

出0入0汤圆

 楼主| 发表于 2018-11-23 17:32:11 | 显示全部楼层
jetta2014 发表于 2018-11-23 15:58
还是你的代码管用!修改一下就马上可以转了,用Jscope看了下Tim1,2,3的数据,还真是马蹄形的!
...

看波形的是什么工具···

出0入4汤圆

发表于 2018-11-24 09:17:30 | 显示全部楼层
接一个RC用示波器就可以看到,有磁编码的直接给角度应该是可以转起来的,有些为了省钱或减少空间是用管子压降来采样电流的。应该是要加入电流环才好防堵转烧管。

出0入4汤圆

发表于 2018-11-26 09:19:32 | 显示全部楼层
苹果520 发表于 2018-11-23 17:32
看波形的是什么工具···

jlink的一个附带软件。你在论坛搜一下就知道啦。

出0入4汤圆

发表于 2018-11-26 09:41:45 | 显示全部楼层
liguangqang 发表于 2018-11-24 09:17
接一个RC用示波器就可以看到,有磁编码的直接给角度应该是可以转起来的,有些为了省钱或减少空间是用管子压 ...

其实没编码器一样转,就是步进那样控嘛!
下面是这段时间的心得:
将这个void SVM(int16_t volts, uint16_t angle) 翻译一下 ,其是就是SVM(给定扭力,模拟脉冲)。
给定扭力:0~28300,你想力大就调到28300,当然要结合负载,否则大部分能量用在发热。
模拟脉冲:0~65535,要马达转起来,就是执行i=i+1;SVM(20000, i);就得了。
注意,这里模拟脉冲是将360度电度角分为65536份,对于一个14极的马达,转一圈经历7组电度角,所以要转一圈要发许多脉冲。
有同学会问,要转快点这么办?脉冲发快点,当然还是跳步爽, i=i+x;SVM(20000, i);  但x不能大于SIXTY_DEG。

出0入0汤圆

 楼主| 发表于 2018-11-26 10:22:33 | 显示全部楼层
jetta2014 发表于 2018-11-26 09:19
jlink的一个附带软件。你在论坛搜一下就知道啦。

jlink v9 串口输出  你说的是这个吗?这个会不会实际的串口省事

出0入4汤圆

发表于 2018-11-26 23:34:01 来自手机 | 显示全部楼层
jetta2014 发表于 2018-11-26 09:41
其实没编码器一样转,就是步进那样控嘛!
下面是这段时间的心得:
将这个void SVM(int16_t volts, uint16 ...

我发出来的当然知道怎么用呀,步进是可以力矩很小的

出0入0汤圆

发表于 2019-1-7 16:38:29 来自手机 | 显示全部楼层
jetta2014 发表于 2018-11-26 09:41
其实没编码器一样转,就是步进那样控嘛!
下面是这段时间的心得:
将这个void SVM(int16_t volts, uint16 ...

我用SVM这个代码开环测试,发现电机会走走停停,360度内停六次,是什么原因呢?

出0入0汤圆

发表于 2019-1-7 16:42:16 来自手机 | 显示全部楼层
liguangqang 发表于 2018-11-26 23:34
我发出来的当然知道怎么用呀,步进是可以力矩很小的

请教一下,用void SVM(int16_t volts, uint16_t angle) ,给定一个固定的volts,然后让angle从0~0xffff循环递增,开环测试发现电机在360度内走走停停六次,这是正常的吗?

出0入4汤圆

发表于 2019-1-7 17:00:31 | 显示全部楼层
其实你只要按顺序发下面六个角度,马达就可以定向转动了。而这六个角度就是普通无刷马达六步驱动法嘛!这样你可以应该可以查出问题了。另外,你是开环驱动,先别带载。
#define        VECTOR1                0x0000                        // 0   degrees
#define        VECTOR2                0x2aaa                        // 60  degrees
#define        VECTOR3                0x5555                        // 120 degrees
#define        VECTOR4                0x8000                        // 180 degrees
#define        VECTOR5                0xaaaa                        // 240 degrees
#define        VECTOR6                0xd555                        // 300 degrees

出0入0汤圆

 楼主| 发表于 2019-1-7 17:03:36 | 显示全部楼层
jetta2014 发表于 2019-1-7 17:00
其实你只要按顺序发下面六个角度,马达就可以定向转动了。而这六个角度就是普通无刷马达六步驱动法嘛!这样 ...

这样好像不行吧

出0入0汤圆

发表于 2019-1-7 17:04:49 来自手机 | 显示全部楼层
jetta2014 发表于 2019-1-7 17:00
其实你只要按顺序发下面六个角度,马达就可以定向转动了。而这六个角度就是普通无刷马达六步驱动法嘛!这样 ...

目前没有带负载,角度是按10递增的,每250us递增一次,结果发现电机并没有匀速运行

出0入4汤圆

发表于 2019-1-7 17:15:29 | 显示全部楼层
hadio 发表于 2019-1-7 17:04
目前没有带负载,角度是按10递增的,每250us递增一次,结果发现电机并没有匀速运行 ...

按照我刚才给的6步,矢量电压给大(最大28300),大才有力!然后间隔时间给长,2s一步,应该一步一步转起来了。
如果都不行,就直接用定时器输出PWM走六步。譬如:
                                TIM1->CCR1 = Test_PWR;  
                                TIM1->CCR2 = 0;
                                TIM1->CCR3 = 0;

                                TIM1->CCR1 = Test_PWR;
                                TIM1->CCR2 = 0;
                                TIM1->CCR3 = Test_PWR;
                               ……
如果这都走不了,我会怀疑驱动桥了。

出0入0汤圆

发表于 2019-1-7 17:24:02 来自手机 | 显示全部楼层
jetta2014 发表于 2019-1-7 17:15
按照我刚才给的6步,矢量电压给大(最大28300),大才有力!然后间隔时间给长,2s一步,应该一步一步转起 ...

电机正反方向都可以走,只是没有匀速走,程序给的角度是按时间均匀递增的,

出0入4汤圆

发表于 2019-1-7 17:38:07 | 显示全部楼层
hadio 发表于 2019-1-7 17:24
电机正反方向都可以走,只是没有匀速走,程序给的角度是按时间均匀递增的, ...

间隔时间2s,走6步也不均匀吗?
还是缩短到某一个间隔时间就开始不均匀?

出0入0汤圆

发表于 2019-1-7 18:35:31 来自手机 | 显示全部楼层
本帖最后由 hadio 于 2019-1-7 18:37 编辑
jetta2014 发表于 2019-1-7 17:38
间隔时间2s,走6步也不均匀吗?
还是缩短到某一个间隔时间就开始不均匀?
...


走六步太粗糙了,能明显看到是六步,但我把角度细分,根据SVM(int16_t volts,uint16_t angle)函数可知360度对应0~0xffff,我每次递增一个很小的角度:10÷65536X360≈0.018度,每隔0.25ms递增一次,按道理说,电机应该比较匀速地运动,但实际上能感觉到速度时快时慢,每360度有规律地变化六次

出0入4汤圆

发表于 2019-1-7 19:08:24 | 显示全部楼层
hadio 发表于 2019-1-7 18:35
走六步太粗糙了,能明显看到是六步,但我把角度细分,根据SVM(int16_t volts,uint16_t angle)函数可知360 ...

可能是旋转磁场和转子转动速度不匹配导致的,毕竟是开环驱动,没反馈。
既然驱动无问题,你可以试下将电角度连续慢速递增,angle++,应该会比较匀速。
另外,你说360度是指360电角度吧?你的是几对极无刷?

出0入0汤圆

发表于 2019-1-7 22:08:01 来自手机 | 显示全部楼层
jetta2014 发表于 2019-1-7 19:08
可能是旋转磁场和转子转动速度不匹配导致的,毕竟是开环驱动,没反馈。
既然驱动无问题,你可以试下将电 ...

是的,360指电角度,4对极

出0入0汤圆

发表于 2019-1-10 13:17:22 来自手机 | 显示全部楼层
SVPWM只是一直马鞍波的调制方式,只是零矢量的摆放位置不同。电机的位置判断还是提现的控制算法里。

出0入4汤圆

发表于 2019-1-12 08:34:49 | 显示全部楼层
开环步进是要按 V/F 曲线来走的,不是给个电压和角速度就能转得好,不然没必要闭环运行

出0入0汤圆

发表于 2019-1-12 09:37:11 | 显示全部楼层
liguangqang 发表于 2019-1-12 08:34
开环步进是要按 V/F 曲线来走的,不是给个电压和角速度就能转得好,不然没必要闭环运行 ...

V/F 曲线  这个是怎么的来了

出0入0汤圆

发表于 2019-1-12 15:40:56 | 显示全部楼层
mark一下:简化FOC

出0入0汤圆

发表于 2019-1-12 16:23:11 | 显示全部楼层
图很清晰,基本原理

出0入0汤圆

发表于 2019-1-14 21:55:01 来自手机 | 显示全部楼层
PARK和反PARK

出0入0汤圆

发表于 2019-1-14 21:57:03 来自手机 | 显示全部楼层
最近一直疑惑不解:PARK和反PARK变换的θ角,是通过编码器读取转子的位置计算得到的吗?

出0入0汤圆

 楼主| 发表于 2019-1-15 08:54:53 | 显示全部楼层
hadio 发表于 2019-1-14 21:57
最近一直疑惑不解:PARK和反PARK变换的θ角,是通过编码器读取转子的位置计算得到的吗? ...

是的,是通过那个获得的。

出0入0汤圆

发表于 2019-2-26 10:58:14 | 显示全部楼层
liguangqang 发表于 2019-1-12 08:34
开环步进是要按 V/F 曲线来走的,不是给个电压和角速度就能转得好,不然没必要闭环运行 ...

请教下  电机的V/F曲线如何测量呢

出105入79汤圆

发表于 2019-4-16 13:19:11 | 显示全部楼层
svpwm 不是正弦波,是加入3次谐波的三相正弦
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 04:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表