搜索
bottom↓
回复: 69

三相BLDC无刷直流电机的无传感器控制

[复制链接]

出0入0汤圆

发表于 2006-2-26 11:34:29 | 显示全部楼层 |阅读模式
三相BLDC无刷直流电机的无传感器控制

我想买阿莫的调试板做上面的试验,MCU用ATMEL的,看了几天PIC关于这个问题的实现方法,楞没看懂,也不敢买调试板了。有大哥指点下吗?先谢了。

BEMF过零点检测实现方法,电压开环PWM控制电机速度,启动制动平稳,母线电压48V。就这么简单。

附件是DSPIC对于直流无刷BLDC无传感器电机控制的应用笔记(中文)和源代码:

点击此处打开armok01104153.pdf

点击此处下载armok01104154.zip




-----此内容被alisha于2006-02-26,11:35:05编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入8汤圆

发表于 2006-2-26 20:17:26 | 显示全部楼层
BEMF是经典的设计,一般控制有电压环,也有电流环,多半是使用开环来预转,先算出转子位置,然后使用闭环PI来做速度调节,有些会有PID来控制。要做BLDC最好PWM是六路的,有死区控制的,带上下桥臂输出。



我现在有几个这样的客户我在搞技术支持,不过使用的是ST7MC,也有用dsPIC4011,不过我ST7MC用的多写。主要是用于BLDC的变频控制。我有Microchip的dsPIC做的变频空调应用笔记,可惜,我暂时不能放出来。



阿莫的调试板用ATMEL的MCU看你用的是那个型号了,我记得AVR有个专门用来做电机控制的MCU可以,可惜要自己写PI,比较累。ST的你可以在他的网站上下载全部的代码。还有dsp也可以做,你可到Freescale上找到BLDC的变频控制笔记和代码。

出0入0汤圆

 楼主| 发表于 2006-3-11 10:55:04 | 显示全部楼层
可还是看不懂,没有个清晰的概念,觉得无从下手!

出0入0汤圆

发表于 2006-3-11 20:16:44 | 显示全部楼层
Grant

PI很难么?应该就是一个乘加算法吧?

出0入8汤圆

发表于 2006-3-12 13:35:46 | 显示全部楼层
这是ST 三相BLDC的变频控制PI算法;







/**************** (c) 2005 STMicroelectronics **********************



PROJECT  : ST7MC demokit

COMPILER : ST7 METROWERKS C (HIWARE) / COSMIC



MODULE  :  regul.c

LIBRARY VERSION  :  2.0



CREATION DATE : 07.2003

AUTHOR :      Florent COSTE        /  Microcontroller Application Lab  / ST Hong Kong



-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-



DESCRIPTION :   routine for closed LOOP operation              



-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-



******************************************************************************

THE SOFTWARE INCLUDED IN THIS FILE IS FOR GUIDANCE ONLY. ST MICROELECTRONICS

SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES

WITH RESPECT TO ANY CLAIMS ARISING FROM USE OF THIS SOFTWARE.

******************************************************************************

              

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-



******************************************************************************/



#include "version.h"

#include "lib.h"

#include "mtc.h"

#include "regul.h"

#include "ST7MC_hr.h"

#include "it_ST7MC.h"

#include "LinSCI.h"

#include "MTC_Settings_Sensorless.h"





#define Error_slip_MAX   (s16)2048

#define Error_slip_MIN   (s16)-2048  



#define MTIM_MAX_FREQ    MTC_CLOCK/8     // 16Mhz/8 -> 2Mhz

  

//--------------------------------------

// Variables

//--------------------------------------



static s32 VoltageIntegralTerm;

static BOOL MaxPiOut,MinPiOut;      

volatile Step_s Step_Z[STEP_Z_BUFFER_SIZE];    // buffer filled with the last 12 Z step times





/*-------------------Main program-------------------- */



/*-----------------------------------------------------------------------------

ROUTINE Name :  Period_To_Frequency



Description:        Convert Step_Z buffer information (electrical period) into

                                electrical frequency.

               

Input/Output:        none/u16 (electrical frequency, 0.1 Hz resolution)

Comments:                 None

-----------------------------------------------------------------------------*/



