上海交大运动控制直流无刷电机实验报告

  • 格式:docx
  • 大小:160.50 KB
  • 文档页数:13

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

直流无刷电机实验报告

一、硬件电路原理简述

1、总体硬件电路图

图总体硬件电路原理图

单片机通过霍尔传感器获得转子的位置,并以此为依据控制PWM波的通断。

2、霍尔元件测量值与PWM波通断的关系

图霍尔元件测量值与PWM波通断的关系

二、软件架构

1、Components与变量定义

图 Components列表

PWMMC是用来产生控制电机的PWM波的。添加PWMMC时会同时加入一个eFlexPWM。

PWM_Out对应的是GPIO B2口,这个口电位为高时,电压才会被加到电机上。

GPIO B3控制着一个继电器,用于防止启动时过大的冲击电流。程序开始后不久就应把B3置高。

Halla、Hallb、Hallc对应于3个霍尔传感器。依次为GPIOC3、C4、C6。

TimerInt是用于测速的。根据2次霍尔元件的中断间的时间间隔来计算转速。

2、电机旋转控制代码

for(;;)

{

Hall_Sensor = 0b00000000;

Halla = Halla_GetVal();

Hallb = Hallb_GetVal();

Hallc = Hallc_GetVal();

if(Halla)

Hall_Sensor |= 0b00000100;

if(Hallb)

Hall_Sensor |= 0b00000010;

if(Hallc)

Hall_Sensor |= 0b00000001;

switch(Hall_Sensor)

{

case 0b0000011:

PESL(eFPWM1_DEVICE, PWM_OUTPUT_A, PWM_SM1_ENABLE);

PESL(eFPWM1_DEVICE, PWM_OUTPUT_B, PWM_SM2_ENABLE);

break;

case 0b0000001:

PESL(eFPWM1_DEVICE, PWM_OUTPUT_A, PWM_SM1_ENABLE);

PESL(eFPWM1_DEVICE, PWM_OUTPUT_B, PWM_SM0_ENABLE);

break;

case 0b0000101:

PESL(eFPWM1_DEVICE, PWM_OUTPUT_A, PWM_SM2_ENABLE);

PESL(eFPWM1_DEVICE, PWM_OUTPUT_B, PWM_SM0_ENABLE);

break;

case 0b0000100:

PESL(eFPWM1_DEVICE, PWM_OUTPUT_A, PWM_SM2_ENABLE);

PESL(eFPWM1_DEVICE, PWM_OUTPUT_B, PWM_SM1_ENABLE);

break;

case 0b0000110:

PESL(eFPWM1_DEVICE, PWM_OUTPUT_A, PWM_SM0_ENABLE);

PESL(eFPWM1_DEVICE, PWM_OUTPUT_B, PWM_SM1_ENABLE);

break;

case 0b0000010:

PESL(eFPWM1_DEVICE, PWM_OUTPUT_A, PWM_SM0_ENABLE);

PESL(eFPWM1_DEVICE, PWM_OUTPUT_B, PWM_SM2_ENABLE);

break;

}

for(i=0;i<6;i++)

PWMC1_SetDutyPercent(i,50);

PWMC1_Load();

}

这段代码是main函数中的for循环。不断地获取霍尔传感器中的值并依此控制PWM波的通断。获取到的霍尔传感器的值存入Hall_Sensor变量的后3位中。

3、测速及调速代码

以下为HallC的中断响应函数。

float RPS_C;

double IntTimesC;

#pragma interrupt called /* Comment this line if the appropriate 'Interrupt preserve registers' property */ /* is set to 'yes' (#pragma interrupt saveall is generated before the ISR) */ void Hallc_OnInterrupt(void)

{

/* place your Hallc interrupt procedure body here */

static bool bFirstInt = 1;

if(bFirstInt)

{

bFirstInt = 0;

IntTimesC = 0;

}

else

{

RPS_C = 1/(IntTimesC* /2;

IntTimesC = 0;

if(RPS_C>50)

DutyPercent-=1;

else

DutyPercent+=1;

}

}

计时器每100微秒进入一次中断,每次计时器中断,IntTimesC都会加一。因此在HallC的中断响应函数能根据IntTimesC计算转速。RPS_C为根据2次Hallc中断间的间隔计算出的每秒转速。电机每转一圈,Hallc的中断会进入2次。Halla和Hallb的中断响应函数中也有类似的代码。

下面这段代码实现了积分调节,能使转速稳定在每秒50转。

if(RPS_C>50)

DutyPercent-=1;

else