lingligang 发表于 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 intWaitTable[]={
       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;       
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;
               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);//驱动输出
                          }
          }
}

lingligang 发表于 2011-12-27 11:20:50

回复【楼主位】lingligang
-----------------------------------------------------------------------

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

lingligang 发表于 2011-12-27 11:27:14

有兴趣的朋友玩下,很有意思!我的电机有问题!没法玩了!有的时候定位好,有的时候少几步,有朋友测试过告诉我下,是程序问题还是电机问题

lingligang 发表于 2011-12-27 11:31:03

来张照片http://cache.amobbs.com/bbs_upload782111/files_49/ourdev_707968JBABAZ.jpg
测试图片 (原文件名:未命名.jpg)

lingligang 发表于 2011-12-27 11:33:25

http://cache.amobbs.com/bbs_upload782111/files_49/ourdev_707969ER7QDK.jpg
和松下触摸屏通讯点的 (原文件名:11111.jpg)

lingligang 发表于 2011-12-27 11:37:35

软件说明ourdev_707970PZJZ1D.pdf(文件大小:155K) (原文件名:步进伺服电机加速曲线计算器.pdf)

xunke 发表于 2012-3-5 19:29:55

路过

8s209 发表于 2012-3-5 20:46:32

mark

kenson 发表于 2012-3-5 21:51:03

谢谢提供这么好的资料谢谢大家

semonpic 发表于 2012-3-5 22:05:18

好东西呀,

dingliming 发表于 2012-3-7 10:35:34

mark

hpdell 发表于 2012-4-18 16:00:14

不错啊,很是顶顶顶顶

kgq398 发表于 2013-9-17 10:17:47

楼主能否说一下使用的一个思路呢,看了一下不是很明白
页: [1]
查看完整版本: 步进电机程序用晓奇的软件和程序