课程设计报告之直流电机控制(C语言版)Word文档格式.doc
《课程设计报告之直流电机控制(C语言版)Word文档格式.doc》由会员分享,可在线阅读,更多相关《课程设计报告之直流电机控制(C语言版)Word文档格式.doc(13页珍藏版)》请在冰豆网上搜索。
![课程设计报告之直流电机控制(C语言版)Word文档格式.doc](https://file1.bdocx.com/fileroot1/2022-10/30/fe4cc0bf-a105-4771-87e6-6fb67997d72b/fe4cc0bf-a105-4771-87e6-6fb67997d72b1.gif)
2).通过改变pwm的极性从而改变电机的转向,实现正反转
3).能够通过数码显示管显示电机的转速和电机的转向
4).通过启动键唯一启动电机,从而达到防止电机误启动的目的
5).能够通过键盘快速达到电机预先设定的速度和转向
备注:
由于没有传感器,所以本课程设计中没有设计测速模块,所显示的速度为理论速度,并非电机的实际转速
二.设计原理图
注:
本原理图采用proteus绘制
三.设计原理及其实现方法
1.速度调节的实现
通过控制L298的使能端“允许”或者“禁止”,通过改变a
(脉冲宽度)的值,从而达到控制PWM脉冲宽度调节电机转速的目的
2.转向的控制
通过L298中的H桥,从AT89C51中的P1_6和P1_7输出控制信号控制BJT的基极电压,控制L298中H桥的BJT通断,从而达到控制电机转向的目的
附:
A.L298的原理图
B.本设计所需要芯片以及作用
AT89C51:
单片机
L298:
控制电机驱动和转向
74L408:
四与门芯片
8255A:
用于扩展51端口,作显示用
2803:
显示缓冲用
MAX239:
串口通讯芯片
四.流程图
入口
启动
NY
P1_5=1,P1_4=1
停止
P1_5=0
Y
加速
N
a=a+n,P1_4=0
Y
a>
150
a=150
Y
a=a-n,P1_4=0
减速
P1_6=0,P1_7=1,P1_4=1
Or
P1_6=1,P1_7=0,P1_4=1
a<
10
NN
反转/正传
Y
a=10
进入预先设定的值
预设速度
YN
电机停转
五.程序清单
#include<
at89x51.h>
motor_ctr.h>
absacc.h>
stdio.h>
intrins.h>
#definePAXBYTE[0x1FFF]//A口地址;
#definePBXBYTE[0x3FFF]//B口地址;
#definePCXBYTE[0x5FFF]//C口地址;
#defineCONXBYTE[0x7FFF]//*控制字地*/;
ucharkey=0;
//定义key为全局变量
uinta=100;
ucharn=5;
//单次增加的步长,用于输出脉冲占空比控制
uintk1=0,mn=10;
//设置mn为转向标志位
ucharbai,shi,ge;
uintseg_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xff};
//0~9的七段显示代码;
/*THEMAINPROCESS*/
voidmain()
{
CON=0x80;
P1_5=0;
//使电机停转;
TMOD=0x15;
//定时器1工作在模式1
TH1=0xFF;
//定时器1的溢出中断时间为50ms;
TL1=0xb0;
ET1=1;
TR1=1;
while
(1)
{
key=GetKey();
/*case1~case9是预先设定的速度,方便电机直接调节到该速度,避免通过’+’键调节*/
switch(key)
{case'
1'
:
{a=10;
break;
}
case'
2'
{a=25;
break;
}
case'
3'
{a=40;
4'
{a=55;
5'
{a=70;
6'
{a=90;
7'
{a=110;
8'
{a=130;
9'
{a=150;
+'
{P1_4=0;
control();
} //电机加速
case'
-'
{control();
} //’-‘代表减速
='
{P1_7=0;
P1_6=1;
mn=0;
}//电机顺时针转
c'
{P1_7=1;
P1_6=0;
mn=1;
control();
} //逆时针转
/'
} //‘/‘键按下时,电机开始转动
default:
break;
//不影响电机运行
}
}
}
/*THEENDOFMAINPROCESS*/
/*THEINTERRUPTIONFUNCTION*/
voidtime()interrupt3//中断号为3,即是定时器1溢出中断
{//此处是计时50ms中断一次
TR1=0;
//此函数用于显示速度
k1+=TL0;
display(a/100,a%100/10,a%10,mn);
/*if(count==51)
{
sprintf(s,"
%04d"
k1%1000);
//注意sprintf的用法;
//确保有四位输出
count=1;
k1=0;
}
display(a,bai,shi,ge);
*/
TH1=0x3c;
TL1=0xb0;
TH0=0x00;
TL0=0x00;
TR1=1;
}
/*THEINTERRUPTIONFUNCTION*/
/*THEGETKEYFUNCTIONWHICHWASUSEDTOGETTHEINFORMATIONFROMTHEKEY*/
/*行信号从P1口的低四位读进,列信号从P2口的高四位读进*/
ucharGetKey()
{
P1_0=0;
P1_1=1;
P1_2=1;
P1_3=1;
P2_0=1;
P2_1=1;
P2_2=1;
P2_3=1;
_nop_();
_nop_();
//适当的延时以便消除抖动
if(!
P2_0)return'
;
if(!
P2_1)return'
P2_2)return'
if(!
P2_3)return'
P1_0=1;
P1_1=0;
P2_3){P1_4=0;
return'
*'
P1_0=1;
P1_2=0;