搜索
bottom↓
回复: 12

步进电机程序用晓奇的软件和程序

[复制链接]

出0入0汤圆

发表于 2011-12-27 11:18:12 | 显示全部楼层 |阅读模式
//ICC-AVR application builder : 2011-12-22 11:22:21
// Target : M64
// Crystal: 7.3728Mhz

#include <iom64v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define STEPPING_CP        BIT(PB0)
#define tc0_ov_enable() (TIMSK |= BIT(TOIE0))
#define tc0_ov_stop()        (TIMSK &= ~BIT(TOIE0))
#define tc1_ov_enable() (TIMSK |= BIT(TOIE1))
#define tc1_ov_stop()        (TIMSK &= ~BIT(TOIE1))
#define OutEnable        BIT(0)
#define speedup        BIT(1)
#define finished        BIT(2)
#define temps        0x80;

#define     A0 (PINA&0X01)
#define     A1 (PINA&0X02)
#define     A2 (PINA&0X04)
#define     A3 (PINA&0X08)
#define     A4 (PINA&0X10)
#define     A5 (PINA&0X20)
uchar        status,
        step_add,
        step_ground,
        ma_da_bit=0,
                ma_da_out_ok=0;
uint        speedup_steps,
        speedup_steps_B,
        RollSteps;
const unsigned int  WaitTable[]={
         0xEA7E, 0xEBD3, 0xECE6, 0xEDF5, 0xEEE8, 0xEFC2, 0xF088, 0xF13C, 0xF1E0, 0xF277,  // 10
        0xF301, 0xF381, 0xF3F8, 0xF466, 0xF4CC, 0xF535, 0xF58E, 0xF5E1, 0xF630, 0xF679,  // 20
        0xF6BF, 0xF701, 0xF73F, 0xF77F, 0xF7B7, 0xF7EC, 0xF81F, 0xF84F, 0xF87C, 0xF8A8,  // 30
        0xF8D6, 0xF8FD, 0xF924, 0xF948, 0xF96B, 0xF98D, 0xF9AD, 0xF9CC, 0xF9ED, 0xFA0A,  // 40
        0xFA26, 0xFA40, 0xFA5A, 0xFA73, 0xFA8B, 0xFAA3, 0xFAB9, 0xFACF, 0xFAE4, 0xFAF9,  // 50
        0xFB0C, 0xFB20, 0xFB32, 0xFB45, 0xFB56, 0xFB67, 0xFB78, 0xFB88, 0xFB98, 0xFBA7,  // 60
        0xFBB6, 0xFBC5, 0xFBD3, 0xFBE1, 0xFBEE, 0xFBFA, 0xFC07, 0xFC13, 0xFC1F, 0xFC2B,  // 70
        0xFC37, 0xFC41, 0xFC4C, 0xFC57, 0xFC62, 0xFC6B, 0xFC76, 0xFC80, 0xFC89, 0xFC92,  // 80
        0xFC9B, 0xFCA5, 0xFCAD, 0xFCB6, 0xFCBE, 0xFCC6, 0xFCCE, 0xFCD6, 0xFCDE, 0xFCE5,  // 90
        0xFCEC, 0xFCF4, 0xFCFB, 0xFD02, 0xFD09, 0xFD10, 0xFD16, 0xFD1C, 0xFD23, 0xFD29,  // 100
        0xFD2F, 0xFD35, 0xFD3B, 0xFD41, 0xFD46, 0xFD4C, 0xFD52, 0xFD57, 0xFD5C, 0xFD62,  // 110
        0xFD67, 0xFD6C, 0xFD71, 0xFD76, 0xFD7B, 0xFD7F, 0xFD84, 0xFD88, 0xFD8D, 0xFD92,  // 120
        0xFD96, 0xFD9A, 0xFD9F, 0xFDA3, 0xFDA7, 0xFDAB, 0xFDAF, 0xFDB3, 0xFDB7, 0xFDBB,  // 130
        0xFDBE, 0xFDC2, 0xFDC6, 0xFDCA, 0xFDCD, 0xFDD1, 0xFDD4, 0xFDD8, 0xFDDB, 0xFDDF,  // 140
        0xFDE2, 0xFDE5, 0xFDE8, 0xFDEB, 0xFDEF, 0xFDF2, 0xFDF5, 0xFDF8, 0xFDFB, 0xFDFE,  // 150
        0xFE01, 0xFE04, 0xFE06, 0xFE09, 0xFE0C, 0xFE0F, 0xFE11, 0xFE14, 0xFE17, 0xFE19,  // 160
        0xFE1C, 0xFE1E, 0xFE21, 0xFE23, 0xFE26, 0xFE28, 0xFE2B, 0xFE2D, 0xFE2F, 0xFE32,  // 170
        0xFE34, 0xFE36, 0xFE39, 0xFE3B, 0xFE3D, 0xFE3F, 0xFE41, 0xFE43, 0xFE46, 0xFE48,  // 180
        0xFE4A, 0xFE4C, 0xFE4E, 0xFE50, 0xFE52, 0xFE54, 0xFE56, 0xFE58, 0xFE5A, 0xFE5B,  // 190
        0xFE5D, 0xFE5F, 0xFE61, 0xFE63, 0xFE65, 0xFE66, 0xFE68, 0xFE6A, 0xFE6B, 0xFE6D,  // 200
        0xFE6F, 0xFE71, 0xFE72, 0xFE74, 0xFE75, 0xFE77, 0xFE79, 0xFE7A, 0xFE7C, 0xFE7D,  // 210
        0xFE7F, 0xFE80, 0xFE82, 0xFE83, 0xFE85, 0xFE86, 0xFE88, 0xFE89, 0xFE8B, 0xFE8C,  // 220
        0xFE8E, 0xFE8F, 0xFE90, 0xFE92, 0xFE93, 0xFE94, 0xFE96, 0xFE97, 0xFE98, 0xFE9A,  // 230
        0xFE9B, 0xFE9C, 0xFE9E, 0xFE9F, 0xFEA0, 0xFEA1, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6,  // 240
        0xFEA7, 0xFEA9, 0xFEAA, 0xFEAB, 0xFEAC, 0xFEAD, 0xFEAE, 0xFEB0, 0xFEB1, 0xFEB2,  // 250
        0xFEB3
};
void delay_1us(void)                 //1us延时函数
  {
   asm("nop");
  }

void delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1us();
  }
  
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
  }
void port_init(void)
{
   PORTA = 0xFF;
DDRA  = 0x00;
PORTB = 0xFF;
DDRB  = 0xFF;
PORTC = 0xFF; //m103 output only
DDRC  = 0x1F;
PORTD = 0xFF;
DDRD  = 0xFA;
PORTE = 0xFF;
DDRE  = 0xF3;
PORTF = 0xFF;
DDRF  = 0x00;
PORTG = 0x1F;
DDRG  = 0x1B;
}

void shortdelay(unsigned char tt)

{
asm("        _L2:subi R16,1");         
asm("                brne _L2");         
asm("                ret");         

}

//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1mSec
// actual value:  0.999mSec (0.1%)
void timer1_init(void)
{
  

TCCR1B = 0x00; //stop
  TCNT1H = 0xFC; //setup
  TCNT1L = 0x67;
OCR1AH = 0x03;
OCR1AL = 0x99;
OCR1BH = 0x03;
OCR1BL = 0x99;
OCR1CH = 0x03;
OCR1CL = 0x99;
ICR1H  = 0x03;
ICR1L  = 0x99;
TCCR1A = 0x00;
TCCR1B = 0x02; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{  
PORTB &= ~STEPPING_CP;       
  TCNT1 = WaitTable[step_add];         
  shortdelay(20);                  
      PORTB |= STEPPING_CP;         
    //PORTB ^= STEPPING_CP;         
     if(status & speedup )// 如果是在降速或者均速
       {
          if(speedup_steps == 0 )        //均速段
          {
             RollSteps -- ;              //  均速段长度减1
            if ( RollSteps == 0 )
             {                 //如果减完转,降速
               speedup_steps = speedup_steps_B;         //降速段长度(台阶数)
               step_ground = 11;   //开始一个新的台阶
             }
          }
        else     //开始减速
         {
           if(--step_ground == 0 )  //台阶内步数变量
             {
             step_add--;         
               if( --speedup_steps == 0 )         //当前速度计算所得变量
                {
                  
                  tc1_ov_stop();
                 TCCR1B = 0b00000000;
                                  ma_da_out_ok=1;
                }
              else
                step_ground = 11;         //开始一个新的台阶
             }
          }
      }
   else
       {
         if( --step_ground == 0 )//台阶内步数变量
          {
             step_add++;         //加速
               if (--speedup_steps == 0 )//当前速度计算所得变量
                {
                   status |= speedup;//BIT(1)加减速完成
                     //RollSteps --;      //填充脉冲数变量
                 }
               else step_ground = 11;        //开始一个新的台阶
           }
       }

}



//call this routine to initialize all peripherals
void init_devices(void)
{
  
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV  = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
// timer1_init();

MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x04; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void stepctlout(uint mai_chong,uchar xi_fen)
{            
                        if(ma_da_bit==0&&ma_da_out_ok==1)
                        {    ma_da_out_ok=0;
                             ma_da_bit=1;
                                 RollSteps=mai_chong*xi_fen;          
                 step_ground=11;            //每级台阶宽度
                 speedup_steps=RollSteps/33 ;    //梯形速度曲线
                 if(speedup_steps>0x50)speedup_steps=0x50;//最高速度限制
                 speedup_steps_B = speedup_steps;         //升降速台阶数备份
                 RollSteps-= speedup_steps*22; //留下恒速部分步数
                 status &= ~speedup;          //加速开始
                 step_add =30;       
                             TCCR1B = 0b00000010;
                 TCNT1 =  WaitTable[step_add];
                 tc1_ov_enable();
                         }
                 
}
void main(void)
{
    init_devices();
         ma_da_out_ok=1;
         
     while(1)
      {      
          
                  //stepctlout(2000,1);//驱动输出
                   if(ma_da_out_ok==1&&(A0==0))
                         {   
                              ma_da_bit=0;  
                                  stepctlout(200,1);//驱动输出
                          }
           if(ma_da_out_ok==1&&(A1==0))
                         {   
                              ma_da_bit=0;  
                                  stepctlout(400 ,1);//驱动输出
                          }
                         if(ma_da_out_ok==1&&(A2==0))
                         {   
                              ma_da_bit=0;  
                                  stepctlout(600 ,1);//驱动输出
                          }
                         if(ma_da_out_ok==1&&(A3==0))
                         {   
                              ma_da_bit=0;  
                                  stepctlout(800 ,1);//驱动输出
                          }
                         if(ma_da_out_ok==1&&(A4==0))
                         {   
                              ma_da_bit=0;  
                                  stepctlout(1000,1);//驱动输出
                          }
                          
                          if(ma_da_out_ok==1&&(A5==0))
                         {   
                              ma_da_bit=0;  
                                  stepctlout(2000,1);//驱动输出
                          }
          }
}

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

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

出0入0汤圆

 楼主| 发表于 2011-12-27 11:20:50 | 显示全部楼层
回复【楼主位】lingligang
-----------------------------------------------------------------------

晓奇的软件ourdev_707967TG7NMJ.rar(文件大小:201K) (原文件名:stepping.rar)

出0入0汤圆

 楼主| 发表于 2011-12-27 11:27:14 | 显示全部楼层
有兴趣的朋友玩下,很有意思!我的电机有问题!没法玩了!有的时候定位好,有的时候少几步,有朋友测试过告诉我下,是程序问题还是电机问题

出0入0汤圆

 楼主| 发表于 2011-12-27 11:31:03 | 显示全部楼层
来张照片
测试图片 (原文件名:未命名.jpg)

出0入0汤圆

 楼主| 发表于 2011-12-27 11:33:25 | 显示全部楼层

和松下触摸屏通讯点的 (原文件名:11111.jpg)

出0入0汤圆

 楼主| 发表于 2011-12-27 11:37:35 | 显示全部楼层
软件说明ourdev_707970PZJZ1D.pdf(文件大小:155K) (原文件名:步进伺服电机加速曲线计算器.pdf)

出0入112汤圆

发表于 2012-3-5 19:29:55 | 显示全部楼层
路过

出0入0汤圆

发表于 2012-3-5 20:46:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-5 21:51:03 | 显示全部楼层
谢谢提供这么好的资料谢谢大家

出0入0汤圆

发表于 2012-3-5 22:05:18 | 显示全部楼层
好东西呀,

出0入0汤圆

发表于 2012-3-7 10:35:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-18 16:00:14 | 显示全部楼层
不错啊,很是顶顶顶顶

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 19:11

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

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