u16 Period_To_Frequency(void)

{

u32 result;

u16 MZ_Temp;

u8 Ratio_Min, i;



/********************** Compute average Motor Z Step Period ********************************/

// F = Fmtc/(MZREG.2^ratio)    T = (MZREG.2^ratio)/Fmtc

  

Ratio_Min = RATIO_MAX;    // init Ratio_Min with max ratio

MZ_Temp = 0;



for (i=0;i<=STEP_Z_BUFFER_SIZE-1;i++)  // check max ratio of buffer

    {

    if (Step_Z.Ratio < Ratio_Min) Ratio_Min = Step_Z.Ratio;

    }

// Ratio_Min contains now the min ratio of stored values in Step_Z buffer



for (i=0;i<=STEP_Z_BUFFER_SIZE-1;i++)     // Compute average period

    {                                 

    if (Step_Z.Ratio == Ratio_Min) MZ_Temp += (u8)(Step_Z.StepTime);

    else MZ_Temp += ((Step_Z.StepTime)<<((u8)(Step_Z.Ratio-Ratio_Min)));

    }



/***** Convert period to frequency *****/

result = (10*MTIM_MAX_FREQ)/MZ_Temp;

result >>= (u8)(Ratio_Min);           //divide by 2^ratio



return((u16)(result));

}



/*Initialisation of Integral term of PI*/

void Init_PI(void)

{

#if (DRIVING_MODE == VOLTAGE_MODE)

VoltageIntegralTerm = (((ramp_MCPUH<<8) + ramp_MCPUL)>>3)*65536;

VoltageIntegralTerm /= PWM_FREQUENCY;

#else

VoltageIntegralTerm = (((ramp_MCPVH<<8) + ramp_MCPVL)>>3)*65536;

VoltageIntegralTerm /= PWM_FREQUENCY;

#endif

}





/*-----------------------------------------------------------------------------

ROUTINE Name :  regul_PI



Description:        Compute PI output (0 (PI min) to 1023 (PI max)) according to Ki,

                                Kp, sampling time, and target electrical frequency.

               

Input/Output:        u16/u16 (PI output (10 bits value)/target electrical frequency, 0.1 Hz resolution)

Comments:         None

-----------------------------------------------------------------------------*/

u16 regul_PI(u16 Target_Freq)      // return 10 bits value

{      

s32 Voltage_slip_s32,DeltaVoltage_slip_s32,Newpi_32;

s16 NewPIoutput, Error_slip,Error;

u16 output;





/********************** Compute PI output ***************************************/



Freq_Motor = (u16)Period_To_Frequency();



Error = (s16)(Target_Freq - Freq_Motor);  // Freq_Motor is actually the step time between 6 Z events

if (Error > (s16)(Error_slip_MAX))

        {

        Error_slip = Error_slip_MAX;

        }

else if (Error < (s16)(Error_slip_MIN))

        {

        Error_slip = Error_slip_MIN;

        }

else Error_slip = (s16)Error;







/********************** Compute Proportional term ********************************/



Voltage_slip_s32 = Kp * (s32)Error_slip;



/********************** Compute Integral term ************************************/

// If modulation is maximum, integral term must be "frozen"



DeltaVoltage_slip_s32 = ( Ki * SAMPLING_TIME * (s32)Error_slip)/256;



if( ((Error_slip>0) && !MaxPiOut) || ((Error_slip<0) && !MinPiOut) )

        {

        if ((VoltageIntegralTerm >= 0) && (DeltaVoltage_slip_s32 >= 0))

                {

                if (( (u32)VoltageIntegralTerm + (u32)DeltaVoltage_slip_s32 ) > S32_MAX)

                        VoltageIntegralTerm = S32_MAX;        // Avoid IntTerm Overflow

                else VoltageIntegralTerm += DeltaVoltage_slip_s32; // "integral" output

                }

        else if ((VoltageIntegralTerm < 0) && (DeltaVoltage_slip_s32 < 0))

                {

                if (( (u32)VoltageIntegralTerm + (u32)DeltaVoltage_slip_s32 ) <= S32_MAX)

                        VoltageIntegralTerm = S32_MIN;        // Avoid IntTerm Overflow

                else VoltageIntegralTerm += DeltaVoltage_slip_s32; // "integral" output

                }

         else

                VoltageIntegralTerm += DeltaVoltage_slip_s32; // "integral" output

        }



    if ((VoltageIntegralTerm >= 0) && (Voltage_slip_s32 >= 0))

                {

                if (( (u32)VoltageIntegralTerm + (u32)Voltage_slip_s32 ) > S32_MAX)

                        Newpi_32 = S32_MAX;        // Avoid IntTerm Overflow

                else Newpi_32 = (VoltageIntegralTerm + Voltage_slip_s32); //  output

                }

        else if ((VoltageIntegralTerm < 0) && (Voltage_slip_s32 < 0))

                {

                if (( (u32)VoltageIntegralTerm + (u32)Voltage_slip_s32 ) <= S32_MAX)

                        Newpi_32 = S32_MIN;        // Avoid IntTerm Overflow

                else Newpi_32 = (VoltageIntegralTerm + Voltage_slip_s32); //  output

                }

         else



                Newpi_32 = (VoltageIntegralTerm + Voltage_slip_s32); //  output

       

#if (DRIVING_MODE == VOLTAGE_MODE)

    NewPIoutput = (s16)( Newpi_32 /64);

#else

    NewPIoutput = (s16)( Newpi_32 /256);                                    

#endif



if ( NewPIoutput < 0 )

        {

        output = 0;

        MinPiOut = TRUE;

        }

else if ( NewPIoutput > 1024 )

        {

        output = 1024;

        MaxPiOut = TRUE;  // Set ClampFlag if modulation reaches maximum value

        }

else

        {

        output = NewPIoutput;

        MinPiOut = FALSE;

        MaxPiOut = FALSE;

        }



return (output);  // return PI output

}

      



