搜索
bottom↓
回复: 23

简短的步进电机程序~ 看看有问题么?

[复制链接]

出0入0汤圆

发表于 2010-4-12 16:43:32 | 显示全部楼层 |阅读模式
#include<reg52.h>
sbit clk=P0^3;
sbit en=P0^1;
sbit fang=P0^5;
sbit P1_7=P1^7;

unsigned int sum;
void init()
{
  TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  EA=0;
  ET0=0;
  TR0=0;
  clk=0;
  fang=1;        //转动方向
  en=0;        //使能
  P1_7=0;         //74HC245传数据
}

main()
{
  init();
  while(1)
  {
    if(sum==600)
        {en=1;}
  }
}

void timer0() interrupt 1
{
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  clk=~clk;
  sum++;
}


用的是TA8435H驱动器~  单片机那3个接口通过74HC245连到CK1,CW/CCW,ENABLE接口~ 电机细分等设置均在硬件电路中设好(基本接了高电平)
这样就应该可以实现步进电机转动了吧?  可是没转起来。。
大家看看程序有问题吗? 如果没问题,那就是硬件问题了~~该怎么检查呢?
谢谢了

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2010-4-12 17:03:10 | 显示全部楼层
那个。。。TR0=0,EA=0,ET0=0都改成等于1了。。。。。

出0入0汤圆

 楼主| 发表于 2010-4-12 17:19:22 | 显示全部楼层
已经在转了 - -

出0入0汤圆

发表于 2010-4-12 20:58:30 | 显示全部楼层
呵呵   楼主  自问自答了~~

出0入0汤圆

发表于 2010-4-12 22:02:39 | 显示全部楼层
楼主肯定是在发帖时看见自己的错误了~~~  呵呵

出0入0汤圆

发表于 2010-4-12 23:02:50 | 显示全部楼层
你已经发现了,哈哈,没开中断定时

出0入0汤圆

 楼主| 发表于 2010-4-13 09:48:36 | 显示全部楼层
不过还是有点小问题,它不会停下来 - -   我那个EN=1貌似没有作用。。。

出0入0汤圆

发表于 2010-4-13 10:15:39 | 显示全部楼层
sum ==600 时你要关中断,不然sum还会++的,一直循环,楼猪这程序写的--!

出0入0汤圆

 楼主| 发表于 2010-4-13 10:28:12 | 显示全部楼层
回复【7楼】amazing030
-----------------------------------------------------------------------

关中断就是让EA=0吧? 可是我先没写这句时,在EN=1处加个断点,调试时间是30S~
写了EA=0,不加断点,全速运行,时间在0.003秒就停止了。。。
这个…………  = =

出0入0汤圆

发表于 2010-4-13 10:31:04 | 显示全部楼层
给你来段比较规范的写法


#include <reg52.h>

#define uint unsigned int

#define VALUE_H     ((65536 - 50000) / 256)
#define VALUE_L     ((65536 - 50000) % 256)

sbit Motor_Clk = P0^3;
sbit Motor_EN  = P0^1;
sbit Motor_Dir = P0^5;


volatile uint Sum;

void ISR_Init(void)
{
    TR0  = 0;
    EA   = 0;

    TMOD = 0x01;
    TH0  = VALUE_H;
    TL0  = VALUE_L;
   
    Sum       = 0;
    Motor_Clk = 0;
    Motor_Dir = 1;
    Motor_EN  = 0;
    P2       &= 0xFE;

    TR0  = 1;
    ET0  = 1;
    EA   = 1;
}

void main(void)
{

     
    ISR_Init();
     
    while(1)
    {
        if(Sum >= 600)
        {
            EA       = 0;
            Sum      = 0;
            Motor_EN = 1;
        }
    }
   
    for( ; ; );
}

void ISR_TIME0(void) interrupt 1
{
    TH0 = VALUE_H;
    TL0 = VALUE_L;
     
    Motor_Clk = ~Motor_Clk;
    Sum++;
}

