实验6电机转动控制实验Word下载.docx
《实验6电机转动控制实验Word下载.docx》由会员分享,可在线阅读,更多相关《实验6电机转动控制实验Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
电机是把电能转换成机械能的装置。
电机的种类繁多,如果按电源类型分,可分为直流
电机和交流电机两大类。
常见的直流电机包括有刷电机、无刷电机、步进电机等。
直流有刷
电机是所有电机的基础,它具有启动快、制动及时、可在大范围内平滑地调速、控制电路相
对简单等特点。
近年来,随着计算机进入控制领域,以及新型的电力电子功率元器件的不断出现,使采用全控型的开关功率元件进行脉宽调制(PulseWidthModulation,简称PWM)控制方式已成为主流。
这种方式很容易在单片机控制中实现,从而为直流电机控制数字化提供了契机。
本实验使用EasyARM8962的两路带死区的互补PWM信号来驱动DCMotor-Kit。
通过改变PWM的占空比来调节电机两端的平均电压,实现粗略的调速。
实验使用EasyARM8962的KEY1和KEY2两个按键来改变占空比,每次按动将改变10%的占空比,实验开始时默认占空比为50%。
LED3和LED4分别表示电机正转和反转,另外还有过流报警的功能,如果电机被堵转,EasyARM8962的蜂鸣器就会报警。
实验原理
下图是最基本的PWM驱动电机的电路。
当开关管V1的栅极输入高电平时,V1导通,电机电枢绕组两端电压为Us。
在t1秒后,栅极输入变为低电平,V1截止,电机的自感电流通过D1迅速释放掉,电枢两端电压变为0。
t2秒后,栅极输入重新变为高电平,V1重复前面的过程。
图1.10显示了开关管V1的输入和输出的关系。
由此得到电机的电枢绕组两端的平均电压Uo为:
Uo=(t1*Us)/(t1+t2)=Us*(t1/T)=α*Us式中α是占空比。
实验步骤
(1)对EasyARM8962进行短路设置;
用短路帽分别把JP2的KEY1与PE2、KEY2与PE3、LED1与PF3、LED2与PF2,JP3的LED3与PB6、LED4与PC5、BEEP与PA7短接,其它跳线不能被短路;
(2)用短路帽短接电机模块的J3“双”端处,表示使用双路PWM驱动。
(3)用杜邦线连接EasyARM8962的J3和电机板的J2相关的引脚,如表1.3所示
(4)连接EasyARM8962开发板的电源和仿真器。
(5)使用Keil软件,烧写程序。
(6)按一下EasyARM8962的复位键,让开发板脱机运行。
(7)按动EasyARM8962的KEY1和KEY2键,调节电机的转速;
观察LED1、LED2、
LED3和LED4的显示情况。
注:
LED1和LED2显示PWM占空比改变情况;
LED3表示正转,LED4表示反转。
(8)用手堵住电机不让其转动,聆听蜂鸣器是否报警。
注意:
在某些占空比的情况下,堵转时电流仍然不大,不会报警。
代码
/*
**FileName:
pwm_motor.c
**LastmodifiedDate:
2006-11-15
**LastVersion:
v1.0
**Description:
本程序用PWM信号来控制直流电机,同时根据电机返回过*来的信号判断电机的转动方向和是否堵转
**/
/*************************************************************************
*系统头文件配置
**************************************************************************/
#include"
hw_memmap.h"
hw_types.h"
hw_ints.h"
ssi.h"
gpio.h"
sysctl.h"
timer.h"
comp.h"
interrupt.h"
*GPIOA引脚配置
#defineSPEED_PIN1GPIO_PIN_0
#defineSPEED_PIN2GPIO_PIN_1
*GPIOB引脚配置**************************************************************************/
#definePWMA_PINGPIO_PIN_0
#defineKEY1_PINGPIO_PIN_1
#defineBUZZ_PINGPIO_PIN_4
#defineKEY2_PINGPIO_PIN_5
#defineCURRENT_PINGPIO_PIN_4
#defineLED1_PINGPIO_PIN_0
#defineLED2_PINGPIO_PIN_2
/**************************************************************************
*定义输出
*************************************************************************/
#defineLED1_ON()GPIOPinWrite(GPIO_PORTD_BASE,LED1_PIN,~LED1_PIN)
#defineLED1_OFF()GPIOPinWrite(GPIO_PORTD_BASE,LED1_PIN,LED1_PIN)
#defineLED2_ON()GPIOPinWrite(GPIO_PORTG_BASE,LED2_PIN,~LED2_PIN)
#defineLED2_OFF()GPIOPinWrite(GPIO_PORTG_BASE,LED2_PIN,LED2_PIN)
#defineBUZZ_ON()GPIOPinWrite(GPIO_PORTG_BASE,BUZZ_PIN,~BUZZ_PIN)
#defineBUZZ_OFF()GPIOPinWrite(GPIO_PORTG_BASE,BUZZ_PIN,BUZZ_PIN)
#definePWMLoadValue6000/*设定PWM的输出频率为1KHz*/
unsignedcharPWMDutyCycle=50;
/*PWM输出占空比,范围为1~100*/
#definePWMStep10/*PWM输出占空比步进*/
#defineKeyAS20/*按键防抖为20ms*/
**Functionname:
Config()
**
**Descriptions:
初始化子函数
**inputparameters:
NONE
**outputparameters:
**
**Returnedvalue:
*/
voidConfig(void){
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
/*使能定时器0外设*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
/*使能定时器1外设*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
/*使能GPIOA口外设*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
/*使能GPIOD口外设*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
/*使能GPIOG口外设*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
/*使能GPIOB口外设*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_COMP0);
/*使能比较器0外设*/
GPIODirModeSet(GPIO_PORTA_BASE,SPEED_PIN1|SPEED_PIN2,GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTA_BASE,SPEED_PIN1|SPEED_PIN2,
GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD);
GPIOIntTypeSet(GPIO_PORTA_BASE,SPEED_PIN1|SPEED_PIN2,GPIO_FALLING_EDGE);
GPIOPinIntEnable(GPIO_PORTA_BASE,SPEED_PIN1|SPEED_PIN2);
IntEnable(INT_GPIOA);
/*设置GPIOA口部分*/
GPIOPinTypeComparator(GPIO_PORTB_BASE,CURRENT_PIN);
/*设置模拟比较器输出管脚*/
GPIODirModeSet(GPIO_PORTB_BASE,PWMA_PIN,GPIO_DIR_MODE_HW);
GPIOPinTypePWM(GPIO_PORTB_BASE,PWMA_PIN);
GPIODirModeSet(GPIO_PORTD_BASE,LED1_PIN,GPIO_DIR_MODE_OUT);
GPIOPadConfigSet(GPIO_PORTD_BASE,LED1_PIN,GPIO_STRENGTH_2MA,
GPIO_PIN_TYPE_STD);
GPIODirModeSet(GPIO_PORTG_BASE,LED2_PIN,GPIO_DIR_MODE_OUT);
GPIOPadConfigSet(GPIO_PORTG_BASE,LED2_PIN,GPIO_STRENGTH_2MA,
GPIODirModeSet(GPIO_PORTG_BASE,BUZZ_PIN,GPIO_DIR_MODE_OUT);
GPIOPadConfigSet(GPIO_PORTG_BASE,BUZZ_PIN,GPIO_STRENGTH_2MA,
/*设置LED和BUZZ为输出*/
GPIODirModeSet(GPIO_PORTD_BASE,KEY1_PIN,GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTD_BASE,KEY1_PIN,GPIO_STRENGTH_2MA,
GPIOIntTypeSet(GPIO_PORTD_BASE,KEY1_PIN,GPIO_RISING_EDGE);
GPIODirModeSet(GPIO_PORTG_BASE,KEY2_PIN,GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTG_BASE,KEY2_PIN,GPIO_STRENGTH_2MA,
GPIOIntTypeSet(GPIO_PORTG_BASE,KEY2_PIN,GPIO_RISING_EDGE);
GPIOPinIntEnable(GPIO_PORTD_BASE,KEY1_PIN);
GPIOPinIntEnable(GPIO_PORTG_BASE,KEY2_PIN);
/*设置按键中断*/
IntEnable(INT_GPIOD);
IntEnable(INT_GPIOG);
/*打开GPIOB口中断*/
TimerConfigure(TIMER1_BASE,
(TIMER_CFG_16_BIT_PAIR|TIMER_CFG_A_ONE_SHOT|TIMER_CFG_B_ONE_SHOT));
TimerConfigure(TIMER0_BASE,
(TIMER_CFG_16_BIT_PAIR|TIMER_CFG_A_PWM|TIMER_CFG_B_PERIODIC));
TimerLoadSet(TIMER0_BASE,TIMER_A,PWMLoadValue);
TimerControlLevel(TIMER0_BASE,TIMER_A,1);
TimerPrescaleSet(TIMER0_BASE,TIMER_B,100);
TimerPrescaleSet(TIMER1_BASE,TIMER_A,KeyAS);
TimerPrescaleSet(TIMER1_BASE,TIMER_B,KeyAS);
TimerEnable(TIMER0_BASE,TIMER_BOTH);
/*定时器配置*/
TimerIntEnable(TIMER1_BASE,(TIMER_TIMA_TIMEOUT|TIMER_TIMB_TIMEOUT));
IntEnable(INT_TIMER1A);
IntEnable(INT_TIMER1B);
/*打开定时器中断*/
ComparatorRefSet(COMP_BASE,COMP_REF_0_825V);
/*设定内部参考电压为0.825V*/
ComparatorConfigure(COMP_BASE,0,COMP_ASRCP_REF);
/*配置比较器使用内部参考电压*/
}
delay(ultime)
延时
ultime
voiddelay(unsignedlongultime){
while(ultime){
ultime--;
}
main()
程序主函数
intmain(void){
unsignedcharCompCnt=0;
unsignedchari;
Config();
BUZZ_OFF();
TimerMatchSet(TIMER0_BASE,TIMER_A,
(PWMLoadValue-(PWMDutyCycle*PWMLoadValue/100)));
while
(1){
if(!
ComparatorValueGet(COMP_BASE,0)){/*判断是否堵转*/
if(CompCnt<
250){
CompCnt++;
}else{
for(i=0;
i<
10;
i++){
BUZZ_ON();
delay(500);
BUZZ_OFF();
}/*如果持续堵转则开蜂鸣器报警*/
}
}else{
if(CompCnt>
0){
CompCnt--;
BUZZ_OFF();
/*不堵转则关蜂鸣器*/
}
GPIO_Port_D_ISR()
GPIOD口中断服务子函数
voidGPIO_Port_D_ISR(void){
GPIOPinIntClear(GPIO_PORTD_BASE,KEY1_PIN);
/*清除中断标志*/
TimerLoadSet(TIMER1_BASE,TIMER_A,6000);
/*开始防抖*/
TimerEnable(TIMER1_BASE,TIMER_A);
GPIO_Port_G_ISR()
GPIOG口中断服务子函数
voidGPIO_Port_G_ISR(void){
GPIOPinIntClear(GPIO_PORTG_BASE,KEY2_PIN);
TimerLoadSet(TIMER1_BASE,TIMER_B,6000);
TimerEnable(TIMER1_BASE,TIMER_B);
Timer1A_ISR()
Timer1A中断服务子函数
voidTimer1A_ISR(void){
TimerIntClear(TIMER1_BASE,TIMER_TIMA_TIMEOUT);
if(GPIOPinRead(GPIO_PORTD_BASE,KEY1_PIN)){/*如果是正常按下则处理*/
PWMDutyCycle+=PWMStep;
/*改变PWM占空比并改变输出*/
if(PWMDutyCycle>
100){
PWMDutyCycle-=100;
TimerMatchSet(TIMER0_BASE,TIMER_A,
(PWMLoadValue-(PWMDutyCycle*PWMLoadValue/100)));
Timer1B_ISR()
Timer1B中断服务子函数
**Createdby:
YangLi
**CreatedDate:
**Modifiedby:
ShaoXuefeng
**Modifieddate:
2007-10-20
**Modifiedby:
Ruanfuyuan
2008-08-08
voidTimer1B_ISR(void){
TimerIntClear(TIMER1_BASE,TIMER_TIMB_TIMEOUT);
if(GPIOPinRead(GPIO_PORTG_BASE,KEY2_PIN)){/*如果是正常按下则处理*/
if(PWMDutyCycle<
=PWMStep){
PWMDutyCycle+=100;
PWMDutyCycle-=PWMStep;