打印
[AVR单片机]

步进电机程序请教

[复制链接]
2249|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wucc2009|  楼主 | 2011-5-8 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<iom16v.h>
#define xtal 8
#define uchar unsigned char
#define uint unsigned int
unsigned char const table1[]={0xf9,0xfc,0xf6,0xf3};//正转
unsigned char const table2[]={0xf3,0xf6,0xfc,0xf9};//反转
//延时函数
void delay_1ms(void)
{
  unsigned int i;
  for(i=1;i<(unsigned int)(xtal*143-2);i++)
    ;
}
void delay(unsigned int n)
      {
        unsigned int j;
        for(j=0;j<n;j++)
           delay_1ms();
       }


void main()
{
uchar i,j,n;
PORTA=0XFF;
DDRA=0Xff;
while(1)
    {
     
  j=0;
  for(n=0;n<3;n++)//正转3圈
  {
    for(i=0;i<4096;i++)//正转1圈共4096个脉冲
          {
   DDRA=0x00;
   DDRA=table1[j];
   j++;
   if(j>=4) j=0;
   delay(30);
    }
  }
  delay(200);
  delay(200);
  delay(200);
  delay(200);
  delay(200);
  
  j=0;
  for(n=0;n<2;n++)//反转2圈
  {
    for(i=0;i<4096;i++)//反转1圈共4096个脉冲
            {
   DDRA=0x00;
   DDRA=table2[j];
   j++;
   if(j>=4) j=0;
   delay(30);
   }
  }
  delay(200);
  delay(200);
  delay(200);
  delay(200);
  delay(200);     
  }
}


请问这个程序错误出在哪里,怎么步进电机没反应啊。。。

相关帖子

沙发
微风| | 2011-5-8 14:23 | 只看该作者
程序没看。很可能的原因,延时时间太短,脉冲宽度不足以驱动电机

使用特权

评论回复
板凳
wucc2009|  楼主 | 2011-5-8 14:36 | 只看该作者
程序写进去之后,电机不转,但是过一会就发热,,,延时时间调长了,但是也没反应啊,请问你以前写过这样的程序吗?能不能借鉴一下啊。 2# 微风

使用特权

评论回复
地板
微风| | 2011-5-8 14:53 | 只看该作者
全丢了。延时时间几十毫秒肯定不够,力矩不够驱动不了电机。

使用特权

评论回复
5
wucc2009|  楼主 | 2011-5-8 15:42 | 只看该作者
//最新修改的还是不行啊。。。。。


//强烈请教啊。。。。
#include<iom16v.h>
#define xtal 8
#define uchar unsigned char
#define uint unsigned int
unsigned char const table1[]={0x09,0x0c,0x06,0x03};//正转
unsigned char const table2[]={0x03,0x06,0x0c,0x09};//反转

//延时函数
void delay_1ms(void)
{
  unsigned int i;
  for(i=1;i<(unsigned int)(xtal*143-2);i++)
    ;
}
void delay(unsigned int n)
      {
        unsigned int j;
        for(j=0;j<n;j++)
           delay_1ms();
       }
/*void delay(unsigned int n)
{ uchar i,j;
  for(i=0;i<n;i++)
  {
    for(j=0;j<1141;j++);
  }
}*/
void main()
{
        uchar i,j,n;
        DDRA=0Xff;
        PORTA=0X00;
        while(1)
    {
            
                j=0;
                  for(i=0;i<4096;i++)//正转1圈共4096个脉冲
          {
                  
                        PORTA=0x00;
                        PORTA=table1[j];
                        j++;
                        if(j>=4) j=0;
                        delay(20);
                  }
                delay(200);
                delay(200);       
                delay(200);
                delay(200);       
                delay(200);       
               
                j=0;
                  for(i=0;i<4096;i++)//反转1圈共4096个脉冲
            {
                        PORTA=0x00;
                        PORTA=table2[j];
                        j++;
                        if(j>=4) j=0;
                        delay(20);
                        }
                delay(200);
                delay(200);       
                delay(200);
                delay(200);       
                delay(200);                                       
         }       
}

使用特权

评论回复
6
lxlooo1| | 2011-5-8 15:46 | 只看该作者
单片机我刚刚学  谁教教我啊

使用特权

评论回复
7
微风| | 2011-5-8 17:38 | 只看该作者
for(i=0;i<4096;i++)//正转1圈共4096个脉冲
          {
                  
                        PORTA=0x00;
                        PORTA=table1[j];
                        j++;
                        if(j>=4) j=0;
                        delay(200);
                  }

使用特权

评论回复
8
noley| | 2011-5-8 21:19 | 只看该作者
哥哥唉,i 定义成uchar了,for里却判定i<4096,溢出N次了,莫非你的uchar是按unsigned int 预定义的?

使用特权

评论回复
9
quentin121| | 2011-5-9 07:46 | 只看该作者
路过,瞅瞅。

使用特权

评论回复
10
求知的电工| | 2011-5-9 12:29 | 只看该作者
在main函数里的“i”定义为uchar了。uchar的值在256以内。应该把。"i"定义为uint。在65536以内。。

使用特权

评论回复
11
bnyuli| | 2011-5-9 12:58 | 只看该作者
不错   确实是MAIN函数里的问题

使用特权

评论回复
12
yzf518666| | 2011-5-14 17:13 | 只看该作者
有可能是定义赋值出现了问题

使用特权

评论回复
13
程启付| | 2013-3-30 16:06 | 只看该作者
路过,这几天我也是遇见这个问题,急坏了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:加油,我的人生将会变得光明!!!

0

主题

51

帖子

1

粉丝