通过与单片机相连的按键控制直流电机停启的电路如下图所示,通过P3.6口按键触发启动直流电机,P3.7口的按键触发停止直流电机的运行。由图可知,当P1.0输出高电平“1”时,NPN型三极管导通,直流电机得电转动;当P1.0输出低电平“0”时,NPN型三极管截止,直流电机停止转动。
扩展资料:
通过单片机产生PWM波控制直流电机程序
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[10]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管显示码(0-9)
sbitxiaoshudian=P0^7;
sbitwei1=P2^4;//数码管位选定义
sbitwei2=P2^5;
sbitwei3=P2^6;
sbitwei4=P2^7;
sbitbeep=P2^3;//蜂鸣器控制端
sbitmotor=P1^0;//电机控制
sbits1_jiasu=P1^4;//加速按键
sbits2_jiansu=P1^5;//减速按键
sbits3_jiting=P1^6;//停止/开始按键
uintpulse_count;//INT0接收到的脉冲数
uintnum=0;//num相当于占空比调节的精度
ucharspeed[3];//四位速度值存储
floatbianhuasudu;//当前速度(理论计算值)
floatreallyspeed;//实际测得的速度
floatvv_min=0.0;vv_max=250.0;
floatvi_Ref=60.0;//给定值
floatvi_PreError,vi_PreDerror;
uintpwm=100;//相当于占空比标志变量
intsample_time=0;//采样标志
floatv_kp=1.2,v_ki=0.6,v_kd=0.2;//比例,积分,微分常数
voiddelay(uintz)
{
uintx,y;
for(x=z;x0;x--)
for(y=20;y0;y--);
}
voidtime_init()
{
ET1=1;//允许定时器T1中断
ET0=1;//允许定时器T0中断
TMOD=0x15;//定时器0计数,模式1;定时器1定时,模式1
TH1=(65536-100)/256;//定时器1值,负责PID中断,0.1ms定时
TL1=(65536-100)%6;
TR0=1;//开定时器
TR1=1;
IP=0X08;//定时器1为高优级
EA=1;//开总中断
}
voidkeyscan()
{
floatj;
if(s1_jiasu==0)//加速
{
delay(20);
if(s1_jiasu==0)
vi_Ref+=10;
j=vi_Ref;
}
while(s1_jiasu==0);
if(s2_jiansu==0)//减速
{
delay(20);
if(s2_jiansu==0)
vi_Ref-=10;
j=vi_Ref;
}
while(s2_jiansu==0);
if(s3_jiting==0)
{
delay(20);
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
while(s3_jiting==0);
}
floatv_PIDCalc(floatvi_Ref,floatvi_SpeedBack)
{
registerfloaterror1,d_error,dd_error;
error1=vi_Ref-vi_SpeedBack;//偏差的计算
d_error=error1-vi_PreError;//误差的偏差
dd_error=d_error-vi_PreDerror;//误差变化率
vi_PreError=error1;//存储当前偏差
vi_PreDerror=d_error;
bianhuasudu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);
return(bianhuasudu);
}
voidv_Display()
{
uintsudu;
sudu=(int)(reallyspeed*10);//乘以10之后强制转化成整型
speed[3]=sudu/1000;//百位
speed[2]=(sudu00)/100;//十位
speed[1]=(sudu0)/10;//个位
speed[0]=sudu;//小数点后一位
wei1=0;//第一位打开
P0=table[speed[3]];
delay(5);
wei1=1;//第一位关闭
wei2=0;
P0=table[speed[2]];
delay(5);
wei2=1;
wei3=0;
P0=table[speed[1]];
xiaoshudian=1;
delay(5);
wei3=1;
wei4=0;
P0=table[speed[0]];
delay(5);
wei4=1;
}
voidBEEP()
{
if((reallyspeed)=vi_Ref+5||(reallyspeed
{
beep=~beep;
delay(4);
}
}
voidmain()
{
time_init();
motor=0;
while(1)
{
v_Display();
BEEP();
}
if(s3_jiting==0)//对按键3进行扫描,增强急停效果
{
delay(20);
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
while(s3_jiting==0);
}
voidtimer0()interrupt1
{
}
voidtimer1()interrupt3
{
TH1=(65536-100)/256;//1ms定时
TL1=(65536-100)%6;
sample_time++;
if(sample_time==5000)//采样时间0.1ms*5000=0.5s
{
TR0=0;//关闭定时器0
sample_time=0;
pulse_count=TH0*255+TL0;//保存当前脉冲数
keyscan();//扫描按键
reallyspeed=pulse_count/(4*0.6);//计算速度
pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);
if(pwm
if(pwm100)pwm=100;
TH0=TL0=0;
TR0=1;//开启定时器0
}
num++;
if(num==pwm)//此处的num值,就是占空比
{
motor=0;
}
if(num==100)//100相当于占空比调节的精度
{
num=0;
motor=1;
}
}
#includereg52.h
#include"delay.h"
#define uchar unsigned char
#define uint unsigned int
//*********************//
sbit ENA = P2^2; //驱动芯片使能,若为0则电机停止;
sbit IN1 = P2^1; //控制电机正转和反转
sbit IN2 = P2^0; //控制电机正转和反转
sbit key1 = P1^0; //此键按下,电机正转;IN1=1;IN2=0 ;ENA=1
sbit key2 = P1^1; //此键按下,电机反转;IN1=0,IN2=1 ;ENA=1
sbit key3 = P1^2; //此键按下,电机刹停; IN1=1,IN2=1 ;ENA=1
//*********************//
int motor_change_mank=0;
// 按键设置
//**********************//
uint keylogo()
{
if(key1==0)
{
delayms(2) ;
//while(key1==0);
motor_change_mank=1;//正转标志位
}
if(key2==0)
{
delayms(2) ;
//while(key2==0);
motor_change_mank=2;//反转标志位
}
if(key3==0)
{
delayms(2) ;
//while(key3==0);
motor_change_mank=0;//刹停标志位
}
return(motor_change_mank);
}
//**********************//
//控制驱动芯片函数
//**********************//
void execute_motor()
{
switch(motor_change_mank)
{
case 0: //刹停标志位
{
IN1 = 1;
IN2 = 1;
ENA = 1;
}break;
case 1: //正转标志位
{
IN1 = 1;
IN2 = 0;
ENA = 1;
}break;
case 2: //反转标志位
{
IN1 = 0;
IN2 = 1;
ENA = 1;
}break;
default:break;
}
}
//**********************//
void main()
{
while(1)
{
keylogo();
execute_motor();
}
}
/**********************************************************************/
/**********************************************************************/
#define uint unsigned int
void delayms(uint n)
{
int i;
for(;n0;n--)
for(i=0;i1;i++);
}
/**********************************************************************/
/**********************************************************************/
#ifndef delay_h
#define delay_h
#define uint unsigned int
extern void delayms(uint n);
#endif
51单片机驱动直流电机程序(用的是l298n芯片):
#includereg51.h
#includemath.h
#defineuintunsignedint
#defineucharunsignedchar
#defineN100
sbit s1=P1^0;//电机驱动口
sbits2=P1^1;//电机驱动口
sbits3=P1^2;//电机驱动口
sbits4=P1^3;//电机驱动口
sbiten1=P1^4;//电机使能端
sbiten2=P1^5;//电机使能端
sbitLSEN=P2^0;//光电对管最左
sbitLSEN1=P2^1;//光电对管左1
sbitLSEN2=P2^2;//光电对管左2
sbitRSEN1=P2^3;//光电对管右1
sbitRSEN2=P2^4;//光电对管右2
sbitRSEN=P2^5;//光电对管最右
uintpwm1=0,pwm2=0,t=0;
voiddelay(uintxms)
{
uinta;
while(--xms)
{
for(a=123;a0;a--);
}
}
voidmotor(ucharspeed1,ucharspeed2)
{
if(speed1=-100speed1=100)
{
pwm1=abs(speed1);
if(speed10)
{
s1=1;
s2=0;
}
if(speed1==0)
{
s1=1;
s2=1;
}
if(speed10)
{
s1=0;
s2=1;
}
}
if(speed2=-100speed2=100)
{
pwm2=abs(speed2);
if(speed20)
{
s3=1;
s4=0;
}
if(speed2==0)
{
s3=1;
s4=1;
}
if(speed20)
{
s3=0;
s4=1;
}
}
}
voidgo_forward(uintspeed)
{
s1=1;
s2=0;
s3=1;
s4=0;
pwm1=speed;
pwm2=speed;
}
voidgo_back(uintspeed)
{
s1=0;
s2=1;
s3=0;
s4=1;
pwm1=speed;
pwm2=speed;
}
voidstop()
{
s1=1;
s2=1;
s3=1;
s4=1;
pwm1=0;
pwm2=0;
}
voidturn_right(uintP1,uintP2)//右转函数
{
s1=1;
s2=0;
s3=0;
s4=1;
pwm1=P1;
pwm2=P2;
}
voidturn_left(uintP1,uintP2)//左转函数
{
s1=0;
s2=1;
s3=1;
s4=0;
pwm1=P1;
pwm2=P2;
}
voidtracking()
{
if((LSEN1==0)(LSEN2==0)(RSEN1==0)(RSEN2==0))//没有检测到
{
go_forward(100);
}
if((LSEN1==1)(LSEN2==0)(RSEN1==0)(RSEN2==0))//左一检测到
{
turn_left(40,80);//左转右轮》左轮
delay(N);
}
if((LSEN1==0)(LSEN2==1)(RSEN1==0)(RSEN2==0))//左二检测到
{
turn_left(40,60);//左转右轮》左轮
delay(N);
}
if((LSEN1==0)(LSEN2==0)(RSEN1==1)(RSEN2==0))//右一检测到
{
turn_right(60,4);//右转左轮》右轮
delay(N);
}
if((LSEN1==0)(LSEN2==0)(RSEN1==0)(RSEN2==1))//右二检测到
{
turn_right(80,40);//右转左轮》右轮
delay(N);
}
if((LSEN1==1)(LSEN2==1))
{
turn_left(0,100);
delay(1000);
}
if((RSEN1==1)(RSEN2==1))
{
turn_right(100,0);
delay(1000);
}
}
voidavoidance()
{
}
voidinit()
{
TMOD=0x02;//timer0同时配置为模式2,8自动重装计数模式
TH0=156;//定时器初值设置100us中断
TL0=156;
ET0=1;
EA=1;
TR0=1;//开启总中断
}
voidmain()
{
init();
while(1)
{
tracking();
}
}
voidtimer0()interrupt1//电机驱动提供PWM信号
{
if(tpwm1)
en1=1;
else
en1=0;
if(tpwm2)
en2=1;
else
en2=0;
t++;
if(t100)
t=0;
}
扩展资料
L298N是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vTTL电平。一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作。
参考资料来源:百度百科-l298n
单片机直流电机实验程序的介绍到此就结束了,感谢您耐心阅读,谢谢。
本文标签:单片机直流电机实验程序