上海交大运动控制直流无刷电机实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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