标题:
关于51单片机驱动器驱动步进电机的问题,转动很慢而且发热
[打印本页]
作者:
一束光的旅程
时间:
2018-10-6 19:14
标题:
关于51单片机驱动器驱动步进电机的问题,转动很慢而且发热
现在做了一个装置,使用89c52单片机产生pwm脉冲给步进电机驱动器,然后驱动步进电机转动。现在出现两个问题,第一:电机转动很慢,而且起热。有震动,2-3秒转动一个齿。第二电机应该按照程序反转,电机却没有倒转。想请教大家是不是程序的频率太低(程序产生的频率是1khz)(怎么调整频率)。还是线路有问题。先上代码吧。
然后是线路图
捕获.PNG
(33.92 KB, 下载次数: 65)
下载附件
2018-10-6 19:14 上传
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED_R=P1^0; //红色指示灯
sbit LED_G=P1^2; //绿色指示灯
sbit LED_B=P1^1; //蓝色指示灯
sbit key_D=P3^6; //前进按钮
sbit key_R=P3^7; //后退按钮,目前不用
sbit PUL=P2^0; //脉冲口,连步进电机驱动器
sbit DIR=P2^1; //方向口,连步进电机驱动器
uchar time;
uchar count;
uchar temp;
uint t=0;
void Delay200us();
void Delay10ms();
void key_scan(); //按键程序
void main()
{
P1=0xff;
P2=0x00;
TMOD= 0x01;
TH0 = (65536-500)/256;
TL0 = (65536-500)%256;
EA=1;
ET0=1;
while(1)
{
key_scan();
}
}
//***********************************************************//
void Delay200us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 89;
while (--i);
}
//***************************************************************//
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}
void key_scan()
{
if(key_D==0)
{
Delay10ms();
if(key_D==0)
{
t++;
if(t>=4)
{
t=0;
}
switch(t)
{
case 1:TR0=0;LED_R=0;LED_G=1;LED_B=1;Delay200us();DIR=1;temp=100;TR0=1;break;//ǰ½ø1002½
case 2:TR0=0;LED_R=1;LED_G=0;LED_B=1;Delay200us();DIR=1;temp=200;TR0=1;break;//¼ìDøÇ°Æú2002½
case 3:TR0=0;LED_R=1;LED_G=1;LED_B=0;Delay200us();DIR=0;temp=300;TR0=1;break;//oóíË3002½¡£
default:break;
}
}
while(!key_D);
}
}
void Timer0Init(void) interrupt 1 using 1
{
TH0 = (65536-500)/256;
TL0 = (65536-500)%256;
time++;
if(time>=100)
{
time=0;
count++;
if(count>=temp)
{
TR0=0;
count=0;
LED_R=1;
LED_G=1;
LED_B=1;
PUL=0;
}
}
if(time<=50)
{
PUL=0;
}
else
{
PUL=1;
}
}
复制代码
步进推杆控制.zip
2018-10-6 19:14 上传
点击文件名下载附件
165.28 KB, 下载次数: 9
作者:
一束光的旅程
时间:
2018-10-6 19:19
刚刚发的程序注释变成乱码了,再传一边。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED_R=P1^0; //红色指示灯
sbit LED_G=P1^2; //绿色指示灯
sbit LED_B=P1^1; //蓝色指示灯
sbit key_D=P3^6; //前进按钮
sbit key_R=P3^7; //后退按钮,目前不用
sbit PUL=P2^0; //脉冲口,连步进电机驱动器
sbit DIR=P2^1; //方向口,连步进电机驱动器
uchar time;
uchar count;
uchar temp;
uint t=0;
void Delay200us();
void Delay10ms();
void key_scan(); //按键程序
void main()
{
P1=0xff;
P2=0x00;
TMOD= 0x01;
作者:
文凤轩
时间:
2018-10-6 21:46
1000Hz是频率太高了不是太低了
作者:
一束光的旅程
时间:
2018-10-7 15:11
今天试验了一下频率太低了。我把频率提高到4kHZ,步进电机驱动正常。
作者:
一束光的旅程
时间:
2018-10-7 15:16
试验了一下高频率4kHZ,驱动器可以正常工作。但是当给驱动器反向信号时,驱动器仍然正转。在原理图上模拟无问题。始终都是低电平。最后用单片机控制5V继电器进行高低电平的切换。(原来用三极管S8050)。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED_R=P1^0; //红色指示灯
sbit LED_G=P1^2; //绿色指示灯
sbit LED_B=P1^1; //蓝色指示灯
sbit key_D=P3^6; //前进按钮
sbit key_R=P3^7; //后退按钮,目前不用
sbit PUL=P2^0; //脉冲口,连步进电机驱动器
sbit DIR=P0^0; //方向口,连步进电机驱动器
uchar time;
uint count;
uint temp;
uint t=0;
void Delay200us();
void Delay10ms();
void key_scan(); //按键程序
void main()
{
P1=0xff;
TMOD &= 0xF0;
TH0 = 0xFF;
TL0 = 0X8D; //0xF7
EA=1;
ET0=1;
while(1)
{
key_scan();
}
}
//***********************************************************//
void Delay200us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 89;
while (--i);
}
//***************************************************************//
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 18;
j = 235;
do
{
while (--j);
} while (--i);
}
//*****当前进按钮按下一次,步进电机向前走100步,100走完停止,当按第二次继续向前走200步,走完停止。当按第三次,后退300步******//
void key_scan()
{
if(key_D==0)
{
Delay10ms();
if(key_D==0)
{
t++;
if(t>=4)
{
t=0;
}
switch(t)
{
case 1:DIR=0;TR0=0;LED_R=0;LED_G=1;LED_B=1;Delay200us();temp=10000;TR0=1;break;//前进100步
case 2:DIR=0;TR0=0;LED_R=1;LED_G=0;LED_B=1;Delay200us();temp=20000;TR0=1;break;//继续前期200步
case 3:DIR=1;TR0=0;LED_R=1;LED_G=1;LED_B=0;Delay200us();temp=30000;TR0=1;break;//后退300步。
default:break;
}
}
while(!key_D);
}
}
//*********************定时器0*******************************//
void Timer0Init(void) interrupt 1 using 1
{
TH0 = 0xFF;
TL0 = 0x8D; //100,,0xF7
time++;
if(time>=100)
{
time=0;
count++;
if(count>=temp)
{
TR0=0;
count=0;
LED_R=1;
LED_G=1;
LED_B=1;
PUL=0;
}
}
if(time<=10)
{
PUL=0;
}
else
{
PUL=1;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1