当前位置:文档之家› 上海交大运动控制直流无刷电机实验报告

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

直流无刷电机实验报告一、硬件电路原理简述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;elseDutyPercent+=1;}}计时器每100微秒进入一次中断,每次计时器中断,IntTimesC都会加一。

因此在HallC的中断响应函数能根据IntTimesC计算转速。

RPS_C为根据2次Hallc中断间的间隔计算出的每秒转速。

电机每转一圈,Hallc的中断会进入2次。

Halla和Hallb的中断响应函数中也有类似的代码。

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

if(RPS_C>50)DutyPercent-=1;elseDutyPercent+=1;在main函数的for循环中,每次循环都会根据DutyPercent 设置PWM波的占空比。

4、PWMMC模块的设置(1)添加一个PWMM模块后,软件会弹出一个对话框,提示要添加一个eFlexPWM,点OK就行。

图添加PWMMC(2)在PWMMC的设置里,设置好频率,死区。

频率是PWM的频率,可以设高点。

由于老师给我们的板子上已经有死区了,软件的死区时间其实没有必要。

然后,把Fault Protection里的fault全设为Disabled。

这个好像是某种类型的保护机制,不Disabled的话可能会影响PWM波的输出,基于同样的理由,在下文中,带有Fault字样的选项,全设为Disabled或no。

在Methods项卡中,把SetDutyPercent选上。

图 PWMMC设置(3)在eFlexPWM的设置里,把所有带有红色感叹号的项设为Disabled。

然后展开PWM Faluts。

把fault全设为Disabled。

把Channel A和Channel B的PWM Function里的Channel Output 设为Enable。

注意Channel A和Channel B各有3个。

把Mode设为Independent,共有3处要设。

把Disable by Fault设为no,共24处要设置。

图 eFlexPWM设置三、开发过程中遇到的各种问题及解决方法1、程序改变了,debug时发现运行结果没有任何变化。

改变程序之后,要先点一下Make 按钮,构建一遍之后再debug,否则debug的时候下载进去的还是上次构建的程序。

2、发不出PWM波。

把PWMMC和eFlexPWM的设置里,把带有Fault字样的选项,全设为Disabled或no。

Fault Protection似乎是某种形式的保护机制,没设置好的话会影响PWM波的输出。

还要把Channel A和Channel B的PWM Function里的Channel Output 设为Enable。

注意Channel A和Channel B各有3个。

3、找不到某些函数。

在设置组件的对话框的底部有3个按钮,建议选择EXPERT。

其他2个会隐藏部分函数和设置。

4、能发出PWM波,但是电机不动。

把GPIOB2、B3置1 。

GPIOB2口电位为高时,电压才会被加到电机上。

GPIO B3控制着一个继电器,用于防止启动时过大的冲击电流。

程序开始后不久就应把B3置高。

5、OverI灯一直亮着,电机不动这个问题困扰了我们很久,经检查,输入电压没有过压,没有短路。

后来,在老师的帮助下发现似乎是板子里的程序干扰了电机驱动板对过流的判断。

进一步检查发现把控制LED灯的GPIOE6、E7、F6删除后,问题消失。

事后推测,上述3个GPIO口中应该有一个和OverI相连,可以从这个口读取过流状态。

但是如果把这个口作为输出口,就会影响电机驱动板对过流的判断。

6、PI调节的参数确定在做出积分调节之后,由于我们急于做步进电机,就把电机换了。

但是积分调节是有缺陷的,就是反应慢。

所以还需要比例调节来补足。

但是,PI的参数很难确定,只能凭经验或者一个个试。

下面是我在网上找到的一个方法,也许有帮助。

确定比例系数Kp时,首先去掉PID 的积分项和微分项,可以令Ti=0、Td=0,使之成为纯比例调节。

输入设定为系统允许输出最大值的60%~70%,比例系数Kp由0开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数Kp逐渐减小,直至系统振荡消失。

记录此时的比例系数Kp,设定PID的比例系数Kp为当前值的60%~70%。

比例系数Kp确定之后,设定一个较大的积分时间常数Ti,然后逐渐减小Ti,直至系统出现振荡,然后再反过来,逐渐增大Ti,直至系统振荡消失。

记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。

相关主题