dsPIC30F2010 控制带传感器的BLDCM 无刷直流电机

更新时间:2023-06-11 09:29:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

dsPIC30F2010 microchip 无刷直流电机

AN957

使用dsPIC30F2010控制带传感器的BLDC电机

著者:

Stan D' Souza

Microchip Technology

引言

dsPIC30F2010是一款专门为嵌入式电机控制应用设计的28引脚16位MCU。它主要是为交流感应电机(ACInduction Motor,ACIM)、无刷直流电机(BrushlessDC,BLDC)和普通直流电机这些典型的电机类型而专门设计的。以下是 dsPIC30F2010的一些主要特性: 6个独立或3对互补的电机控制专用PWM输出。 6输入、采样速率为500Ksps的ADC,可同时采样最多4路输入。

多种串行通信:UART、I2C 和SPI

小型封装:6×6 mm QFN,适用于嵌入式控制应用

DSP引擎可实现控制环的快速响应。

在本应用笔记中,我们将讨论如何使用dsPIC30F2010来控制带传感器的BLDC电机。欲知BLDC的详细工作原理以及BLDC电机运行和控制的一般信息,请参阅AN901_CN。本应用笔记讨论了使用dsPIC30F2010控制BLDC电机的具体实现,而对BLDC电机的细节涉及较少。

通过检测霍尔传感器,可以得到一个3位编码,编码值的范围从1到6。每个编码值代表转子当前所处的区间。从而提供了需要对哪些绕组通电的信息。因此程序可以使用简单的查表操作来确定要对哪两对特定的绕组通电以使转子转动。

注意状态“0”和“7”对于霍尔效应传感器而言是无效状态。软件应该检查出这些值并相应地禁止PWM。

BLDC电机

BLDC电机基本是内外倒置的直流电机。在一般直流电机中,定子是永磁体。转子上有绕组,对绕组通电。通过使用换向器和电刷将转子中的电流反向来产生旋转的或运动的电场。与之相反,在BLDC电机中绕组在定子上而转子是永磁体。“内外倒置的直流电机”这一称谓由此得名。

要使转子转动,必须存在旋转电场。一般来说,三相BLDC电机具有3相定子,同一时刻为其中的两相通电,以产生旋转电场。此方法相当容易实现,但是为了防止永磁体转子被定子锁住,在知道转子磁体的精确位置的前提下,必须以特定的方式按顺序为定子通电。位置信息通常用霍尔传感器检测转子磁体位置获得,也可采用轴角编码器方式获得。对于典型的三相带传感器的BLDC电机,有6个不同的工作区间,每个区间中有特定的两相绕组通电。如图1所示。

变化通知输入

灵活使用上述的技巧,可以将霍尔效应传感器连接到dsPIC30F2010的输入引脚上,来检测变化(变化通知(Change Notification,CN)输入)。当这些引脚上的输入电平发生变化时,就会产生中断。在CN中断服务程序(Interrupt Service Routine,ISR)中,由用户应用程序读取霍尔效应传感器的值,用以计算偏移量并查表,来正确地驱动BLDC电机的绕组。

© 2005 Microchip Technology Inc.DS00957A_CN第1页

dsPIC30F2010 microchip 无刷直流电机

AN957

电机控制脉宽调制(MCPWM)

使用上面的方法可以使BLDC电机全速旋转。然而,为了使BLDC电机速度可变,必须在两相绕组的两端加上可变电压。从数字化的语言来讲,就是加在BLDC电机绕组上的PWM信号的不同占空比可以获得可变电压。有六个由PWM信号驱动的PWM输出。如图2所示,通过使用六个开关、IGBT或MOSFET,可以将三相绕组驱动为高电平、低电平或根本不通电。驱动器上施加占空比可变的PWM信号。这与将PWM信号加在高端驱动器上,而将低端驱动器连接到VSS或GND的作用相同。一般更喜欢对低端驱动器施加PWM信号。

PWM信号由dsPIC30F2010的电机控制(Motor,MC)专用PWM模块提供。MCPWM模块是(阅读本节时,请参阅图3。) MCPWM有一个专用的16位PTMR时基寄存器。此定TCY。通过选择一个值并将它装入PTPERPWM周期。每个TCY,PTMR与PTPER作一次比较。当两者匹配时,开始一个新的周期。

控制占空比的方法与此类似,只需在三个占空比寄存器中装入一个值即可。与周期比较不同,每隔TCY/2就将占空比寄存器中的值与PTMR进行一次比较(即,比较的频率是周期比较的两倍)。如果PTMR的值与PDCx的值相匹配,那么对应的占空比输出引脚就会根据选定的PWM模式驱动为低电平或高电平。通过占空比比较产生的三个输出将被分别传输给一对互补的输出引脚,其中一个引脚输出为高电平,而另一个引脚输出为低电平,反之亦然。这两个输出引脚也可以被配置为独立输出模式。当驱动为互补输出时,可以在高电平变低与低电平变高之间插入一段死区。死区是由硬件配置的,最小值为TCY。插入死区可以防止输出驱动器发生意外的直通现象。

