24小时热门版块排行榜    

查看: 410  |  回复: 2

eeds136

金虫 (著名写手)


[交流] 基于THB6128和ATMEGA8单片机的步进电机驱动程序设计

/*********************************************************************
程 序:DDC程序
版 本:   DDCdio_VER1.1
修改日期:2008.1.15
**********************************************************************/
#include <main.h>
#include "INCLUDES.h"
//***********************************************************************
//定义指针                                                              *
//************************************************************************/

/*********************************************************
*函数:void        wait(unsigned int n)
*功能:延时子程序
**********************************************************/
void        wait(unsigned int n){                        //ok
unsigned int        i;
        for(i=0;i<n;i++);
}
/*********************************************************
*函数:void        Data_ASC(unsigned char num )
*功能:数字转换为ASC码
**********************************************************/
void        Data_ASCII(unsigned char num,unsigned char * buf )
{
unsigned char a;
      a=(num>>4)&0x0f;
      if(a>9) buf[0]=a+0x37;
      else buf[0]=a+0x30;
      a=num&0x0f;
      if(a>9) buf[1]=a+0x37;
      else buf[1]=a+0x30;
}
/*********************************************************
*函数:unsigned char ASC_Data(unsigned char asch,unsigned char ascl )
*功能:ASC码转换为数字
**********************************************************/
unsigned char ASCII_Data(unsigned char* buf )
{
unsigned char a,b;
      a=buf[0]-0x30;
      if(a>9) a=a-0x07;
      b=buf[1]-0x30;
      if(b>9) b=b-0x07;
      a=(a<<4)|b;
      return (a);
}
/*********************************************************
*函数:void EEPROM_Data_Init()
*功能:EEPROM子程序
**********************************************************/
unsigned char XOR(unsigned char* buf,unsigned char Len)
{
unsigned char a,i;
    a=0;
    for(i=1;i<Len;i++)
    {
        a=a^buf;
    }
    return a;
}
/************************************************************************
*函数原型:  __interrupt void USART0_isr(void)       *
*参数说明:  外部中断1                 *
************************************************************************/
#pragma vector=USART_RXC_vect
__interrupt void USART_isr(void)
{
//__disable_interrupt();//disable all interrupts
unsigned char a;
     a=UDR;
     if(a==0x40)UART_offset=0;
     RX_buf[UART_offset]=a;
     UART_offset++;
     if(UART_offset==11)UART_message=1;
//__enable_interrupt(); //re-enable interrupts
}
/************************************************************************
*函数原型:  void timer1_init();       *
*参数说明:  timer1初始化  计数                 *
************************************************************************/
#pragma vector=TIMER0_OVF_vect
__interrupt void timer0_ovf_isr(void)
{
   
}
/************************************************************************
*函数原型:  void timer1_ovf_isr(void);       *
*参数说明:  timer1中断                 *
***********************************************************************/
#pragma vector=TIMER1_OVF_vect
__interrupt void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
    TCNT1H = 0xE6; //reload counter high value
    TCNT1L = 0x23; //reload counter low value
    s_count++;
    if(LED_flag==0)
    {
        LED_L;
        LED_flag=1;
    }
    else
    {
        LED_H;
        LED_flag=0;
    }
}

/************************************************************************
*函数原型:  void timer1_ovf_isr(void);       *
*参数说明:  timer1中断  
***********************************************************************/
void Dot_down( )
{
        DJ_FRE_H;                        /*6128使能*/
        DJ_UD_L;                        /*正转*/
        while((PIND&0x04)!=0x00)        /*产生clk,先加速,后匀速*/
        {
            DJ_CP_L;
            wait(1);
            DJ_CP_H;
            wait(1);
        }
        DJ_CP_L;
}
/************************************************************************
*函数原型:  void timer1_ovf_isr(void);       *
*参数说明:  timer1中断  
***********************************************************************/
void step_down(unsigned int n)
{
        unsigned int i,j;
        
        DJ_FRE_H;                        /*6128使能*/
        DJ_UD_L;                        /*正转*/
        for(i=0;i<n;i++)        /*产生clk,先加速,后匀速*/
        {
          
           for(j=0;j<25600;j++)        /*产生clk,先加速,后匀速*/
           {
               if((PIND&0x04)==0x00)return;
               
                  DJ_CP_L;
                  wait(1);
                  DJ_CP_H;
                  wait(1);
               
          }
        }
      DJ_CP_L;
}
/*反转*/
void step_up(unsigned int n)
{
        unsigned int i,j;
        DJ_FRE_H;                        /*6128使能*/
        DJ_UD_H;                        /*正转*/
        for(i=0;i<n;i++)        /*产生clk,先加速,后匀速*/
        {
            for(j=0;j<25600;j++)        /*产生clk,先加速,后匀速*/
          {
            if((PIND&0x04)==0x00)return;
            
               DJ_CP_L;
                wait(1);
               DJ_CP_H;
               wait(1);
          }
        }
        DJ_CP_L;
}