/*** (c) 2005  STMicroelectronics ****************** END OF FILE ***/

出0入8汤圆

发表于 2006-3-12 13:49:01 | 显示全部楼层
Microchip的PI算法:

你在Microchip网站上找Sensorless BLDC Motor Control Using dsPIC30F2010.zip

应用笔记的源代码。

里面有个 medium_event.c文件,有个函数void speed_loop(void)里面有C语言版的PI算法源代码。







在Microchip的网站上找Implementing a PID Controller Using a PIC18 MCU.zip应用笔记的源代码。

这是Microchip的汇编版PI算法源代码





在Microchip的网站上找Using Proportional Integral Derivative (PID) controllers in Closed-loop Control Systems.zip

源代码。

这是Microchip的C语言版PID算法源代码





你可对上述资料对比,看看他们是如何代码是实现的。相关的PDF文档请自行到Microchip网站上下载

-----此内容被Grant于2006-03-12,13:53:08编辑过


-----此内容被Grant于2006-03-12,14:06:41编辑过

出0入8汤圆

发表于 2006-3-12 14:00:51 | 显示全部楼层
freescale的PID算法,C语言的代码在PDF文档的附录里,PDF文档有详细的实现过程说明。

点击此处打开AN1215_PID Routines for MC68HC11K4 and MC68HC11N4 Microcontrollers.pdf

出0入0汤圆

 楼主| 发表于 2006-3-12 16:42:10 | 显示全部楼层
太感谢了!!眼泪都流出来了!

出0入0汤圆

发表于 2006-4-27 21:10:59 | 显示全部楼层
Grant 谢谢你~~~

不知道怎么才可以与你直接交流?

QQ?MSN?

出0入8汤圆

发表于 2006-4-27 23:08:53 | 显示全部楼层
最近怎么感觉好像多了好多做BLDC的,以前的很多老贴都被翻了出来,呵呵。



我基本上不会使用QQ或MSN,抱歉,因为我现在的工作差不多一周只有一天会在公司,算算老老实实的待上一天,其余时间都是在客户那和客户一起解决一些较为实际的技术问题。有时可能一周都不会在公司。你可以想象,就算你加了我,你也很难在上班时间在QQ或MSN上遇到我,实在不好意思。要是你有什么技术问题需要聊聊的,你可以给我邮件。我每天都会收邮件的,呵呵,我在外面出差,不可以上网的酒店是绝对不去住的。你也可以告诉我你的联系电话,需要的话我可以给你电话。