图2:电机驱动电路与绕组连接示意图

+V1H

2H

3H

三相 负载

1L2L3L

DS00957A_CN第2页© 2005 Microchip Technology Inc.

dsPIC30F2010 microchip 无刷直流电机

AN957

© 2005 Microchip Technology Inc.DS00957A_CN第3页

dsPIC30F2010 microchip 无刷直流电机

AN957

MCPWM模块配置为多种模式。其中边沿对齐的输4描述了边沿对齐的PWM的工作原理。在周期开始时,所有输出均驱动为高电平。随着PTMRPTMR寄存器的值与PTPER寄存器的值匹配导致一个新的周期开始,所有输出变为高电平以开始一个全新的周期。

根据OVDCON寄存器中的值,用户可以选择哪个引脚获得PWM信号以及哪个引脚被驱动为有效或无效。控制带传感器的BLDC时,必须根据由霍尔传感器的值所指定的转子位置对两相绕组通电。在CN中断服务程序中,首先读霍尔传感器,然后将霍尔传感器的值用作查找表中的偏移量,以找到对应的将要装入OVDCON寄存器的值。表1和图5说明了如何根据转子所处的区间将不同的值装入OVDCON寄存器,从而确定需要对哪些绕组通电。

图4: 边沿对齐的PWM

表1:

PWM输出改写示例

OVDCON<15:8>00110000b00111100b00001111b

OVDCON<7:0>00000000b00000000b00000000b

状态234

从PDCx中重载新占空比

PTPERPDC1PDC2

PTMR0

图5:PWM输出改写示例

状态

PWM1HPWM2H

占空比

1

周期

PWM3H

PWM3L

还可以将MCPWM设置为其它模式:中心对齐的PWM和单个PWM。由于它们不用于控制BLDC电机,在此将不对这些模式进行讨论。欲知有关这些模式的详细信息,请参阅《dsPIC30F系列参考手册》(DS70046C_CN)。改写是本应用中使用的MCPWM的一个重要特征。改写控制是MCPWM模块的最后级。它允许用户直接写入OVDCON寄存器并控制输出引脚。OVDCON寄存器中6位字段。这两个字段中的每一位对应于一个输出引脚。OVDCON寄存器的高字节部分确定对应的输出引脚是由PWM信号驱动(当置为1时),还是OVDCON寄存器低字节部分中的相应位驱动为有效/无效(当置为0时)。此功能允许用户使用PWM信号,但是并不驱动所有输出引脚。对于BLDC电机,相同的值被写入所有PDCx寄存器。

PWM2H

PWM2L

PWM1H

PWM1L注:

在状态1- 4之间切换的时间由用户软件控制。通过向OVDCON写入新值控制状态切换。本例中PWM输出工作在独立模式。

DS00957A_CN第4页© 2005 Microchip Technology Inc.

dsPIC30F2010 microchip 无刷直流电机

AN957

硬件描述

图6中的框图说明了如何使用dsPIC30F2010驱动BLDC电机。如需详细的原理图,请参阅附录C。

固件描述

附录A和附录B包含了两个固件程序来举例说明此应用笔记中描述的方法。一个程序使用开环速度控制。另一个使用比例和积分反馈来实现闭环速度控制。对于实际应用而言,开环方式通常是不实用的。此处介绍它主要是为了阐明BLDC电机的驱动方法。

开环控制

在开环控制中,MCPWM根据来自速度电位计的电压输入直接控制电机速度。初始化、ADC端口和变化通知输入之后,程序将等待一个激活信号(例如,按一个键)来表示开始(参见图7)。按下键后,程序并将它写入OVDCON。此时电机开始旋转。

图7:开环流程图

开始

6个MCPWM输出连接到3对MOSFET驱动器(IR2101S),最终连接到6个MOSFET(IRFR2407)。这些MOSFET以三相桥式连接到3相在当前实现中,MOSFET70V,最大电流为18A。

注意在使用最大功率时必须提供充分的散热,这一点很重要。MOSFET驱动器也需要一个较高的电压(15V)24V电机,因此DC+到DC-母线电压为24V。需要提供5V。3个霍尔效应传感器的输出信号连接到与变化通知电路相连的输入引脚,使能输入的同时也使能相应中断。若这3个引脚中的任何一个发生了电平变化,就会产生中断。为了提供速度给定,将一个电位计连接到ADC输入(RB2)。在RC14上提供了一个按钮开关,用于起动和停止电机。为了向电机提供一些电流反馈,在DC母线负电压与地或Vss之间连接了一个低阻值电阻(25毫欧)。由此电阻产生的电压被一个外部运放(MCP6002)放大并反馈到ADC输入(RB1)。

