毕设求助,51单片机控制57步进电机问题

wulahaha 2019-04-09 03:41:39
很多程序上疑问,不知道怎么控制
...全文
680 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wulahaha 2019-04-21
  • 打赏
  • 举报
回复
原来是共阴极接法不行,单片机引脚高电平输出不了5V,我采用共阳极就可以了
WWQ0925 2019-04-21
  • 打赏
  • 举报
回复
有驱动器的话直接给驱动发脉冲就好了。
进的咸鱼 2019-04-18
  • 打赏
  • 举报
回复

用示波器看频率,你就改你程序里面那个timer1的变量的上限,就可以改变频率了。
wulahaha 2019-04-18
  • 打赏
  • 举报
回复
引用 9 楼 臭咸鱼想翻身的回复:
先看一下接线对不对,是不是频率太低了?
频率怎么调,不懂怎么看频率
进的咸鱼 2019-04-10
  • 打赏
  • 举报
回复
还有你这个是步进电机,调速是用频率调速的,不是用占空比调速的,个人觉得还是把占空比搞成50%
进的咸鱼 2019-04-10
  • 打赏
  • 举报
回复
先看一下接线对不对,是不是频率太低了?
Method.Jiao 2019-04-09
  • 打赏
  • 举报
回复
你既然还在学校的话,实验室应该有示波器吧,先看下脉冲信号对不对,一步一步排查问题
Method.Jiao 2019-04-09
  • 打赏
  • 举报
回复
查完接线没问题,你可以试改下main方法,用delay控制
 while(1)
 {
  P12=0;
  delay(这个值自己准确计算一下,不要太小,参照单片机晶振频率机器周期换算成具体数值(多年不搞这个我也记不得怎么算了)。真不会算自己随便设成1000,200,10000,10……多试点也行);
  P12=1;
  delay(同上值);

 }
这东西应该是很好驱动的,主要现在不知道你什么环节出了问题。
Method.Jiao 2019-04-09
  • 打赏
  • 举报
回复
引用 4 楼 wulahaha 的回复:
#include <reg52.h> unsigned char timer1; sbit DIR=P1^0; //位定义DIR为P1.0口 sbit ENA=P1^1; //位定义ENA为P1.1口 sbit PWM=P1^2; //位定义PWM为P1.2口 void system_Ini() { TMOD|= 0x11; TH1 = 0xfe; //11.0592MHz 0.5ms定时 TL1 = 0x33; TR1 = 1; //启动T1定时 IE =0x8A; //开T0,T1中断,开总中断 } main() { system_Ini(); //调用子函数,初始化定时器T1 while(1) { if(timer1>100) { timer1=0; //输出占空比0.7的PWM脉冲 } if(timer1<30) { PWM=0; } else { PWM=1; } } void T1zd(void) interrupt 3 { TH1 = 0xfe; //11.0592 初始化定时器 TL1 = 0x33; timer1++; //计数+1 }
我也多年不写了,程序大体看着没什么问题哦。我刚查了下DM542的说明书,你单片机输出是低电平有效吧,51拉不起高电平电流,控制器端的使能ENA端子,脉冲端子PUL,方向端子DIR,有没有正确接线?电机的A+A-B+B-接线确定无误?图片上看你的接线不知道对不对。
wulahaha 2019-04-09
  • 打赏
  • 举报
回复
引用 3 楼 Method.Jiao的回复:
应该也行得通,你现在的输出端能打出完整的脉冲信号么,还是说你不知道应该怎么输出脉冲信号。
你看下,那个程序,为什么都不会转的
wulahaha 2019-04-09
  • 打赏
  • 举报
回复 1
#include <reg52.h> unsigned char timer1; sbit DIR=P1^0; //位定义DIR为P1.0口 sbit ENA=P1^1; //位定义ENA为P1.1口 sbit PWM=P1^2; //位定义PWM为P1.2口 void system_Ini() { TMOD|= 0x11; TH1 = 0xfe; //11.0592MHz 0.5ms定时 TL1 = 0x33; TR1 = 1; //启动T1定时 IE =0x8A; //开T0,T1中断,开总中断 } main() { system_Ini(); //调用子函数,初始化定时器T1 while(1) { if(timer1>100) { timer1=0; //输出占空比0.7的PWM脉冲 } if(timer1<30) { PWM=0; } else { PWM=1; } } void T1zd(void) interrupt 3 { TH1 = 0xfe; //11.0592 初始化定时器 TL1 = 0x33; timer1++; //计数+1 }
Method.Jiao 2019-04-09
  • 打赏
  • 举报
回复
应该也行得通,你现在的输出端能打出完整的脉冲信号么,还是说你不知道应该怎么输出脉冲信号。
wulahaha 2019-04-09
  • 打赏
  • 举报
回复
引用 1 楼 Method.Jiao的回复:
二相四线电机,用一个L298N作驱动,看你需要什么精度,确定四拍制还是八拍制,然后按步序表编写程序,就IO口赋值,delay延时,然后一直循环就行,其他操作可能得用到中断。或者网上下也行,51的步进驱动程序应该有很多
我用的是DM542这种驱动器,该怎么写呢,应该不用四拍或者八拍这种吧,我想的是用定时器输出脉冲型号这种方式
Method.Jiao 2019-04-09
  • 打赏
  • 举报
回复
二相四线电机,用一个L298N作驱动,看你需要什么精度,确定四拍制还是八拍制,然后按步序表编写程序,就IO口赋值,delay延时,然后一直循环就行,其他操作可能得用到中断。或者网上下也行,51的步进驱动程序应该有很多

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