出0入0汤圆

发表于 2006-4-28 12:00:25 | 显示全部楼层
谢谢~~~这么忙实在让我很佩服;-)

那么目前倒也真得有点不忍心打扰你哈,下一步有个项目可能想选STR712,确定下来后再与你直接联系吧。

至于电机控制之类的问题就在这里问好了,在这方面我还是超级初级,而且对性能要求也不是很高。

出0入0汤圆

发表于 2006-4-28 19:14:18 | 显示全部楼层
无传感器无刷直流电机控制主要难在负荷的变化对换相的影响,即使在反电动势闭环控制阶段,过份重的负荷仍会使换相失步.

出0入0汤圆

发表于 2006-4-28 20:21:18 | 显示全部楼层
过份重的负荷仍会使换相失步

可以理解,进入一种临界的随机的赌转,反电势的检测就不够可靠了,

好在我需要用的场合负荷不大,不过是螺旋桨罢了

出0入0汤圆

发表于 2006-5-8 18:42:00 | 显示全部楼层
Grant

我实在找不到你的什么有效联系方式

我有个项目准备用STR712,特向你请教

电话:13111883450   028-86594824 焦志涛

出0入8汤圆

发表于 2006-5-8 22:11:08 | 显示全部楼层
你找我?抱歉,我明天会在公司开会,下午我给你电话吧。028?好像离我好遥远啊。

出0入0汤圆

发表于 2006-5-9 00:10:10 | 显示全部楼层
好的,028成都的~~~

主要想问STR712的开发过程,他的ISP好用不,能否实现CAN BOOT,还有他的价位和样片

前一段时间给你的MSN发过邮件但是没有音信。

在这里电机的贴子里说这个STR似乎有点文不对题了。

出0入0汤圆

发表于 2006-5-9 08:12:50 | 显示全部楼层
谢谢Grant、alisha二位先生,真的需要这些资料,太感谢了!!

出0入0汤圆

发表于 2009-8-20 16:20:11 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-8-20 17:02:09 | 显示全部楼层
M

出0入0汤圆

发表于 2009-9-10 09:37:21 | 显示全部楼层
谢谢~!

出0入0汤圆

发表于 2009-9-12 12:30:26 | 显示全部楼层
介绍一个国外的无需传感器还向的BLDC驱动芯片TMC603

(原文件名:1.gif)


(原文件名:2.gif)

点击此处下载 ourdev_480165.rar(文件大小:1.50M) (原文件名:TMC603-EVAL.rar)

出0入0汤圆

发表于 2009-9-14 19:45:52 | 显示全部楼层
这个不错

出0入0汤圆

发表于 2009-9-18 18:34:39 | 显示全部楼层
20楼的不需要hall的BLDC驱动芯片非常不错,传点资料上来

出0入0汤圆

发表于 2010-6-6 16:09:23 | 显示全部楼层
不错,谢谢

出0入0汤圆

发表于 2010-6-6 21:06:21 | 显示全部楼层
对这个确实挺感兴趣!

产品上的电机经常因为一个霍尔传感器坏了,导致整个电机都不能用了,一直在想该不该换个不用传感器的控制方案。

不过总觉着无传感器控制应该不如用传感器的可靠吧,不明白,

希望行家多谈谈实际应用中无传感器方案的缺点与优点,特别是缺点,呵呵

出0入0汤圆

发表于 2010-6-7 19:13:28 | 显示全部楼层
20楼的不需要hall的BLDC驱动芯片非常不错,传点资料上来
>>>>>>TMC603是一款无传感器BLDC驱动芯片
点击此处下载 ourdev_560249GVXN2M.pdf(文件大小:382K) (原文件名:TMC603-EVAL_schematics.pdf)
点击此处下载 ourdev_560250PQFOVV.pdf(文件大小:982K) (原文件名:tmc603A_datasheet.pdf)
点击此处下载 ourdev_560251NXZI0H.rar(文件大小:1.50M) (原文件名:TMC603-EVAL.rar)

出0入0汤圆

发表于 2010-10-30 22:02:53 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-10-31 17:42:29 | 显示全部楼层
记录一下。

