当前位置:
文档之家› 基于AT89S52单片机的电机控制C语言程序设计
基于AT89S52单片机的电机控制C语言程序设计
二、霍尔元件
霍尔传感器是对磁敏感的传感元件,常用于开关信号采集的有CS3020、CS3040等,这种传感器是一个3端器件,外形与三极管相似,只要接上电源、地,即可工作,输出通常是集电极开路(OC)门输出,工作电压范围宽,使用非常方便。如图1所示是CS3020的外形图,将有字面对准自己,三根引脚从左向右分别是Vcc,地,输出。
这次一周的实习让我学到了很多书本上学不到的东西,无论我们做什么事都要先考虑好,然后再付诸实践,还有就是细节决定成败,我之所以前面一直没有调试出来就是栽在这些个细节上。
最后衷心感谢老师的耐心指导和同学们的热情帮助!!!
第八
IN2=1;
num=1;
}
break;
case 1:
{ //反转
IN1=1;
IN2=0;
num=0;
}
break;
}
}
第
第七
元件型号
数量
AT89S52
1
带锁开关
1
晶振11.0592M
1
霍尔元件CS3020
1
L298N
1
IN4148
1
IN4007
12
电阻
1k
1
4k7
1
排阻
300-4
1
2k2-4
1
10k8
{uint n;
while(m--)
{for(n=0;n<25;n++)
{ ;}
}
}
void timer0()interrupt 1 //T0定时器中断
{TH0=(65536-1000)/256;
TL0=(65536-1000)%256; //重装T0
N++;
n=N%10;
if(n<high) //PWM波形生成
sbit ENA=P1^2;
sbit K1=P3^0; //正转
sbit K2=P3^1; //反转
sbit K3=P3^2; //加速
sbit K4=P3^3; //减速
sbit STCP=P2^0;
sbit SHCP=P2^1;
sbit DS=P2^2;
uchar code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xA4,0x8E}; //程序存储区定义字型码表
{CY=0;
shuru(tab[high%10]);
shuru(tab[high%100/10]);
shuru(tab[high/100]);
if(num==1)
{shuru(tab[10]);
}
else
{shuru(tab[11]);
}
shuchu();
delay(100);
}
void testkey() //按键扫描程序
第一章:设计任务
任务:了解电机的转动原理,能够对直流电机进行简单的控制;能够设计和使用简单的自动化闭环系统;提高多模块硬软件的综合应用能力。
功能主要包括:
1)直流电机的正转;
2)直流电机的反转;
3)直流电机的加速;
4)直流电机的减速;
5)直流电机的停止;
6)直流电机的转速在数码管上显示;
第二章:总体设计方案
uint N=0;
uint high=5;
extern uint num=1;
extern uint n;
extern uint e=0;
void xianshi() ; //数码管显示
void testkey(); //键盘扫描
voidchuli(); //正反转处理
void main()
{ENA=1;
{if(K1==1) //正转
{delay(1);
if(K1==1)
{e=0;
chuli();
}
while(K1);
}
else if(K2==1) //反转
{
delay(1);
if(K2==1)
if(e==0)
{e=1;
chuli();
}
while(K2);
}
else if(K3==1) //加速
{delay(1);
CS3020外形图
使用霍尔传感器获得脉冲信号,其机械结构也可以做得较为简单,只要在转轴的圆周上粘上一粒磁钢,让霍尔开关靠近磁钢,就有信号输出,转轴旋转时,就会不断地产生脉冲信号输出。如果在圆周上粘上多粒磁钢,可以实现旋转一周,获得多个脉冲输出。在粘磁钢时要注意,霍尔传感器对磁场方向敏感,粘之前可以先手动接近一下传感器,如果没有信号输出,可以换一个方向再试。这种传感器不怕灰尘、油污,在工业现场应用广泛。
总体设计方案的硬件部分详细框图如下图所示:
第三章系统
一、电机驱动芯片L298N
L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。
特点:
1、具有信号指示;
2、转速可调;
3、抗干扰能力强;
4、具有过电压和过电流保护;
5、可单独控制两台直流电机;
6、可单独控制一台步进电机;
7、PWM脉宽平滑调速;
8、可实现正反转;
9、采用光电隔离
L298N的输入输出逻辑关系表
ENA(B)
IN1(IN3)
IN2(IN4)
电机
H
H
L
正转
H
L
H
反转
H
IN1(IN3)与IN2(IN4)电平相同
1
电容
30p
2
104
2
22uf
1
100uf
2
静态数码管SM4105
4
74HC595
4
独立按键
4ቤተ መጻሕፍቲ ባይዱ
下载口ISP-PORT
1
第八
虽然本次课程设计只有一个星期的时间,但是我之前就已经开始设计程序了,只是一直没啥进展。我也成了倒数几个没做完的一员,其实心里一直有压力,可是有时候总是力气没花到点子上,事倍功半,主要一个原因就是,我在构建整个程序框架的时候没有一个清晰的认识,结果总是达不到自己所要求的目标。这最后一天,我找了两位同学帮我一起检查程序,结果是,我的主体程序没啥问题,问题就是小小的一些细节上,比如中断打开的顺序等。
快速停止
L
X
X
停止
电机转速的控制主要是运用PWM波形输出实现。由逻辑关系表可知,我们可以用PWM波形控制ENA(B)端或者是IN1(IN3)和IN2(IN4)。
以ENA端控制为例,当输出为高电平时电机转动,输出为低电平时电机停止。由此我们可以改变高低电平的占空比,进而实现电机转速的调整。
注意:高电平和低电平的时间不能太长,否则电机不能够持续转动,启动时高电平时间也不能太短,否则电机启动较慢。
TMOD=0x01; //T0方式1定时
TH0=(65536-1000)/256;
TL0=(65536-1000)%256; //周期1ms
ET0=1; //允许T0定时器中断
EA=1; //开启总中断
TR0=1; //启动定时器T0
while(1)
{testkey();
xianshi();
}
}
void delay (uint m) //延时函数
{ENA=1;
}
else
{ENA=0;
}
if(N==10)
{N=0;
}
}
void shuchu()
{STCP=0;
STCP=1;
; }
void shuru(uchar a)
{uchar i;
for(i=8;i>0;i--)
{SHCP=0;a<<=1;
DS=CY;
SHCP=1;
}
}
void xianshi() //速度显示子程序
三、数码管显示模块:
数码管显示模块采用的是静态数码管。
第四
Y
N
第五
#include<reg51.h>#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit IN1=P1^0;
sbit IN2=P1^1;
if(K3==1)
{if(high<10)
{high++;
}
}
while(K3);
}
else if(K4==1) //减速
{delay(1);
if(K4==1)
{if(high>0)
{high--;
}
}
while(K4);
}
}
void chuli()
{switch(e)
{case 0:
{IN1=0; //正转