51单片机同时控制直流电机和步进电机
贴下程序如下,求大神补上,字数限制,一部分定义没写,用的是C51#include<reg52.h>#defineuintunsignedint#defineucharun...
贴下程序如下,求大神补上,字数限制,一部分定义没写,用的是C51
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char speed=5; //步进电机的转速
unsigned char code clockWise[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x0d}; //八拍方式驱动,顺序为A AB B BC C CD D DA
unsigned int a; //a即想要转的圈数
unsigned char b;
unsigned int c;
uchar time;
void DC_motor_run() //普通的5V小直流电机
{
IN1=1;
IN2=0;
TMOD=0x01;//定时器0工作方式1
TH0=0xff;//(65536-10)/256;//赋初值定时
TL0=0xf7;//(65536-10)%256;//0.01ms
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1)
{
;
}
}
void tim0() interrupt 1
{
TR0=0;//赋初值时,关闭定时器
TH0=0xff;//(65536-10)/256;//赋初值定时
TL0=0xf7;//(65536-10)%256;//0.01ms
TR0=1;//打开定时器
time++;
if(time>=100) time=0;//1khz
if(time<=70) PWM=0;//占空比%30
else PWM=1;
}
void delay(unsigned char z) //电机延时程序
{
unsigned char x,y;
for(x=0;x<z;x++)
for(y=0;y<80;y++);
}
void step_motor1_clockwise(a) //步进电机1顺时针旋转
{
for (c=0; c<8*64*a; c++)
{
for (b=0; b<8; b++)
{
P1=clockWise[b];
delay(speed);
}
}
}
void step_motor1_counterclockwise(a) //步进电机1逆时针旋转
{
for (c=0; c<8*64*a; c++) //用的是28BYJ-48步进电机
{
for (b=0; b<8; b++)
{
P1=clockWise[8-b];
delay(speed);
}
}
}
void main()
{
; //大神帮忙写下主程序,实现功能为一开始step_motor1正向旋转3周,同时DC_motor开始转动;正转三周完成后step_motor1开始反转三周,这段时间内DC_motor保持转动,反转完成后DC_motor也同时停止。小白实在是不会,自己写的程序试了很久,都是DC_motor一直在转动,step_motor1动都不动。求解救。
} 展开
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char speed=5; //步进电机的转速
unsigned char code clockWise[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x0d}; //八拍方式驱动,顺序为A AB B BC C CD D DA
unsigned int a; //a即想要转的圈数
unsigned char b;
unsigned int c;
uchar time;
void DC_motor_run() //普通的5V小直流电机
{
IN1=1;
IN2=0;
TMOD=0x01;//定时器0工作方式1
TH0=0xff;//(65536-10)/256;//赋初值定时
TL0=0xf7;//(65536-10)%256;//0.01ms
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1)
{
;
}
}
void tim0() interrupt 1
{
TR0=0;//赋初值时,关闭定时器
TH0=0xff;//(65536-10)/256;//赋初值定时
TL0=0xf7;//(65536-10)%256;//0.01ms
TR0=1;//打开定时器
time++;
if(time>=100) time=0;//1khz
if(time<=70) PWM=0;//占空比%30
else PWM=1;
}
void delay(unsigned char z) //电机延时程序
{
unsigned char x,y;
for(x=0;x<z;x++)
for(y=0;y<80;y++);
}
void step_motor1_clockwise(a) //步进电机1顺时针旋转
{
for (c=0; c<8*64*a; c++)
{
for (b=0; b<8; b++)
{
P1=clockWise[b];
delay(speed);
}
}
}
void step_motor1_counterclockwise(a) //步进电机1逆时针旋转
{
for (c=0; c<8*64*a; c++) //用的是28BYJ-48步进电机
{
for (b=0; b<8; b++)
{
P1=clockWise[8-b];
delay(speed);
}
}
}
void main()
{
; //大神帮忙写下主程序,实现功能为一开始step_motor1正向旋转3周,同时DC_motor开始转动;正转三周完成后step_motor1开始反转三周,这段时间内DC_motor保持转动,反转完成后DC_motor也同时停止。小白实在是不会,自己写的程序试了很久,都是DC_motor一直在转动,step_motor1动都不动。求解救。
} 展开
5个回答
展开全部
首先纠正你的几个错误:
1、clockWise[] 最后一拍错了吧,0x0d 改成 0x09 才对;
2、DC_motor_run() 里面的while(1){;} 去掉,否则步进电机怎么转;
3、step_motor1_counterclockwise() 中的 P1=clockWise[8-b]; 改成 P1=clockWise[7-b]; 才对,否则会出现下标越界的问题,因为b的取值是0-7,[8-b]就不对了;
主函数很简单:
void main()
{
a = 3; // a 即想要转的圈数
DC_motor_run();
step_motor1_clockwise(a); //步进电机1顺时针旋转
step_motor1_counterclockwise(a); //步进电机1逆时针旋转
TR0 = 0; // 关闭定时器
PWM = 0; // DC_motor 停止
}
这样应该就可以了,具体步进电机的转动圈数你根据实际调试结果修改里面的延时就可以了。
如有问题,欢迎继续提问。
德晟智能
2024-09-04 广告
2024-09-04 广告
舵机伺服电机是一种在自动控制系统中广泛应用的执行元件。它具有快速响应、精准定位的特点,能够将电压信号转化为转矩和转速,以驱动控制对象。在东莞市德晟智能科技有限公司的产品中,舵机伺服电机扮演着重要的角色,广泛应用于各种精密电子设备、交通运输工...
点击进入详情页
本回答由德晟智能提供
展开全部
其实一般步进电机使用ULN2003驱动的,直流电机一般用(H桥)L298N来驱动
如果你想方便一点L298N也能驱动步进电机
L298N有那种一个小板的电路跟第一个电路的区别就是没有电机,其它都有,你看着办吧!!
打字不易,如满意,望采纳。
如果你想方便一点L298N也能驱动步进电机
L298N有那种一个小板的电路跟第一个电路的区别就是没有电机,其它都有,你看着办吧!!
打字不易,如满意,望采纳。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-08-16
展开全部
通过PWM来控制占空比,从而控制电机的电压
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个能写成,但得调试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你什么时候用?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询