/************************************************************************
*函数原型:  void timer1_ovf_isr(void);       *
*参数说明:  timer1中断                 *
***********************************************************************/
void adc_init(void)
{
      DDRC&=0xfe;
      PORTC&=0xfe;
      ADCSR =0x00; //disable adc
      ADMUX = 0x40; //select adc input 0
      ACSR  = 0x80; //禁止模拟比较器
      ADCSR = 0x86;
}
/************************************************************************
*函数原型:  void timer1_ovf_isr(void);       *
*参数说明:  timer1中断                 *
***********************************************************************/
unsigned char adc_IN0(void)
{
unsigned char b;
unsigned int a,i,temp[10];//
unsigned long l;

     for(i=0;i<10;i++)
      {
          ADMUX = 0x40;
          ADCSR |= 0xc0;
          wait(100);
          temp=ADC;
           
     }
     l=0;
      for(i=0;i<10;i++)
      {
            l=l+temp;//ADC_buf
      }
      a=(unsigned int)(l/10);
      b=(unsigned char)(a>>2);
      return b;
       
}
/*********************************************************
*函数:void EEPROM_Data_Init()
*功能:EEPROM子程序
**********************************************************/
void Ret_Data()
{
unsigned char a,temp[11],H[2];
    temp[0]=0x40;
    Data_ASCII(Mode_ID,H);
    temp[1]=H[0];
    temp[2]=H[1];
    Data_ASCII(4,H);
    temp[3]=H[0];
    temp[4]=H[1];
    Data_ASCII(ADC_Data,H);
    temp[5]=H[0];
    temp[6]=H[1];
    Data_ASCII(Dot_flag,H);
    temp[7]=H[0];
    temp[8]=H[1];
    a=XOR(temp,9);
    Data_ASCII(a,H);
    temp[9]=H[0];
    temp[10]=H[1];/**/
    Send_UART(temp,11);
    //Send_UART(RX_buf,11);
}
/*********************************************************
*函数:void EEPROM_Data_Init()
*功能:EEPROM子程序
**********************************************************/
void UART_Msg(unsigned char* buf)
{
unsigned char a,b;
unsigned char i,j;
unsigned char H[2],temp[15];
      H[0]=buf[1];
      H[1]=buf[2];
      b=ASCII_Data(H);
      if(b!=Mode_ID)
      {
          if(b!=0x00) return;
      }
      H[0]=buf[9];
      H[1]=buf[10];
      b=ASCII_Data(H);
      a=XOR(buf,9);
      if ( a != b )  return;//  校验正确
      j=1;
      for(i=0;i<4;i++)
      {
          H[0]=buf[j];
          j++;
          H[1]=buf[j];
          j++;
          temp=ASCII_Data(H);
      }
      
      //Send_UART(RX_buf,11);
      switch(temp[1])
      {
          case 0:
          {
              Dot_down( );  
              break;
          }
          case 1:
          {
                woke_flag=1;
                step_count=temp[2];
                cycle_count=temp[3];
                break;
          }
          case 2:
          {
                woke_flag=2;
                step_count=temp[2];
                break;
          }
          case 3:
          {
                woke_flag=3;
                //Send_UART(RX_buf,11);
                break;
          }
      }
}
/*********************************************************
*函数:void Send_com(unsigned char add,unsigned char com,unsigned char Dat,unsigned char flag)
*功能:发送命令子程序
**********************************************************/
void Send_com(unsigned char add,unsigned char com,unsigned char Dat,unsigned char flag)
{
unsigned char a,temp[15],H[2];
    temp[0]=0x40;
    Data_ASCII(add,H);
    temp[1]=H[0];
    temp[2]=H[1];
    Data_ASCII(com,H);
    temp[3]=H[0];
    temp[4]=H[1];
    Data_ASCII(Dat,H);
    temp[5]=H[0];
    temp[6]=H[1];
    Data_ASCII(flag,H);
    temp[7]=H[0];
    temp[8]=H[1];
    a=XOR(temp,9);
    Data_ASCII(a,H);
    temp[9]=H[0];
    temp[10]=H[1];
    Send_UART(temp,11);
}


/************************************************************************
*函数原型:  void main(void);       *
*参数说明:  主函数                   *
协议:0x40 地址(2)命令(2) 数据(2) 数据(2) 校验(2)
命令: 0: 回位
      1:按摩上行  数据1=高度    数据2=重复次数
      2:翻身上行
      3: 读数据
      4: 返回数据

************************************************************************/
void main(void)
{
unsigned int i;//a,
    wait(6000);
    init_devices();
    uart_init(4800);
    s_count=0;
    EN485_L;
    mS=0;
    way_flag=0;
    Mode_ID=(~PINB)&0x1f;
    for(i=0;i<Mode_ID;i++)wait(10000);
    if((PIND&0x04)!=0x00)Dot_down( );
    //Send_UART(RX_buf,9);
    while(1)
    {
          /*   Send_com(0,1,20,0);
            for(i=0;i<200;i++)wait(60000);

            Send_com(0,2,20,1);
           for(i=0;i<200;i++)wait(60000);
           */
        if((PIND&0x04)!=0x00) Dot_flag=0;
        else  Dot_flag=1;
        if((PIND&0x08)==0x00)step_up(1);
         
        if(UART_message==1)
        {
//__disable_interrupt();
            UART_Msg(RX_buf);
            //Send_UART(RX_buf,11);
            UART_message=0;
//__enable_interrupt();            
        }
        if(woke_flag==1)
        {
            if(cycle_count!=0)
            {
              step_up(step_count);
              Dot_down( );
              cycle_count--;
            }
            if(cycle_count==0)woke_flag=0;
        }
        if(woke_flag==2)
        {  
          step_down(step_count);
          woke_flag=0;
        }
        if(woke_flag==3)
        {  
           Ret_Data();
           woke_flag=0;
        }
        
        ADC_Data=adc_IN0();
        // Send_Data(ADC_Data);
    }
}
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : 新建文本文档_(2).txt
  • 2013-08-31 09:29:07, 10.31 K

» 猜你喜欢

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
简单回复
2013-08-31 11:48   回复  
mlanqiang3楼
2013-08-31 13:03   回复  
相关版块跳转 我要订阅楼主 eeds136 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见