cc_maple 发表于 2013-1-5 21:48:16

用52单片机驱动电机,把while语句改成for语句,电机不转了

本帖最后由 cc_maple 于 2013-1-6 14:52 编辑

单片机是AT89S52,用单片机通过Pulse和Dir端口控制电机驱动器,然后电机驱动器再驱动2相57步进电机

刚开始的代码是这样的:void main()
{       
        DelayMs(100);
        DIR = 0;
        DelayMs(100);
        PUL = 1;

        while(1){       
                        PUL = 1;
                        delay_even_us(100);
                        PUL = 0;
                        delay_even_us(100);
        }
       
}DelayMs()delay_even_us()分别是延时函数,DIR, PUL为单片机P0口端口

然后改成这样:void main()
{       
        DelayMs(100);
        DIR = 0;
        DelayMs(100);
        PUL = 1;

        for(TimeCount = 0; TimeCount < 40000; TimeCount++){       
                        PUL = 1;
                        delay_even_us(100);
                        PUL = 0;
                        delay_even_us(100);
        }
       
}我的想法是让电机转一段时间就停止,就套用了循环,但是发现电机根本不会转,这个到底是什么原因啊?


完整的代码,主函数里使用的是while语句/*****************************
*Date:2012.12.9
*Function:电机信号控制,控制减速电机来回移动
*晶振:11.0596MHz
*****************************/

#include <intrins.h>
#include <reg52.h>

sbit        PUL = P1^0;
sbit         DIR = P1^1;

unsigned int    TimeCount = 0;

/*
*延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms               
*/
void DelayMs(unsigned int i)
{
        unsigned int j;
        while(i--)
        {
                for(j = 0; j < 125; j++);       
        }
}

/*
*延时函数, 精确延时偶数个us(是在晶振为12MHz的情况下)               
*/
void delay_even_us(unsigned char even)
{
        #pragma asm
                mov a, r7
                subb a,#10H
                mov       b,#02H
                divab
                movr0,a
                nop
        loop:
                djnz r0,loop
        #pragma endasm
}

void main()
{       
        DelayMs(100);
        DIR = 0;
        DelayMs(100);
        PUL = 1;

        while(1){       
                        PUL = 1;
                        delay_even_us(100);
                        PUL = 0;
                        delay_even_us(100);
        }       
}

____________________________________________________________________
PS:我用示波器看了下,发现单片机端口虽然输出低电平,但感觉低电平输出太低了,电机驱动器跟单片机的连接如下,PUL端跟单片机端口的电路这样子是否有问题啊,怎样子电平才够低啊
http://img.hb.aicdn.com/f5766ca8e24d1519196319112d4ed717ee90a961110e9-pLL2xc_fw554

dysxq 发表于 2013-1-5 21:51:30

TimeCount用long类型,int的话,在51里只有16位,最大值才32768

cc_maple 发表于 2013-1-5 21:53:13

dysxq 发表于 2013-1-5 21:51 static/image/common/back.gif
TimeCount用long类型,int的话,在51里只有16位,最大值才32768

我使用的是unsigned int的类型

tony_sgt 发表于 2013-1-5 23:23:26

void main()

{      

      DelayMs(100);

      DIR = 0;

      DelayMs(100);

      PUL = 1;



      for(TimeCount = 0; TimeCount < 40000; TimeCount++){      

                        PUL = 1;

                        delay_even_us(100);

                        PUL = 0;

                        delay_even_us(100);

      }

      while(1); //少了這個程序停不住...

}

dlmaowf 发表于 2013-1-6 10:25:54

楼上正解{:lol:}

cc_maple 发表于 2013-1-6 10:29:54

dlmaowf 发表于 2013-1-6 10:25 static/image/common/back.gif
楼上正解

为什么呢?我在后面加了while(1);这条语句,电机还是不会动

cc_maple 发表于 2013-1-6 10:37:15

是不是电机转起来需要一个加速的过程啊?

dlmaowf 发表于 2013-1-6 10:52:54

你的for循环是发40000个脉冲,你先尝试把延迟时间改的长一些,看看马达会不会运转

gaolf_2012 发表于 2013-1-6 12:00:08

黄金圣斗士级程序员
for(TimeCount = 0; TimeCount < 40000; TimeCount++){
改成
for(TimeCount = 0; TimeCount < 40000 || TimeCount >= 40000 ; TimeCount++){

cc_maple 发表于 2013-1-6 12:33:02

dlmaowf 发表于 2013-1-6 10:52 static/image/common/back.gif
你的for循环是发40000个脉冲,你先尝试把延迟时间改的长一些,看看马达会不会运转 ...

我把延时时间改长了也不行

dlmaowf 发表于 2013-1-6 12:42:49

{:sad:}这个问题,看程序也不难啊,你不会就这么一点程序吧,全部贴出来,让大家看看呢

cc_maple 发表于 2013-1-6 12:45:12

gaolf_2012 发表于 2013-1-6 12:00 static/image/common/back.gif
黄金圣斗士级程序员
for(TimeCount = 0; TimeCount < 40000; TimeCount++){
改成


这样不是相当于死循环吗?我的想法是想让电机转一段时间停下来啊

cc_maple 发表于 2013-1-6 12:54:09

dlmaowf 发表于 2013-1-6 12:42 static/image/common/back.gif
这个问题,看程序也不难啊,你不会就这么一点程序吧,全部贴出来,让大家看看呢 ...

贴出来了

xiaoyigechaos 发表于 2013-1-6 12:58:37

转完了for循环就转完了需要加一个死循环吧

dlmaowf 发表于 2013-1-6 13:04:21

没看懂那个us的延迟程序

cc_maple 发表于 2013-1-6 13:24:18

dlmaowf 发表于 2013-1-6 13:04 static/image/common/back.gif
没看懂那个us的延迟程序

那个延时程序是参考这里的的

jiaohaitao 发表于 2013-1-6 13:32:49

for外面几个while

cc_maple 发表于 2013-1-6 13:42:58

jiaohaitao 发表于 2013-1-6 13:32 static/image/common/back.gif
for外面几个while

for外面没有啊,在for语句外面添加while啊

wicy001 发表于 2013-1-6 14:21:35

4楼解决的是,电机转动停不下来。

电机为什么会不转呢? 楼主再检查一下硬件和接线,再改回while试试还行不?

lourrr 发表于 2013-1-6 16:16:04

timeCount改long型再延长一些试试
页: [1]
查看完整版本: 用52单片机驱动电机,把while语句改成for语句,电机不转了