| 查看: 999 | 回复: 2 | |||
liweicangz铁杆木虫 (小有名气)
|
[交流]
【求助】单片机控制步进电机时遇到的问题
|
|
大家好! 我是单片机的初学者。 最近想使用单片机控制步进电机的运行。 硬件上的结构是这样的:步进电机是4相电机,4根引线接到驱动板上,驱动板上的芯片是东芝的TA8435H,驱动板本身12V开关电源供电,驱动板还留了5个引脚,分别标记5V、GND、CK、CW、EN。我用的单片机是STC89C52RC,将单片机上的VCC与驱动板5V相连,GND相连,P0端口的P0.0、P0.1、P0.2三个引脚接CK、CW、EN。 我使用Keil软件编了一个控制的程序,是用C语言写的,具体内容为: /*----------------步进电机控制程序-----------------*/ #include #define uchar unsigned char #define uint unsigned int //定义引脚 sbit CW=P0^0; //正反转 sbit CLK=P0^1; //方波信号 sbit EN=P0^2; //使能,开关 /*------------------------------------------------ 函数声明 ------------------------------------------------*/ uchar keyscan(void);//键盘扫描 void delay(uint i); //延时程序 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main() { int delay_time1=500; int delay_time2=500; int det_time=25; uchar key; int i=0; while(1) { CW=0; CLK=0; EN=0;//电机参数赋初值 delay_time1=delay_time2; key=keyscan(); //调用键盘扫描, switch(key) { case 0x7e: while(1) { CW=0; //正转 CLK=~CLK; EN=~EN; delay(delay_time1); key=keyscan(); if(key==0x7b) { EN=0; break; }//停止 CLK=~CLK; EN=~EN; delay(delay_time1); key=keyscan(); if(key==0x7b) { EN=0; break; }//停止 } break; case 0x7d: while(1) { CW=1; //反转 CLK=~CLK; EN=~EN; delay(delay_time1); key=keyscan(); if(key==0x7b) { EN=0; break; }//停止 CLK=~CLK; EN=~EN; delay(delay_time1); key=keyscan(); if(key==0x7b) { EN=0; break; }//停止 } break; case 0x77:delay_time2=500;break;//获得一个基本速度值 case 0xbe:delay_time2=delay_time2-det_time;break;//加速,停止时起作用 case 0xbd:delay_time2=delay_time2+det_time;break;//减速,停止时起作用 default: break; } } } /*------------------------------------------------ 键盘扫描程序 ------------------------------------------------*/ uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法 { uchar cord_h,cord_l;//行列值中间变量 P3=0x0f; //行线输出全为0 cord_h=P3&0x0f; //读入列线值 if(cord_h!=0x0f) //先检测有无按键按下 { delay(100); //去抖 if(cord_h!=0x0f) { cord_h=P3&0x0f; //读入列线值 P3=cord_h|0xf0; //输出当前列线值 cord_l=P3&0xf0; //读入行线值 return(cord_h+cord_l);//键盘最后组合码值 } }return(0xff); //返回该值 } /*------------------------------------------------ 延时程序 ------------------------------------------------*/ void delay(uint i) //延时函数 { while(i--); } 以上是C程序,0x7e等对应单片机开发板上矩阵键盘上的按键0、 1、 2、 3、 4、 5,我编译之后没有错误,生成的HEX文件,烧写到单片机里。 原本的想法是0键按下正转连续运行,1键反转连续运行,2键停止,3键设置初始值,4键加速,5键减速。 实际的情况是,不使用4键、5键的情况下一切正常,符合预期。可是按过4键和5键之后,步进电机的转速就变得极慢。我如果程序上不使用加、减变量改变延迟时间,而是直接赋一个其他的固定值的话是没有问题的。 请教大家造成步进电机运行变慢的原因是什么?怎么写程序能实现我原来的功能呢? |
» 猜你喜欢
到新单位后,换了新的研究方向,没有团队,持续积累2区以上论文,能申请到面上吗
已经有13人回复
博士申请都是内定的吗?
已经有6人回复
之前让一硕士生水了7个发明专利,现在这7个获批发明专利的维护费可从哪儿支出哈?
已经有5人回复
博士读完未来一定会好吗
已经有29人回复
投稿精细化工
已经有4人回复
高职单位投计算机相关的北核或SCI四区期刊推荐,求支招!
已经有4人回复
导师想让我从独立一作变成了共一第一
已经有9人回复
读博
已经有4人回复
心脉受损
已经有5人回复
Springer期刊投稿求助
已经有4人回复
★ ★ ★
liweicangz(金币+20):非常感谢,问题已经解决! 2010-09-15 15:52:48
余泽成(金币+3):辛苦了! 2010-09-15 16:09:40
liweicangz(金币+20):非常感谢,问题已经解决! 2010-09-15 15:52:48
余泽成(金币+3):辛苦了! 2010-09-15 16:09:40
|
不是很懂单片机,不过楼主的程序看起来怪怪的。 有几个问题楼主能不能解释下? 1、CLK、CW和EN是做什么用的啊? 2、delay_time和转速有什么关系?是不是delay_time越大就转的越慢? 3、程序运行时对键盘的扫描时间是多少?也就是:delay(100) 是多长时间?当keyscan()=0xbe或0xbd时,main()函数中最外层的while循环,执行一次是多长时间? 下面是我的猜测: 如果delay_time越大就转的越慢,并且main函数中while循环的时间很短(也就是对键盘的扫描频率很高)的话,那可能就是溢出了。 main函数中的delay_time是int类型的,如果while循环的时间很短,那么按4键很短的时间case 0xbe就可能会执行很多遍,delay_time2就可能<0。比如程序20ms就扫描一次,按4键1s后放开,case 0xbe就被执行了50次,delay_time就变成了-750。 delay()函数的参数是uint型的,把delay_time当参数传给delay()时,会把delay_time由int型转换成uint型。如果delay_time<0,转换成uint型就是一个很大的数了(数值要看int的位数了,假设是16位,int的-750转换成uint就是64768了)。 同样道理,按5键的话,delay_time可能变成一个很大的正数,如果溢出的话,也可能变成负数。 |

2楼2010-09-15 13:51:33
stephenliu89
银虫 (小有名气)
- 应助: 3 (幼儿园)
- 金币: 448.7
- 散金: 13
- 红花: 3
- 帖子: 183
- 在线: 25.7小时
- 虫号: 953342
- 注册: 2010-02-06
- 性别: GG
- 专业: 理论和计算化学

3楼2010-09-15 14:01:27













回复此楼