出0入0汤圆

发表于 2010-12-26 15:50:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-28 18:33:11 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-1-16 15:23:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-1 15:07:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-21 12:57:24 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-7-6 16:42:50 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-7-6 17:09:47 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2011-11-25 15:23:49 | 显示全部楼层
学习,希望大家多多关照

出0入0汤圆

发表于 2011-11-27 23:18:37 | 显示全部楼层
无刷

出0入0汤圆

发表于 2011-12-19 22:48:12 | 显示全部楼层
记号下,最近正在学习这个。

出0入0汤圆

发表于 2012-1-16 17:36:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-17 19:54:14 | 显示全部楼层
学习了,谢谢

出0入0汤圆

发表于 2012-4-28 14:33:38 | 显示全部楼层
哇  好东东 标记

出0入0汤圆

发表于 2012-7-16 22:24:41 | 显示全部楼层
标记了,很不错的学习资料

出0入0汤圆

发表于 2012-7-17 09:42:49 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2012-7-22 11:25:18 | 显示全部楼层
无传感器这是什么概念??

出0入0汤圆

发表于 2012-7-30 21:23:34 | 显示全部楼层
  留下脚印

出0入0汤圆

发表于 2012-7-30 22:35:14 来自手机 | 显示全部楼层
标记。回头看看哦。

出0入0汤圆

发表于 2012-7-31 13:29:36 | 显示全部楼层
正在学习

出100入0汤圆

发表于 2012-8-11 22:59:11 | 显示全部楼层
mark it,慢慢看

出0入0汤圆

发表于 2012-8-31 20:28:41 | 显示全部楼层
学习了,mark!

出0入0汤圆

发表于 2012-9-5 09:59:00 | 显示全部楼层
mark,学习了

出0入0汤圆

发表于 2012-10-11 09:29:23 | 显示全部楼层
atmel ATtiny861方案我测试过最大转速估计在15000转左右但是再往高就达不到了,有没有人知道如何调节,我用的是他们开发板的方案

出0入0汤圆

发表于 2012-10-11 10:05:41 | 显示全部楼层
一直想学!!!!!!

出0入0汤圆

发表于 2012-10-11 11:33:17 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2012-10-12 21:40:59 | 显示全部楼层
dcqq88 发表于 2012-7-22 11:25
无传感器这是什么概念??

不使用霍尔传感器等 检测转子位置来实现换相     比如反电动势法 BEMF

出0入0汤圆

发表于 2012-10-13 08:23:07 | 显示全部楼层
记录     

出0入0汤圆

发表于 2012-10-13 15:08:33 | 显示全部楼层
一直控制电机,收藏

出0入0汤圆

发表于 2012-10-13 16:33:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-10-17 17:13:51 | 显示全部楼层
四轴飞行没刷没感

出0入0汤圆

发表于 2012-11-2 15:45:45 | 显示全部楼层
这个方案我修改了一下目前跑到35000转没有问题

出0入0汤圆

发表于 2012-11-6 13:25:32 | 显示全部楼层
标记......

出0入0汤圆

发表于 2012-11-6 13:56:46 | 显示全部楼层
mark~~~~~~~~~~~~~

出0入0汤圆

发表于 2012-11-6 17:07:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-11-6 20:30:26 | 显示全部楼层
不错,学习学习

出0入0汤圆

发表于 2013-4-4 16:00:11 | 显示全部楼层
mark一下 谢谢

出0入0汤圆

发表于 2013-5-2 22:36:55 | 显示全部楼层
Grant 发表于 2006-4-27 23:08
最近怎么感觉好像多了好多做BLDC的,以前的很多老贴都被翻了出来,呵呵。



我基本上不会使用QQ或MSN,抱歉 ...

你好 用STM32做 可以指点下吗?

出0入0汤圆

发表于 2013-5-2 22:45:57 来自手机 | 显示全部楼层
mARK:-):-)

出0入0汤圆

发表于 2013-5-29 15:52:24 | 显示全部楼层
mark                          

出0入0汤圆

发表于 2016-9-14 22:06:03 | 显示全部楼层
感谢楼主奉献,下载下来看看

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-26 16:16

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

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