Proteus对直流电机的控制

该博客介绍了如何使用AT89C52L293D微控制器通过定时器来精确调整直流电机的占空比,从而实现电机速度的控制。作者首先展示了基本的延时改变占空比的实现方式,然后优化为通过定时器中断来动态调整占空比,以减少计算误差。最终,通过预计算高电平和低电平的值并存储在数组中,进一步提高了控制的精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

总结源代码:

AT89C52 L293D motor_DC(直流电机)

最大值:-192 +192

 通过延时改变占空比,或者通过定时器实现:

#include <reg52.h>
#define uint unsigned int
sbit IN0=P2^0;
sbit IN1=P2^1;
sbit E=P2^2;
 
void delay(uint n)
{
	uint i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}
//总192 占空比50%  96 96 
//占空比25%     高电平delay25   75;最大达到48
void motor()
{
	IN0=0;//1 0正转  0 1 反转
//	IN1=1;
//	delay(50);
//	IN1=0;
//	delay(50);
	E=1;
}
void inittimer()
{
	TMOD=0X01;//选中定时器16位模式
	TH0=(65536-10000)/256;//10ms
	TL0=(65536-10000)%256;
	ET0=1;//打开定时器中断
	EA=1;//开启总中断
	TR0=1;//开启定时器0
	IN1=0;//赋一个初值
}

void main()
{
	inittimer();
	while(1)
	{
		motor();
	}
}
//每隔10ms进一次中断
void timer_isr() interrupt 1
{
	TH0=(65536-10000)/256;//10ms
	TL0=(65536-10000)%256;	
	IN1=~IN1;//方波
}




#include <reg52.h>
#define uint unsigned int
	
sbit IN0=P2^0;
sbit IN1=P2^1;
sbit   E=P2^2;
//占空比为20%的波形
uint value[]={2000,8000};
uint count=0;
void delay(uint n)
{
	uint i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}
//总192 占空比50%  96 96 
//占空比25%     高电平delay25   75;最大达到48
void motor()
{
	IN0=0;//1 0正转  0 1 反转
//	IN1=1;
//	delay(50);
//	IN1=0;
//	delay(50);
	E=1;
}

//假设占空比是1/5 周期10ms
//高电平2000 低电平8000
void inittimer()
{
	TMOD=0X01;//选中定时器16位模式
	TH0=(65536-8000)/256;//10ms
	TL0=(65536-8000)%256;
	ET0=1;//打开定时器中断
	EA=1;//开启总中断
	TR0=1;//开启定时器0
	IN1=0;//赋一个初值
}

void main()
{
	inittimer();
	while(1)
	{
		motor();
	}
}
//每隔10ms进一次中断
void timer_isr() interrupt 1
{
	TH0=(65536-value[count])/256;//10ms
	TL0=(65536-value[count])%256;	
	IN1=~IN1;//方波
	count++;
	if(count==2)//保证占空比是20%
	{
		count=0;
	}
}




 误差:

 原因:

 解决:

手动把2000  8000算出来,减少计算量。65536-2000 = F830    65536-8000 = E0C0

 

 确实减小误差了。

总结源代码:

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IN0=P2^0;
sbit IN1=P2^1;
sbit   E=P2^2;
//占空比为20%的波形
uchar valueh[]={0xf8,0xe0};
uchar valuel[]={0x30,0xc0};
uint count=0;
void delay(uint n)
{
	uint i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
}
//总192 占空比50%  96 96 
//占空比25%     高电平delay25   75;最大达到48
void motor()
{
	IN0=0;//1 0正转  0 1 反转
//	IN1=1;
//	delay(50);
//	IN1=0;
//	delay(50);
	E=1;
}

//假设占空比是1/5 周期10ms
//高电平2000 低电平8000
void inittimer()
{
	TMOD=0X01;//选中定时器16位模式
	TH0=(65536-8000)/256;//10ms
	TL0=(65536-8000)%256;
	ET0=1;//打开定时器中断
	EA=1;//开启总中断
	TR0=1;//开启定时器0
	IN1=0;//赋一个初值
}

void main()
{
	inittimer();
	while(1)
	{
		motor();
	}
}
//每隔10ms进一次中断
void timer_isr() interrupt 1
{
	TH0=valueh[count];//(65536-value[count])/256;//10ms
	TL0=valuel[count];//(65536-value[count])%256;	
	IN1=~IN1;//方波
	count++;
	if(count==2)//保证占空比是20%
	{
		count=0;
	}
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值