三相BLDC无刷直流电机的无传感器控制
三相BLDC无刷直流电机的无传感器控制我想买阿莫的调试板做上面的试验,MCU用ATMEL的,看了几天PIC关于这个问题的实现方法,楞没看懂,也不敢买调试板了。有大哥指点下吗?先谢了。
BEMF过零点检测实现方法,电压开环PWM控制电机速度,启动制动平稳,母线电压48V。就这么简单。
附件是DSPIC对于直流无刷BLDC无传感器电机控制的应用笔记(中文)和源代码:
点击此处打开armok01104153.pdf
点击此处下载armok01104154.zip
-----此内容被alisha于2006-02-26,11:35:05编辑过 BEMF是经典的设计,一般控制有电压环,也有电流环,多半是使用开环来预转,先算出转子位置,然后使用闭环PI来做速度调节,有些会有PID来控制。要做BLDC最好PWM是六路的,有死区控制的,带上下桥臂输出。
我现在有几个这样的客户我在搞技术支持,不过使用的是ST7MC,也有用dsPIC4011,不过我ST7MC用的多写。主要是用于BLDC的变频控制。我有Microchip的dsPIC做的变频空调应用笔记,可惜,我暂时不能放出来。
阿莫的调试板用ATMEL的MCU看你用的是那个型号了,我记得AVR有个专门用来做电机控制的MCU可以,可惜要自己写PI,比较累。ST的你可以在他的网站上下载全部的代码。还有dsp也可以做,你可到Freescale上找到BLDC的变频控制笔记和代码。 可还是看不懂,没有个清晰的概念,觉得无从下手! Grant
PI很难么?应该就是一个乘加算法吧? 这是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; // 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) 2005STMicroelectronics ****************** END OF FILE ***/ 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编辑过 freescale的PID算法,C语言的代码在PDF文档的附录里,PDF文档有详细的实现过程说明。
点击此处打开AN1215_PID Routines for MC68HC11K4 and MC68HC11N4 Microcontrollers.pdf 太感谢了!!眼泪都流出来了! Grant 谢谢你~~~
不知道怎么才可以与你直接交流?
QQ?MSN? 最近怎么感觉好像多了好多做BLDC的,以前的很多老贴都被翻了出来,呵呵。
我基本上不会使用QQ或MSN,抱歉,因为我现在的工作差不多一周只有一天会在公司,算算老老实实的待上一天,其余时间都是在客户那和客户一起解决一些较为实际的技术问题。有时可能一周都不会在公司。你可以想象,就算你加了我,你也很难在上班时间在QQ或MSN上遇到我,实在不好意思。要是你有什么技术问题需要聊聊的,你可以给我邮件。我每天都会收邮件的,呵呵,我在外面出差,不可以上网的酒店是绝对不去住的。你也可以告诉我你的联系电话,需要的话我可以给你电话。 谢谢~~~这么忙实在让我很佩服;-)
那么目前倒也真得有点不忍心打扰你哈,下一步有个项目可能想选STR712,确定下来后再与你直接联系吧。
至于电机控制之类的问题就在这里问好了,在这方面我还是超级初级,而且对性能要求也不是很高。 无传感器无刷直流电机控制主要难在负荷的变化对换相的影响,即使在反电动势闭环控制阶段,过份重的负荷仍会使换相失步. 过份重的负荷仍会使换相失步
可以理解,进入一种临界的随机的赌转,反电势的检测就不够可靠了,
好在我需要用的场合负荷不大,不过是螺旋桨罢了 Grant
我实在找不到你的什么有效联系方式
我有个项目准备用STR712,特向你请教
电话:13111883450 028-86594824 焦志涛 你找我?抱歉,我明天会在公司开会,下午我给你电话吧。028?好像离我好遥远啊。 好的,028成都的~~~
主要想问STR712的开发过程,他的ISP好用不,能否实现CAN BOOT,还有他的价位和样片
前一段时间给你的MSN发过邮件但是没有音信。
在这里电机的贴子里说这个STR似乎有点文不对题了。 谢谢Grant、alisha二位先生,真的需要这些资料,太感谢了!! 记号 M 谢谢~! 介绍一个国外的无需传感器还向的BLDC驱动芯片TMC603
http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_480163.gif
(原文件名:1.gif)
http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_480164.gif
(原文件名:2.gif)
点击此处下载 ourdev_480165.rar(文件大小:1.50M) (原文件名:TMC603-EVAL.rar) 这个不错 20楼的不需要hall的BLDC驱动芯片非常不错,传点资料上来 不错,谢谢 对这个确实挺感兴趣!
产品上的电机经常因为一个霍尔传感器坏了,导致整个电机都不能用了,一直在想该不该换个不用传感器的控制方案。
不过总觉着无传感器控制应该不如用传感器的可靠吧,不明白,
希望行家多谈谈实际应用中无传感器方案的缺点与优点,特别是缺点,呵呵 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) MARK 记录一下。 mark MARK mark mark MARK MARK 学习学习 学习,希望大家多多关照 无刷 记号下,最近正在学习这个。 mark 学习了,谢谢 哇好东东 标记 标记了,很不错的学习资料 mark一下 无传感器这是什么概念?? {:tongue:}留下脚印 标记。回头看看哦。 正在学习 mark it,慢慢看{:smile:} 学习了,mark! mark,学习了 atmel ATtiny861方案我测试过最大转速估计在15000转左右但是再往高就达不到了,有没有人知道如何调节,我用的是他们开发板的方案 一直想学!!!!!! 学习学习 dcqq88 发表于 2012-7-22 11:25 static/image/common/back.gif
无传感器这是什么概念??
不使用霍尔传感器等 检测转子位置来实现换相 比如反电动势法 BEMF
记录 一直控制电机,收藏 mark{:smile:} 四轴飞行没刷没感 这个方案我修改了一下目前跑到35000转没有问题 标记...... mark~~~~~~~~~~~~~ mark{:smile:} 不错,学习学习 mark一下 谢谢 Grant 发表于 2006-4-27 23:08 static/image/common/back.gif
最近怎么感觉好像多了好多做BLDC的,以前的很多老贴都被翻了出来,呵呵。
我基本上不会使用QQ或MSN,抱歉 ...
你好 用STM32做 可以指点下吗? mARK:-):-)
mark 感谢楼主奉献,下载下来看看 感谢楼主奉献,
页:
[1]