R1
图4-1上电复位电路
4.2振荡电路
振荡电路是单片机系统工作的核心,它提供单片机工作的“动力”,
并关系到单片机运行速度的快慢、应用系统稳定性的高低等。
一般可以使用晶体或晶振来搭建,他们的主要区别在于晶体需要外接振荡电路才能够起振,而晶振只需要在相应的引脚上提供电源和地信号既可以发出脉冲信号。
高频率的时钟有利于程序更快的运行,也有可以实现更高的信号采样率,从而实现更多的功能。
但是告诉对系统要求较高,而且功耗大,运行环境苛刻。
考虑到单片机本身用在控制,并非高速信号采样处理,所以选取合适的频率即可。
合适频率的晶振对于选频信号强度准确度都有好处,本次设计选取11.0592MHZ无源晶振接入XTAL1和XTAL2引脚。
并联2个30PF陶瓷电容帮助起振。
振荡电路如图3-2所示
--XTAL1
□CY1
<:
XTAL2
图4-2振荡电路
4.3驱动电路
本次设计采用达林顿管等驱动芯片来驱动直流电机。
达林顿管又称
复合管,原理是将两只三极管适当地连接在一起,组成一只等效的新三极管。
放大倍数是两只三极管放大倍数之积,常常用于驱动较大驱动电流的器件。
本次设计采用ULN2003驱动芯片驱动直流电机。
驱动电路如图3-3所小。
图4-3直流电机驱动电路
4.4显示电路
本次设计中,因需要显示调速等级,故使用一位8段数码管用作显
示。
数码管是单片机系统常用的一种外围显示器件,可以显示一些简单的数字或字符。
显示电路如图3-4所示
|,PO,l[/:
_P0.2L^I-po.r/r-P0.4Vnw/
图4-4一位八段数码管显示电路
5单元电路的设计(计算与说明)
单元电路设计:
单元电路是整机的一部分,只有把各单元电路设计好才能提高整体设计水平。
每个单元电路设计前都需明确本单元电路的任务,详细拟订出单元电路的性能指标,与前后级之间的关系,分析电路的组成形式。
具体设计时,可以模仿成熟的先进电路,也可以进行创新或改进,但都必须保证性能要求。
对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。
不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变电机输出方波的占空比就能改变加在电机两端的电压大小,从而改变了转速,51
单片机内部没有PWM特殊功能寄存器,通过单片机内部的定时器加中
断模拟PWM波形。
T0定时器中断是让一个I0口输出高电平,在这个定
时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,
这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可
以改变占空比。
键盘控制PWM的占空比,从而控制电机的转速,具体
原理是,键盘向单片机输入相应控制指令,由单片机通过IO其中一口输
出与转速相应的PWM脉冲,由ULN2003芯片控制电动机地端,实现电
动机转速的控制。
定时器周期是20ms,当按键按下时,PWM占空比增
加6/20,电机速度增加。
电动机的运转状态通过数码管显示出来。
电动
机所处速度级以速度档级数显示。
正转时最高位显示“三”,其它三位为
电机转速。
每次电动机启动后开始显示。
参数计算:
为保证单元电路达到功能指标要求,就需要用电子技术
知识对参数进行计算。
例如,放大电路中各阻值、放大倍数的计算;振
荡器中电阻、电容、振荡频率等参数的计算。
只有很好地理解电路的工
作原理,正确利用计算公式,计算的参数才能满足设计要求。
6硬件制作与调试
6.1系统调试
安装调试:
安装与调试过程应按照先局部后整机的原则,根据信号
的流向逐块调试,使各功能块都要达到各自技术指标的要求,然后把它
们连接起来进行统调和系统测试。
调试包括调整与测试两部分,调整主
要是调节电路中可变元器件或更换器件,使之达到性能的改善。
测试是
采用电子仪器测量相关点的数据与波形,以便准确判断设计电路的性能。
装配前必须对元器件进行性能参数测试。
在程序编写的过程中,出现了很多问题,虽然问题不是很大,但是
一个很简单的指令错误,运行结果总是失败,同一种效果,不同的方法
却不同。
在解决这些问题的时候,我不断的查阅资料。
经过多天的努力
探索,大部分问题都已经解决,就是程序还是不能实现应该实现的功能,这让我很着急。
后来经过一点一点的调试,并认真总结,发现了问题其实在编写中断处理程序时出现了错误,修改后即可实现直流电机调速的目的。
总结这次软件调试,让我认识到了做软件调试的基本方法:
1.认真检查源代码,看是否有文字或语法错误。
2.逐段子程序进行设计,找出错误出现的部分,重点排查。
3.找到合适的方法,仔细检查程序,分步调试直到运行成功。
6.2系统仿真
1.初始状态,直流电机半速运转。
如图5-1所示
2.按下加速键,直流电机运行状态如图5-2所示
图6-2直流电机加速
3.按下减速按键,直流电机运行状态如图5-3所示
图6-3直流电机减速
7总结
通过本次课程设计,使我学会了单片机的功能以及直流电机调速系统的电路设计,让我了解了,单片机调速系统可实现对直流电动机的平滑调速,PWM是通过控制固定电压的直流电源开关频率,从而改变单片机来实现电机调整,相对于其他用硬件或者硬件与软件相结合的方法,实现对电机进行调整,它能够充分发挥单片机的效能,对于简易速度控制系统的实现提供了一种有效的途径。
变负载两端的电压,进而达到控制要求的一种电压调整方法,而在软件方面,采用PLD算法来确定闭环控制的补偿量,也是由数字电路组成的直流电机闭环调速系统所不能及的。
曾经也试过用单片机直接产生波形,但其最终效果并不理想,在使用了少量的硬件后,单片机的压力大大减小,程序中有充足的时间进行闭环控制的测控和计算,使得软件的运行更为合理可靠。
另外,在进行仿真的时候,也经常出现程序没有错误,但是仿真通不过的情况,这些原因是出在管脚定义上,很多系统仿真的问题都出在这。
经过这段时间的努力,使我对仿真软件以及系统设计电路有了更深一步的认识。
通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和
工作做出了最好的榜样。
我觉得作为一名自动化专业的学生,单片机的
课程设计是很有意义的。
更重要的是如何把自己平时所学的东西应用到
实际中。
虽然自己对于这门课懂的并不多,很多基础的东西都还没有很
好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着
这一个多礼拜的“学习”,在小组同学的帮助和讲解下,渐渐对这门课逐
渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。
我认为这个收获应该说是相当大的。
觉得课程设计反映的是一个从理论
到实际应用的过程,但是更远一点可以联系到以后毕业之后,从学校转
到踏上社会的一个过程。
小组人员的配合、相处,以及自身的动脑和努力,都是以后工作中需要的。
参考文献
[1]李学龙.使用单片机控制的智能遥控电风扇控制器[J].电子电路制作,2003,9:
13~15.
[2]蓝厚荣.单片机的PWM控制技术[J].工业控制计算机,2010,23(3):
97~98
[3]郭天祥.新概念51单片机C语言教程[M].北京:
电子工业出版社.2009.342~344
[4]胡汉才.单片机原理及其接口技术(第2版)[M].北京:
清华大学出版
社.2004.49~77.
[5]胡全.51单片机的数码管动态显示技术[J].信息技术,2009,13:
25~26
[6]马云峰.单片机与数字温度传感器DS18B20的接口设计[J].计算机测量与控
制,2007,10(4):
278~280
附录1:
总体电路原理图
r\=--
EX』
I】
MirI:
H一
fiypf.i.cnIif—河氐
vr、l:
""TTTTT
附录2:
实物图
附录3:
元器件清单
序号
名称
型号规格
数量
1
单片机
STC89C52
1
2
数码管
W8U3A
1
3
电阻
10K
1
4
电阻
4.7K
1
5
按键开关
2
6
达林顿反相器
ULN2003
1
7
电解电容
10Uf/50v
1
8
晶振
11.0592MHZ
1
9
电容
30PF
2
10
导线
11
直流电机
5V
1
12
稳压二极管
1N4148
1
4:
程序代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedintuchartmr,k,l;
charj=0;
//sbitmotor=P2A0;
sbitmotor2=P2A4;
//sbitmo=P2A1;
sbita=P1A1;
sbitb=P1A2;
sbitc=P1A4;
sbitd=P1A5;
sbite=P1A7;
sbitf=P1A0;
sbitg=P1A3;
sbitdian=P1A6;
sbitk1=P2A1;//+
sbitk2=P2A3;//-
voiddelay()
{
uchari=200;
while(i--);
}
//voidshuzi1()
//{
//a=1;
//b=1;
//c=1;
//d=1;
//e=0;
//f=0;
//g=1;
//dian=1;
//}//voidshuzi2()
//{
//a=0;
//b=1;
//c=0;
//d=0;
//e=1;
//f=0;
//g=0;
//dian=1;
//}
//voidshuzi3()
//{
//a=0;
//b=1;
//c=1;
//d=0;
//e=0;
//f=0;
//g=0;
//dian=1;
//}
//voidshuzi()
//{
//a=1;
//b=1;
//c=1;
//d=1;
//e=1;
//f=1;
//g=1;
//dian=0;
//}
voiddingshi()
{
TMOD=0X01;
//1ms
TH0=0xfc;
TL0=0x66;
TR0=1;
ET0=1;
EA=1;
)
voidmain()
(
tmr=0;
dingshi();
//P1=0x18;//48
while
(1)
(
uchark=1,l=1,o=100;
if(k1==0)〃第一次按下+&&l==1
(
delay();
if(k1==0)//&&m==0&&l==1
(
j=j+6;
if(j>=18)
(
j=18;
)
while(k1==0|o--);
if(k2==0)//第二次按下+&&l==2
(
delay();
if(k2==0)//&&m==0&&l==2
(
j=j-6;
//l=3;
if(j<=2)
(
j=0;
)
while(k2==0|o--);
)
if(tmr<=j)
(
motor2=1;//运行
)
else
//停止
motor2=0;
if(j==6)
{
P1=0xde;
}
if(j==12)
{
P1=0x34;
}
if(j==18)
{
P1=0x94;
}
if(j==0)
{
P1=0x18;
}
}
//P1=0x00;
}
voidding()interrupt1
{
TH0=0xfc;//1ms一个周期
TL0=0x66;
tmr++;
if(tmr>=20)
{tmr=0;}