标准帅哥专用规范

出0入0汤圆

发表于 2010-4-13 10:48:18 | 显示全部楼层
回复【8楼】shuishuixy
回复【7楼】amazing030  
-----------------------------------------------------------------------
关中断就是让EA=0吧? 可是我先没写这句时,在EN=1处加个断点,调试时间是30S~
写了EA=0,不加断点,全速运行,时间在0.003秒就停止了。。。  
这个…………  = =
-----------------------------------------------------------------------

这个…………  = =   你先告诉我你把 EA = 0 放哪了......
哥是菜鸟,你是菜虫,得把你养肥点

出0入0汤圆

 楼主| 发表于 2010-4-13 10:49:19 | 显示全部楼层
回复【9楼】amazing030
-----------------------------------------------------------------------

哇~~ 书写果然很规范~~
不过我用你的程序转不起来了 - -
  调试时也是才0.003秒程序就不动了。。  
如果去掉EA=0就能转,只是停不了。。。

出0入0汤圆

发表于 2010-4-13 10:53:56 | 显示全部楼层
我错了,是
volatile unsigned int Sum; ...打快了...
但这样也应该不会不转,应该一直转

出0入0汤圆

 楼主| 发表于 2010-4-13 10:54:32 | 显示全部楼层
回复【10楼】amazing030
-----------------------------------------------------------------------

   我就是放在你放的那个位置,只是先EN=1,再EA=0~~~
   现在试了试你滴,也不行~~
   嘿嘿嘿~~   这个问题有深度吧,啧啧。。

出0入0汤圆

 楼主| 发表于 2010-4-13 10:56:42 | 显示全部楼层
回复【12楼】amazing030
-----------------------------------------------------------------------

  那个问题我改过来了~~ 还是不转呢 - -
  我觉得软件调试的时候就有问题啊,它0.003秒就停了,所以就不会转呗。。
  去掉EA=0就一直转了~~~

出0入0汤圆

发表于 2010-4-13 10:57:54 | 显示全部楼层
上面那段是编译不过的.... 我只是临时写的,有几小错误
你改了没

出0入0汤圆

 楼主| 发表于 2010-4-13 11:00:39 | 显示全部楼层
回复【15楼】amazing030
-----------------------------------------------------------------------

  改啦~~  编译已经过了

出0入0汤圆

发表于 2010-4-13 11:05:03 | 显示全部楼层
我改好了,你再自制试试,我仿真是对的,Clk会改变

出0入0汤圆

 楼主| 发表于 2010-4-13 11:07:00 | 显示全部楼层
回复【17楼】amazing030
-----------------------------------------------------------------------
    - -  好吧~ 我吃了饭再来试试~~

出0入0汤圆

 楼主| 发表于 2010-4-13 19:08:00 | 显示全部楼层
回复【17楼】amazing030
-----------------------------------------------------------------------

谢谢,已经解决了~~~  终于发现了问题~  该死的原理图~~
其实是EN=1转,EN=0不转~~
我的程序就是先EN=0,没反应几十秒后开始一直转~~
   唉,太悲剧了,那个破原理图,还说低电平使能。。。
你的书写格式还是很值得学习的,谢谢啦~~

出0入0汤圆

发表于 2010-4-15 13:41:22 | 显示全部楼层
这个速度太快可能会造成步进电机失步,最好是增加加速过程,让速度慢慢加起来。

出0入0汤圆

发表于 2010-4-15 13:49:33 | 显示全部楼层
加减速的话就加个定时器数值表,通过判断装载数值大小与目的数值大小来实现

出0入0汤圆

发表于 2012-8-31 15:33:16 | 显示全部楼层
要转一圈的话,怎么写啊?

出0入0汤圆

发表于 2012-8-31 19:26:19 来自手机 | 显示全部楼层
学习学习,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 10:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表