初始化MCPWM、ADC和

端口

按过键吗?

读霍尔效应传感器;用表中查到的状态装载OVDCON

读过给定电位计吗?

是用给定值 装载PDCx

按过键吗?

使用OVDCON停止

MCPWM

© 2005 Microchip Technology Inc.DS00957A_CN第5页

dsPIC30F2010 microchip 无刷直流电机

AN957

闭环控制

50%。但是,在主程序的第一个循环,将读电位计并将其值

电机转得越快。图8所示电机速度由电位计控制。

在闭环控制固件版本中,主要的不同是使用电位计来设定速度给定。控制环提供了对速度的比例和积分(Proportional and Integral,PI度,可以使用TMR3作为定时器来选通一个完整的电周期。由于我们使用的是10极电机,因此一个机械周期将由5个电周期构成。如果T(秒)是一个电周期的时间,那么速度S = 60/(P/2*T)rpm,其中P是电机的极数。控制如图10所示。闭环控制流程图如图11所示。

图10:

给定

闭环电压控制模式

电机

dsPIC®MCPWM

霍尔效应传感器连接到变化通知引脚。允许CN

中断。当转子旋转时,转子磁体的位置发生变化,从而使转子进入不同的区间。中断表示转子进入每个新位置。在CN中断程序(如图9所示)中,读霍尔效应传感器的值,并根据该值得到一个表查找值,并将它写入OVDCON寄存器。此操作将确保在正确的区间对正确的绕组通电,从而使电机继续旋转。

速度PI控制器

-电机速度计算结果

相位超前

欲知有关相位超前以及实现方式的详细信息,请参阅AN901_CN。

DS00957A_CN第6页© 2005 Microchip Technology Inc.

dsPIC30F2010 microchip 无刷直流电机

AN957

结论

dsPIC30F2010非常适合对带传感器的BLDC电机进行闭环控制。外设和DSP引擎为带传感器的BLDC应用提供了足够宽的带宽,并为客户的应用程序提供了充足的代码空间。

参考书目

AN885—Brushless DC(BLDC)Motor Fundamentals

AN901_CN—dsPIC30F在无传感器BLDC控制中的应用

AN857— Brushless DC Motor Control Made Easy AN899 — Brushless DC Motor Control Using PIC18FXX31 MCUs

© 2005 Microchip Technology Inc.DS00957A_CN第7页

dsPIC30F2010 microchip 无刷直流电机

AN957

附录A:

开环控制的源代码清单

软件许可协议

Microchip Technology Incorporated(“公司”)随附提供的软件旨在提供给您(该公司的客户)使用,仅限于且只能在该公司制造的产品上使用。

该软件为公司和/或其供应商所有,并受适用的版权法保护。版权所有。任何违反前述限制的使用将使其用户遭受适用法律的刑事制裁,并承担违背此许可的条款和条件的民事责任。

该软件“按现状”提供。不提供保证,无论是明示的、暗示的还是法定的保证。这些保证包括(但不限于)对出于某一特定目的应用此软件的适销性和适用性默示的保证。在任何情况下,公司都将不会对任何原因造成的特别的、偶然的或间接的损害负责。

此附录包含了开环控制的源代码清单。

//---------------------------------------------------------------------------------// Software License Agreement//

// The software supplied herewith by Microchip Technology Incorporated

// (the “Company”) is intended and supplied to you, the Company’s customer, // for use solely and exclusively with products manufacture by the Company.

// The software is owned by the Company and/or its supplier, and is protected under // applicable copyright laws. All rights are reserved. Any use in violation of the // foregoing restrictions may subject the user to criminal sanctions under applicable // laws, as well as to civil liability for the breach of the terms and conditions of // this license.//

// THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, WHETHER EXPRESS, // IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.

// THE COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR // CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.

//---------------------------------------------------------------------------------//文件:ClosedLoopSenBLDC.c//

//编写者:Stan D'Souza,Microchip Technology//

// 下列文件应该包含在MPLAB项目中:////ClosedLoopSenBLDC.c——主源代码文件//p30f2010.gld——链接描述文件////

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

// 版本历史//

// 10/01/04——第一版

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

以下是低端驱动器表。在此StateLoTable中,

在低端驱动器施加PWM信号,而高端驱动器为“导通”或“截止”状态。 在本练习中使用此表。

/*************************************************************/unsigned int StateLoTable[] = {0x0000, 0x0210, 0x2004, 0x0204,

0x0801, 0x0810, 0x2001, 0x0000};

、CN6和当霍尔传感器改变状态时,将引起中断,指令执行将转到下面的子程序。然后用户必须读端口B的第3位、第4位和第5位,1、2……6。

然后将调整后的值用作查找表StateLoTable中的偏移量以确定装入OVDCON寄存器的值。

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

dsPIC30F2010 microchip 无刷直流电机

AN957

void _ISR _CNInterrupt(void){

IF = 0;// 清零标志HallValue = PORTB & 0x0038;// 屏蔽其它位,保留RB3、RB4和RB5HallValue = HallValue >> 3;

// 执行3OVDCON = StateLoTable[HallValue];}

/*********************************************************************ADC中断用给定的电位计值装载PDCx寄存器。仅在电机运行时执行此操作。

*********************************************************************/void _ISR _ADCInterrupt(void){

IFS0bits.ADIF = 0;if (Flags.RunMotor){

PDC1 = ADCBUF0;PDC2 = PDC1;PDC3 = PDC1;}}

// 赋值……

// 并装载所有的三个PWM……// 占空比寄存器

int main(void){

LATE = 0x0000;TRISE = 0xFFC0;// 设置为输出PWM信号CNEN1 = 0x00E0;// 使能CN5、CN6和CN7CNPU1 = 0x00E0;// 使能内部上拉IF = 0;// 清零IE = 1;// 允许CN中断InitMCPWM();InitADC10();while(1){while (!S2);// 等待按开始键

while (S2)// 等待直到释放按键

DelayNmSec(10);

// 在PORTB上读霍尔位置传感器 HallValue = PORTB & 0x0038;// 屏蔽其它位,保留RB3、RB4和RB5HallValue = HallValue >> 3;// 右移以获得值1、2……6OVDCON = StateLoTable[HallValue];// 装载改写控制寄存器PWMCON1 = 0x0777;// 使能PWM输出Flags.RunMotor = 1;// 将标志置1while (Flags.RunMotor)// 当电机运行时

if (S2)// 如果按下S2{

PWMCON1 = 0x0700;// 禁止PWM输出

OVDCON = 0x0000;// 将PWM改写为低电平

Flags.RunMotor = 0;// 复位运行标志while (S2)// 等待释放按键

DelayNmSec(10);

}

}// while (1)结束}

© 2005 Microchip Technology Inc.DS00957A_CN第9页

dsPIC30F2010 microchip 无刷直流电机

AN957

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

以下代码用于设置ADC寄存器,该代码可实现下列功能:1. 1个通道转换(本例中,该通道为RB2/AN2)2. PWM触发信号启动转换3. 电位计连接到CH0和RB24. 手动停止采样和启动转换5. 手动检查转换完成 *********************************************************************/void InitADC10(void){

ADPCFG = 0xFFF8; ADCON1 = 0x0064; ADCON2 = 0x0200; ADCHS = 0x0002; ADCON3 = 0x0080; IFS0bits.ADIF = 0; IEC0bits.ADIE = 1; ADCON1bits.ADON = 1;}

// 将端口B的RB0到RB2配置为模拟引脚;将其它引脚配置为数字引脚// PWM启动转换

// 同时采样4个通道

// 将RB2/AN2作为CH0连接到电位计……

// ch1连接母线电压、Ch2连接电机,Ch3连接电位计// Tad来源于内部RC(4uS)

// 启动ADC

/********************************************************************InitMCPWM,对PWM做以下初始化:1. FPWM = 16000 hz2. 独立的PWM

3. 使用OVDCON控制输出

4.用从电位计读取的ADC值设置占空比5. 将ADC设置为由PWM特殊触发信号触发

*********************************************************************/void InitMCPWM(void){

PTPER = FCY/FPWM - 1;

PWMCON1 = 0x0700;OVDCON = 0x0000;PDC1 = 100;PDC2 = 100;PDC3 = 100;

SEVTCMP = PTPER;PWMCON2 = 0x0F00;PTCON = 0x8000; }

//---------------------------------------------------------------------// 这是普通的1 ms延迟程序,用于提供1 mS到65.5 秒的延迟。

// 如果N = 1,则延迟为1 mS;如果N = 65535,则延迟为65,535 mS。 // 注意FCY用于计算。

// 请根据上述定义语句做出必要的更改(PLLx4或PLLx8等)// 以计算出正确的FCY。

void DelayNmSec(unsigned int N){

unsigned int j;while(N--)

for(j=0;j < MILLISEC;j++);}

// 禁止PWM

// 允许使用OVD控制

// 将PWM1、PWM2和PWM3初始化为100

// 后分频比设为1:16// 启动PWM

DS00957A_CN第10页© 2005 Microchip Technology Inc.

dsPIC30F2010 microchip 无刷直流电机

AN957

附录B:

闭环控制的源代码清单

此附录包含了闭环控制的源代码清单。

/---------------------------------------------------------------------------------// Software License Agreement//

// The software supplied herewith by Microchip Technology Incorporated

// (the “Company”) is intended and supplied to you, the Company’s customer, // for use solely and exclusively with products manufacture by the Company.

// The software is owned by the Company and/or its supplier, and is protected under // applicable copyright laws. All rights are reserved. Any use in violation of the // foregoing restrictions may subject the user to criminal sanctions under applicable // laws, as well as to civil liability for the breach of the terms and conditions of // this icense.//

// THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, WHETHER EXPRESS, // IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.

// THE COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR // CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.

//---------------------------------------------------------------------------------//文件:ClosedLoopSenBLDC.c//

//编写者:Stan D'Souza,Microchip Technology//

// 下列文件应该包含在MPLAB项目中:////ClosedLoopSenBLDC.c——主源代码文件//p30f2010.gld——链接描述文件//

//---------------------------------------------------------------------// 版本历史//

// 10/01/04——第一版

//---------------------------------------------------------------------//***************************************************************************ClosedLoopSenBLDC.c用于对带传感器的BLDC电机进行闭环控制。它的任务包括:

CN5、CN6和CN7引脚(端口B)在CN中断期间,通过读端口B读取来自传感器的输入信号 分析并确定位置的状态1、2……6。

使用查找表StateLoTable,该表用于确定

OVDCON的值。将在表中找到的值装入OVDCON。

将PWMPWM(即要求的)电机速度。然后使用要求的速度值和 实际的速度值来确定比例速度误差和

积分速度误差。有了这两个值,就可以使用下面的公式计算出新的占空比:

NewDutyCycle(新的占空比)= Kp*(比例速度误差) + Ki*(积分速度误差)

然后将10位的NewDutyCycle3个PWM FPWM = 16000hz

设置ADC,使通过PWM触发信号来启动转换。

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

© 2005 Microchip Technology Inc.DS00957A_CN第11页

dsPIC30F2010 microchip 无刷直流电机

AN957

#define __dsPIC30F2010__

#include "c:\pic30_tools\support\h\p30F2010.h"

#define FCY 10000000// xtal = 5.0Mhz;PLLx8#define MILLISEC FCY/10000// 1 mS延迟常数#define FPWM 16000#define Ksp1200#define Ksi10

#define RPMConstant60*(FCY/256)#define S2!PORTCbits.RC14

void InitTMR3(void);void InitADC10(void);void AverageADC(void);

void DelayNmSec(unsigned int N);void InitMCPWM(void);void CalculateDC(void);void GetSpeed(void);unsigned RunMotor : 1;unsigned Minus : 1;unsigned unused : 14;Flags;

}

