搜索
bottom↓
回复: 1

步进电机脉冲计数

[复制链接]

出0入0汤圆

发表于 2009-12-19 23:01:55 | 显示全部楼层 |阅读模式
前段时间看到bbmingxiao发的能记录走过步数的步进电机控制程序,现在作些改动加个串口中断,大家看看可行性如何

int flag_led=0;
int dianjitime0,dianjitime1,dianjitime2;
int time0,time1,time2;
int pul0,pul1,pul2;
unsigned int r[3]={0,0,0};
unsigned char flag=0;

#define wait asm("nop\n nop")

#define stop0()  TIMSK&=~(1<<OCIE0)
#define go0()    TIMSK|=(1<<OCIE0)
#define stop1()  TIMSK&=~(1<<OCIE1A)
#define go1()    TIMSK|=(1<<OCIE1A)
#define stop2()  TIMSK&=~(1<<OCIE2)
#define go2()    TIMSK|=(1<<OCIE2)

#define dianji0_pul PORTB^=(1<<PB0)
#define dianji1_pul PORTB^=(1<<PB1)
#define dianji2_pul PORTB^=(1<<PB2)

/*延时函数*/
void delay_ms(unsigned char i) {

        unsigned char a, b;
        for (a = 0; a < i; a++) {
                for (b = 1; b; b++);
                }
}

/*IO口初始化函数*/
void io_init(void) {

        DDRA = 0x00;                                                                                /*方向输入*/
        PORTA = 0xFF;                                                                                /*打开上拉*/
        DDRB = 0xFF;                                                                                /*方向输出*/
        PORTB = 0xFF;                                                                                /*输出高电平*/
        DDRC = 0x00;                                                                                /*不用的IO口建议设置为输入带上拉*/
        PORTC = 0xFF;
        DDRD = 0x00;
        PORTD = 0xFF;
}

void dianji0_right(int pul0)
{        
      
    go0();
    time0 = pul0 * 2; //需要走的步数
}

void dianji1_right(int pul1)
{        
      
        go1();
    time1 = pul1 * 2; //需要走的步数
}

void dianji2_right(int pul2)
{        
      
        go2();
    time2 = pul2 * 2; //需要走的步数
}   
/*主函数*/
void main(void)
{

        unsigned char j = 0;
        unsigned int i = 0;
        unsigned char temp = 0;

        io_init();
        ctc_init();
        uart_init1();
aa:        wait;
        wait;
        if(flag==0){goto aa;}
        else
        {
        dianji0_right(r[0]);
    dianji1_right(r[1]);
    dianji2_right(r[2]);
        flag=0;
        }       
        goto aa;
}

#pragma interrupt_handler OC1_int:7
void OC1_int(void)
{
   static int count1;
      count1 ++ ;
      if( count1 == time1 )  
      {
        count1 =0 ;  
        stop1();  
      }
  dianjitime1 ++;
  dianji1_pul;

}

#pragma interrupt_handler OC2_int:4
void OC2_int(void)
{
   static int count2;
      count2 ++ ;
      if( count2 == time2 )  
      {
        count2 =0 ;  
        stop2();  
      }
  dianjitime2 ++;
  dianji2_pul;

}

#pragma interrupt_handler OC0_int:20
void OC0_int(void)
{
   static int count0;
      count0 ++ ;
      if( count0 == time0 )  
      {
        count0 =0 ;  
        stop0();  
      }
  dianjitime0 ++;
  dianji0_pul;

}


#pragma interrupt_handler usart_rx_isr:12

void usart_rx_isr(void)
{
  
  r[flag_led]=UDR;
  flag_led++;
  if(flag_led==3){flag=1;flag_led=0;}
}

上述程序是在串行接收3个数后,置标志位,启动定时器匹配中断,
现在的问题是如果串口中断接收重复进行,是不是进入不了定时器匹配中断?
请高手帮忙作答,看看可行性如何?

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 01:21

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

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