24小时热门版块排行榜    

查看: 1281  |  回复: 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键之后,步进电机的转速就变得极慢。我如果程序上不使用加、减变量改变延迟时间,而是直接赋一个其他的固定值的话是没有问题的。
请教大家造成步进电机运行变慢的原因是什么?怎么写程序能实现我原来的功能呢?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

stephenliu89

银虫 (小有名气)

加速和减速是通过控制电压来控制的么?我好久没玩单片机了
Email:stephenliu1989@163.com
3楼2010-09-15 14:01:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 3 个回答

magic7004

金虫 (职业作家)

★ ★ ★
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可能变成一个很大的正数,如果溢出的话,也可能变成负数。
流氓不可怕,可怕的是流氓有文化,有文化又BH的流氓无敌~~!
2楼2010-09-15 13:51:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 2019年青年基金涵评意见,大家看看几个A,几个B? +8 Tide man 2026-08-11 8/400 2026-08-12 17:30 by Vivilian
[基金申请] 好奇怪的filecode +5 布布和一二 2026-08-08 6/300 2026-08-12 16:11 by 云上清扬
[基金申请] 长年满屏的广告,版主太不责任了。基金也等的急 +4 gltch 2026-08-12 4/200 2026-08-12 16:08 by eulota
[基金申请] 应该是93bebmhtak前后十一个字符比较关键 +22 Lanmanbaby 2026-08-09 35/1750 2026-08-12 14:38 by sdfapple719
[基金申请] 奇怪,两个人的filecode固定段从头到尾一模一样 +7 布布和一二 2026-08-10 10/500 2026-08-12 09:12 by 布布和一二
[基金申请] 为什么网上很多人说本周 12号出结果 +6 瞬息宇宙 2026-08-10 7/350 2026-08-11 19:25 by Tide man
[基金申请] 什么时候出结果,有咨询渠道??? +3 Tide man 2026-08-11 3/150 2026-08-11 17:54 by kudofaye
[基金申请] 分享一下我之前已中青C的计划书的filecode +3 布布和一二 2026-08-11 4/200 2026-08-11 15:20 by aasahr
[基金申请] 听说今天filecode变了 +26 布布和一二 2026-08-06 49/2450 2026-08-11 13:18 by WH3796
[基金申请] 我的国基提前知道中了,可是同事的操作让我实在接受不了,怎么会有这样的人 +8 家与远方 2026-08-10 13/650 2026-08-11 09:49 by 家与远方
[基金申请] 关于代码变化问题,想知道的进来 +17 且听虎啸 2026-08-07 24/1200 2026-08-10 18:35 by zhangduo2008
[基金申请] 静等基金结果 +5 gjjjzhong 2026-08-10 16/800 2026-08-10 17:19 by Tide man
[基金申请] 这样的filecode谁见过 +11 布布和一二 2026-08-08 22/1100 2026-08-10 11:10 by wmfsnow
[基金申请] 面上项目filecode邪修 +5 西山十月 2026-08-09 7/350 2026-08-10 07:32 by 仁砚薪传
[基金申请] fileCode有新解读? +10 Tide man 2026-08-08 18/900 2026-08-09 12:55 by 仁砚薪传
[基金申请] 关于豆爷回答的JTJC与%2F数量 +5 yang182083 2026-08-06 7/350 2026-08-08 18:29 by zhanghaozhu
[基金申请] 国基金的申报应该改成非等额制,评价高的钱多评价低的钱少,但是增加资助率 +7 a089 2026-08-07 7/350 2026-08-08 18:05 by gltch
[基金申请] 关于filecode +4 布布和一二 2026-08-07 7/350 2026-08-07 22:55 by zhanghaozhu
[基金申请] 固定端突然变了,今天 +6 archvillain 2026-08-06 10/500 2026-08-07 16:03 by 医学老男孩
[基金申请] filecode +14 等待解的谜 2026-08-06 19/950 2026-08-07 12:20 by wlwhappy
信息提示
请填处理意见