unsigned int HallValue;int Speed;

unsigned int Timer3;unsigned char Count;

unsigned char SpeedCount;int DesiredSpeed;int ActualSpeed;int SpeedError;int DutyCycle;

int SpeedIntegral;

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

以下是低端驱动器表。在此StateLoTable中,

PWM信号,而高端驱动器为“导通”或“截止”状态。 在本练习中使用此表。

*************************************************************/unsigned int StateLoTable[] = {0x0000, 0x1002, 0x0420, 0x0402,

0x0108, 0x1008, 0x0120, 0x0000};

/****************************************************************以下是变化通知引脚CN5、CN6和CN7的中断向量。

当霍尔传感器改变状态时,将引起中断,指令执行将转到下面的子程序。然后用户必须读端口B的第3位、第4位和第5位,对读到的值进行移位和调节以使之读作1、2……6。

然后将调整后的值用作查找表StateLoTable中的偏移量以确定装入OVDCON寄存器的值。

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

DS00957A_CN第12页© 2005 Microchip Technology Inc.

dsPIC30F2010 microchip 无刷直流电机

AN957

void _ISR _CNInterrupt(void){

IF = 0;// 清零标志HallValue = PORTB & 0x0038;// 屏蔽其它位,保留RB3、RB4和RB5HallValue = HallValue >> 3;// 执行3次右移

OVDCON = StateLoTable[HallValue];// 装载改写控制寄存器}

/*********************************************************************ADC中断用给定的电位计值装载DesiredSpeed变量。然后用该值来确定速度误差。当电机不运行时,使用来自电位计的直接给定值作为PDC值。

*********************************************************************/void _ISR _ADCInterrupt(void){

IFS0bits.ADIF = 0;

DesiredSpeed = ADCBUF0;if (!Flags.RunMotor)

{

PDC1 = ADCBUF0;// 赋值……PDC2 = PDC1;// 并装载所有的三个PWM……PDC3 = PDC1;// 占空比寄存器}

}

/************************************************************************该主程序控制初始化,按键以起动和停止电机。

************************************************************************/int main(void){

LATE = 0x0000;// 设置为输出PWM信号CNEN1 = 0x00E0;// 使能CN5、CN6和CN7// 使能内部上拉IF = 0;// 清零IE = 1;// 允许CN中断SpeedError = 0;SpeedIntegral = 0;InitTMR3();InitMCPWM();InitADC10();while(1){

while (!S2);// 等待按开始键while (S2)// 等待直到释放按键

DelayNmSec(10);

// 通过端口B读来自霍尔位置传感器的信号HallValue = PORTB & 0x0038;// 屏蔽其它位,保留RB3、RB4和RB5HallValue = HallValue >> 3;// 右移以获得值1、2……6OVDCON = StateLoTable[HallValue];// 装载改写控制寄存器PWMCON1 = 0x0777;// 使能PWM输出Flags.RunMotor = 1;// 将标志置1T3CON = 0x8030;// 启动TMR3while (Flags.RunMotor)// 当电机运行时

if (!S2)// 如果未按下S2

© 2005 Microchip Technology Inc.DS00957A_CN第13页

dsPIC30F2010 microchip 无刷直流电机

AN957

{

if (HallValue == 1) {

HallValue = 0xFF; if (++Count == 5)

//如果位于区间1

// 强制一个新值作为区间值

// 对于10极电机,将此代码段执行5个电周期(即1个// 机械周期)

{

Timer3 = TMR3;// 读tmr3的最新值TMR3 = 0;Count = 0;

GetSpeed();// 确定速度}}

}else// 如果按下S2,停止电机{

PWMCON1 = 0x0700;// 禁止PWM输出

OVDCON = 0x0000;// 将PWM改写为低电平。Flags.RunMotor = 0;// 复位运行标志while (S2)// 等待释放按键

DelayNmSec(10);

}

// while (1)结束

}}

/*******************************************************************以下代码用于设置ADC寄存器,该代码可实现下列功能:

1. 1个通道转换(本例中,该通道为RB2/AN2)2. PWM触发信号启动转换3. 电位计连接到CH0和RB24. 手动停止采样和启动转换5. 手动检查转换完成

*********************************************************************/void InitADC10(void){

ADPCFG = 0xFFF8; ADCON1 = 0x0064; ADCON2 = 0x0200; ADCHS = 0x0002; ADCON3 = 0x0080; IFS0bits.ADIF = 0; IEC0bits.ADIE = 1; ADCON1bits.ADON = 1;}

// 将端口B的RB0到RB2配置为模拟引脚;将其它引脚配置为数字引脚// PWM启动转换// 采样CH0通道

// 将RB2/AN2作为CH0连接到电位计。// Tad来源于内部RC(4uS)// 清零标志// 允许中断// 启动ADC

DS00957A_CN第14页© 2005 Microchip Technology Inc.

dsPIC30F2010 microchip 无刷直流电机

AN957

/********************************************************************InitMCPWM,对PWM做以下初始化:1. FPWM = 16000 hz2. 独立的PWM

3. 使用OVDCON控制输出

4. 使用PI算法和速度误差设置占空比5. 将ADC设置为由PWM特殊触发信号触发

*********************************************************************/void InitMCPWM(void){

PTPER = FCY/FPWM - 1;

PWMCON1 = 0x0700;OVDCON = 0x0000;PDC1 = 100;PDC2 = 100;PDC3 = 100;

SEVTCMP = PTPER;PWMCON2 = 0x0F00;PTCON = 0x8000; }

/************************************************************************Tmr3用于确定速度,因此它被设置为使用Tcy/256作为时钟周期进行计数。

*************************************************************************/void InitTMR3(void){

T3CON = 0x0030;TMR3 = 0;

PR3 = 0x8000;}

// 禁止PWM

// 允许使用OVD控制

// 将PWM1、PWM2和PWM3初始化为100

// 特殊触发值等于16个周期值// 后分频比设为1:16// 启动PWM

// 内部Tcy/256时钟

/************************************************************************GetSpeed,通过使用每个机械周期内TMR3中的值确定 电机的精确速度。

*************************************************************************/void GetSpeed(void){

if (Timer3 > 23000)// 如果TMR3值很大,则忽略此次读取

return;

if (Timer3 > 0)

Speed = RPMConstant/(long)Timer3;// 获得以RPM为单位的速度ActualSpeed += Speed;

ActualSpeed = ActualSpeed >> 1;if (++SpeedCount == 1)

{SpeedCount = 0;CalculateDC();}

}

© 2005 Microchip Technology Inc.DS00957A_CN第15页

dsPIC30F2010 microchip 无刷直流电机

AN957

/*****************************************************************************CalculateDC,使用PI算法来计算新的DutyCycle(占空比)值,该值将被载入PDCx寄存器。

****************************************************************************/void CalculateDC(void){

DesiredSpeed = DesiredSpeed*3;Flags.Minus = 0;

if (ActualSpeed > DesiredSpeed)

SpeedError = ActualSpeed - DesiredSpeed;else

{

SpeedError = DesiredSpeed - ActualSpeed;Flags.Minus = 1;}

SpeedIntegral += SpeedError;if (SpeedIntegral > 9000)

SpeedIntegral = 0;

DutyCycle = (((long)Ksp*(long)SpeedError + (long)Ksi*(long)SpeedIntegral) >> 12);DesiredSpeed = DesiredSpeed/3;if (Flags.Minus)

DutyCycle = DesiredSpeed + DutyCycle;

else DutyCycle = DesiredSpeed - DutyCycle;if (DutyCycle < 100)

DutyCycle = 100;if (DutyCycle > 1250)

{DutyCycle = 1250;SpeedIntegral = 0;} PDC1 = DutyCycle;PDC2 = PDC1;PDC3 = PDC1;}

//---------------------------------------------------------------------// 这是通用的1 ms延迟程序,用于提供1 mS到65.5 秒的延迟。

// 如果N = 1,则延迟为1 mS;如果N = 65535,则延迟为65,535 mS。 // 注意FCY会用于计算。

// 请根据上述定义语句作必要的更改(PLLx4或PLLx8等)// 以计算出正确的FCY。

void DelayNmSec(unsigned int N){

unsigned int j;while(N--)

for(j=0;j < MILLISEC;j++);}

DS00957A_CN第16页© 2005 Microchip Technology Inc.

dsPIC30F2010 microchip 无刷直流电机

附录 C:

原理图

© 2005 Microchip Technology Inc. DS00957A_CN第 17页

此附录包含了使用 dsPIC30F2010来控制带传感器的 BLDC电机的原理图。

图 C-1:

电机控制原理图 1

AN957

dsPIC30F2010 microchip 无刷直流电机

图 C-2:

电机控制原理图 2

DS00957A_CN第 18页© 2005 Microchip Technology Inc.

AN957

2 HIN 3 LIN

VB 8 HO 7 VS 6 VCC 1 LO 5 COM 4

2 HIN 3 LIN

VB 8 HO 7 VS 6 VCC 1 LO 5 COM 4

2 HIN 3 LIN

VB 8 HO 7 VS 6 VCC 1 LO 5 COM 4

dsPIC30F2010 microchip 无刷直流电机

请注意以下有关Microchip器件代码保护功能的要点:

Microchip的产品均达到Microchip数据手册中所述的技术指标。

Microchip确信:在正常使用的情况下,Microchip系列产品是当今市场上同类产品中最安全的产品之一。

目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以Microchip数据手册中规定的操作规范来使用Microchip产品的。这样做的人极可能侵犯了知识产权。Microchip愿与那些注重代码完整性的客户合作。

Microchip或任何其它半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是“牢不可破”的。

代码保护功能处于持续发展中。Microchip承诺将不断改进产品的代码保护功能。任何试图破坏Microchip代码保护功能的行为均可视为违反了《数字器件千年版权法案(Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的软件或其它受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。

提供本文档的中文版本仅为了便于理解。MicrochipTechnology Inc.及其分公司和相关公司、各级主管与员工及事务代理机构对译文中可能存在的任何差错不承担任何责任。建议参考Microchip Technology Inc.的英文原版文档。本出版物中所述的器件应用信息及其它类似内容仅为您提供便利,它们可能由更新之信息所替代。确保应用符合技术规范,是您自身应负的责任。Microchip对这些信息不作任何明示或暗示、书面或口头、法定或其它形式的声明或担保,包括但不限于针对其使用情况、质量、性能、适销性或特定用途的适用性的声明或担保。Microchip对因这些信息及使用这些信息而引起的后果不承担任何责任。未经Microchip书面批准,不得将Microchip的产品用作生命维持系统中的关键组件。在Microchip知识产权保护下,不得暗中或以其它方式转让任何许可证。

商标

Microchip 的名称和徽标组合、Microchip 徽标、Accuron、dsPIC、KEELOQ、microID、MPLAB、PIC、PICmicro、PICSTART、PROMATE、PowerSmart、rfPIC和

SmartShunt均为Microchip Technology Inc.在美国和其它国家或地区的注册商标。

AmpLab、FilterLab、Migratable Memory、MXDEV、MXLAB、PICMASTER、SEEVAL、SmartSensor和The Embedded Control Solutions Company 均为Microchip Technology Inc.在美国的注册商标。

Analog-for-the-Digital Age、Application Maestro、dsPICDEM、、dsPICworks、ECAN、ECONOMONITOR、FanSense、FlexROM、fuzzyLAB、In-Circuit Serial Programming、ICSP、ICEPIC、Linear Active Thermistor、MPASM、MPLIB、MPLINK、MPSIM、PICkit、PICDEM、、PICLAB、PICtail、

PowerCal、PowerInfo、PowerMate、PowerTool、rfLAB、rfPICDEM、Select Mode、Smart Serial、SmartTel、Total Endurance和WiperLock均为Microchip Technology Inc.在美国和其它国家或地区的商标。

SQTP是Microchip Technology Inc.在美国的服务标记。在此提及的所有其它商标均为各持有公司所有。© 2005, Microchip Technology Inc.版权所有。

Microchip 位于美国亚利桑那州Chandler和Tempe及位于加利福尼亚州Mountain View的全球总部、设计中心和晶圆生产厂均于2003年10月通过了ISO/TS-16949:2002 质量体系认证。公司在PICmicro® 8位单片机、KEELOQ®跳码器件、串行EEPROM、单片机外设、非易失性存储器和模拟产品方面的质量体系流程均符合ISO/TS-16949:2002。此外,Microchip在开发系统的设计和生产方面的质量体系也已通过了ISO 9001:2000 认证。

© 2005 Microchip Technology Inc.DS00957A_CN 第19

dsPIC30F2010 microchip 无刷直流电机

全球销售及服务网点

美洲

公司总部Corporate Office2355 West Chandler Blvd.Chandler, AZ 85224-6199Tel: 1-480-792-7200 Fax: 1-480-792-7277技术支持:

网址:亚特兰大AtlantaAlpharetta, GA

Tel: 1-770-640-0034 Fax: 1-770-640-0307波士顿BostonWestborough, MA Tel: 1-774-760-0087 Fax: 1-774-760-0088芝加哥ChicagoItasca, IL

Tel: 1-630-285-0071 Fax: 1-630-285-0075达拉斯DallasAddison, TX

Tel: 1-972-818-7423 Fax: 1-972-818-2924底特律Detroit

Farmington Hills, MI Tel: 1-248-538-2250Fax: 1-248-538-2260科科莫KokomoKokomo, IN

Tel: 1-765-864-8360Fax: 1-765-864-8387洛杉矶Los AngelesMission Viejo, CA Tel: 1-949-462-9523 Fax: 1-949-462-9608圣何塞San JoseMountain View, CA Tel: 1-650-215-1444Fax: 1-650-961-0286加拿大多伦多TorontoMississauga, Ontario, Canada

Tel: 1-905-673-0699 Fax: 1-905-673-6509

亚太地区

中国-北京

Tel: 86-10-8528-2100 Fax: 86-10-8528-2104中国-成都

Tel: 86-28-8676-6200 Fax: 86-28-8676-6599中国-福州

Tel: 86-591-8750-3506 Fax: 86-591-8750-3521中国-香港特别行政区Tel: 852-2401-1200 Fax: 852-2401-3431中国-上海

Tel: 86-21-5407-5533 Fax: 86-21-5407-5066中国-沈阳

Tel: 86-24-2334-2829 Fax: 86-24-2334-2393中国-深圳

Tel: 86-755-8203-2660 Fax: 86-755-8203-1760中国-顺德

Tel: 86-757-2839-5507 Fax: 86-757-2839-5571中国-青岛

Tel: 86-532-8502-7355 Fax: 86-532-8502-7205中国-武汉

Tel: 86-27-5980-5330 Fax: 86-27-5980-5118台湾地区-高雄Tel: 886-7-536-4818Fax: 886-7-536-4803台湾地区-台北

Tel: 886-2-2500-6610 Fax: 886-2-2508-0102台湾地区-新竹Tel: 886-3-572-9526Fax: 886-3-572-6459

亚太地区

澳大利亚Australia - SydneyTel: 61-2-9868-6733 Fax: 61-2-9868-6755印度India - BangaloreTel: 91-80-2229-0061 Fax: 91-80-2229-0062印度India - New DelhiTel: 91-11-5160-8631Fax: 91-11-5160-8632日本Japan - KanagawaTel: 81-45-471- 6166 Fax: 81-45-471-6122韩国Korea - SeoulTel: 82-2-554-7200 Fax: 82-2-558-5932 或82-2-558-5934

马来西亚Malaysia - PenangTel:011-604-646-8870Fax:011-604-646-5086菲律宾Philippines - ManilaTel: 011-632-634-9065Fax: 011-632-634-9069新加坡SingaporeTel: 65-6334-8870 Fax: 65-6334-8850

欧洲

奥地利Austria - WeisTel: 43-7242-2244-399Fax: 43-7242-2244-393丹麦Denmark - BallerupTel: 45-4450-2828 Fax: 45-4485-2829法国France - MassyTel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79德国Germany - IsmaningTel: 49-89-627-144-0 Fax: 49-89-627-144-44意大利Italy - Milan Tel: 39-0331-742611 Fax: 39-0331-466781荷兰Netherlands - DrunenTel: 31-416-690399 Fax: 31-416-690340英国England - BerkshireTel: 44-118-921-5869Fax: 44-118-921-5820

06/08/05

DS00957A_CN 第20页© 2005 Microchip Technology Inc.

本文来源:https://www.bwwdw.com/article/who1.html

Top