实验6电机转动控制实验Word下载.docx

上传人:b****8 文档编号:22453966 上传时间:2023-02-04 格式:DOCX 页数:17 大小:125.78KB
下载 相关 举报
实验6电机转动控制实验Word下载.docx_第1页
第1页 / 共17页
实验6电机转动控制实验Word下载.docx_第2页
第2页 / 共17页
实验6电机转动控制实验Word下载.docx_第3页
第3页 / 共17页
实验6电机转动控制实验Word下载.docx_第4页
第4页 / 共17页
实验6电机转动控制实验Word下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

实验6电机转动控制实验Word下载.docx

《实验6电机转动控制实验Word下载.docx》由会员分享,可在线阅读,更多相关《实验6电机转动控制实验Word下载.docx(17页珍藏版)》请在冰豆网上搜索。

实验6电机转动控制实验Word下载.docx

电机是把电能转换成机械能的装置。

电机的种类繁多,如果按电源类型分,可分为直流

电机和交流电机两大类。

常见的直流电机包括有刷电机、无刷电机、步进电机等。

直流有刷

电机是所有电机的基础,它具有启动快、制动及时、可在大范围内平滑地调速、控制电路相

对简单等特点。

近年来,随着计算机进入控制领域,以及新型的电力电子功率元器件的不断出现,使采用全控型的开关功率元件进行脉宽调制(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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1