【毕业设计】33-基于单片机的直流电机的转速检测与控制设计(原理图工程+PCB工程+源代码工程+仿真工程+答辩论文)
资料要求
资料包含:毕业设计全套资料(精品)
原理图工程文件
原理图截图
仿真模型工程文件
仿真截图
答辩论文低重复率文档,22550字
英文文献及翻译
visio流程图工程
详情请私信!
任务书
设计内容:直流电机的转速检测与控制设计
设计要求:
1.在确定论文方向的基础上收集、整理资料,并在对所收集资料有所理解的基础上科学拟定题目,写出开题报告。
2.论文要紧扣主题,思路清晰,主题明确。根据主题的具体要求,完成直流电机的转速检测方案设计、硬件选型、安装方法、检测后数值的处理等。
3.利用单片机完成转速测量后的显示与闭环控制。
4.通过LCD显示直流电机的转速值及控制信息。论文中采用的解决办法和思路,设计的控制过程,说明原理。并用电脑软件Proteus仿真。
5.论文计算过程要说明,插图部分、仿真过程要做说明。
论文方案设计部分,控制系统设计部分要附电路图,方案图。
设计说明书
摘要
本次设计的设计步骤:首先是对控制系统的功能分析,然后开始选择设计中所涉及的元器件;使用AD绘制控制系统的电路图,使用Visio绘制系统程序框图,再使用keil软件对控制程序进行编写,最后再使用Proteus对整个控制系统实现仿真,并且还通过矩阵键盘来控制系统。该系统可以实现的功能有:控制系统的正转、反转;控制系统加速、减速;控制系统速度15RPM-150RPM。经过多次功能验证与测试,在保证功能完成的前提下具有较好的耐久性。
设计框架架构
设计说明书及设计文件
源码展示
#include <showfun.h>
#include <stdio.h>
extern char fnLCMInit(); // LCM 初始化
extern void at(unsigned char x,unsigned char y);/*设定文本x,y值*/
extern void cls(); // 清屏
extern void charout(unsigned char *str); //ASCII(8*8) 显示函数
extern void fnSetPos(unsigned char urow, unsigned char ucol); // 设置当前地址
extern uchar dprintf(uchar x,uchar y,char *fmt);// ASCII(8*16) 及 汉字(16*16) 显示函数
extern uchar fnPR12(uchar uCmd); // 写无参数的指令
extern uchar fnPR13(uchar uData); // 写数据
extern unsigned int Adc0832(unsigned char channel);
extern void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode);
extern void Pixel(unsigned char PointX,unsigned char PointY, bit Mode);
uchar dsp[10]={0,0,0,0,0,0,0,0,0,0,};
char abc[3]={0,0,0,};
uchar key=0;
uint a=5; //初始速度
uchar n=5; //速度增加或减小一次
uchar count=1;
uint k1=0;
uchar GeyKey();
void delay(uchar i);
void control();
main()
{
fnLCMInit(); //液晶初始化
fnSetPos(0,0); //液晶 设置当前地址
dprintf(8,0,"直流电机转速检测控制系统");
dprintf(12,15,"键盘 + :速度加");
dprintf(12,30,"键盘 - :速度减");
dprintf(12,45,"0 - 9:15 - 150 rpm");
dprintf(12,60,"键盘 = :顺时针");
dprintf(12,75,"键盘 on/c :逆时针");
dprintf(12,90,"转向:");
dprintf(12,102,"SET:");
dprintf(12,117,"NOW:");
/****设置初始状态****/
P1_1=0;
TMOD=0x15;
TH1=0x3c;
TL1=0xb0;
TH0=0x00;
TL0=0x00;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
/****键盘设置****/
while(1)
{ key=GeyKey();
switch(key)
{
case '=': {P1_0=1;dprintf(48,90,"顺时针");control();break;}
case 'c': {P1_0=0;dprintf(48,90,"逆时针");control();break;}
default: break;
}
}
}
/****键盘扫描****/
uchar GeyKey()
{
P1_4=0;
P1_5=1;
P1_6=1;
P1_7=1;
P3_0=1;
P3_1=1;
P3_2=1;
P3_3=1;
_nop_();_nop_();
if(!P3_0)return '7';
if(!P3_1)return '8';
if(!P3_2)return '9';
if(!P3_3)return '/';
P1_4=1;
P1_5=0;
P1_6=1;
P1_7=1;
_nop_();_nop_();
if(!P3_0)return '4';
if(!P3_1)return '5';
if(!P3_2)return '6';
if(!P3_3)return '*';
P1_4=1;
P1_5=1;
P1_6=0;
P1_7=1;
_nop_();_nop_();
if(!P3_0)return '1';
if(!P3_1)return '2';
if(!P3_2)return '3';
if(!P3_3)return '-';
P1_4=1;
P1_5=1;
P1_6=1;
P1_7=0;
_nop_();_nop_();
if(!P3_0)return 'c';
if(!P3_1)return '0';
if(!P3_2)return '=';
if(!P3_3)return '+';
return 0;
}
/****延时程序****/
void delay(uchar i)
{ uchar j,k;
for(;i>0;i--)
for(j=15;j>0;j--)
for(k=11;k>0;k--);
}
void time()interrupt 3 //计时器T1—用于测速
{
TR1=0;
count++; //每定时中断一次就加一
k1+=TL0;
if(count==51)
{
sprintf(dsp,"%3d",k1); //转化
dprintf(48,117,dsp);
dprintf(88,117,"r/min");
count=1;
k1=0;
}
TH1=0x3c; //0011 1100 //50ms一次中断
TL1=0xb0; //1010 0000
TH0=0x00;
TL0=0x00;
TR1=1;
}
/****调速控制****/
void control()
{
EA=1; //开启计数中断,测速用
while(1)
{ if(a>=150)
a=150;
if(a<=10)
a=10;
P1_1=0; //关闭电动机,脉冲输出
delay(160-a);
P1_1=1; //开启电动机
delay(a);
key=GeyKey();
if(key == '0')
{
a=15+5;
sprintf(dsp,"%3d",a-5);
dprintf(48,102,dsp);
dprintf(88,102,"r/min");
}else
if(key == '1')
{
a=30;
sprintf(dsp,"%3d",a);
dprintf(48,102,dsp);
dprintf(88,102,"r/min");
}else
if(key == '2')
{
a=45;
sprintf(dsp,"%3d",a);
dprintf(48,102,dsp);
dprintf(88,102,"r/min");
}else
if(key == '3')
{
a=60-5;
sprintf(dsp,"%3d",a+5);
dprintf(48,102,dsp);
dprintf(88,102,"r/min");
}else
if(key == '4')
{
a=75-10;
sprintf(dsp,"%3d",a+10);
dprintf(48,102,dsp);
dprintf(88,102,"r/min");
}else
if(key == '5')
{
a=90-10;
sprintf(dsp,"%3d",a+10);
dprintf(48,102,dsp);
dprintf(88,102,"r/min");
}else
if(key == '6')
{
a=105-7;
sprintf(dsp,"%3d",a+7);
dprintf(48,102,dsp);
dprintf(88,102,"r/min");
}else
if(key == '7')
{
a=120-8;
sprintf(dsp,"%3d",a+8);
dprintf(48,102,dsp);
dprintf(88,102,"r/min");
}else
if(key == '8')
{
a=135-5;
sprintf(dsp,"%3d",a+5);
dprintf(48,102,dsp);
dprintf(88,102,"r/min");
}else
if(key == '9')
{
a=150;
sprintf(dsp,"%3d",a);
dprintf(48,102,dsp);
dprintf(88,102,"r/min");
}else
if(key=='-')
{
a-=n;
dprintf(48,102," ");
}
else
if(key=='+')
{
a+=n;
dprintf(48,102," ");
}
else
if(key=='=')
{ P1_0=1; //调整为顺时针
dprintf(48,90,"顺时针");//
}
else
if(key=='c') //调整为逆时针
{ P1_0=0;·
dprintf(48,90,"逆时针");
}
else
if(key=='*')
{ P1_1=0;
break;
}
else
if(key!=0) //此处跳出循环回到主程序
break;
}
EA=0;
}