zoukankan      html  css  js  c++  java
  • A3992学习记录

    ATmega64+A3992驱动步进电机

    //ATmega 64a 电机驱动板程序
    //编译环境 AVR Studio 4.17/AVR GCC
    //系统外部时钟16M
    //作者:虞恺

    //日期:2012.9.17开坑
    //***********************************************************************
    //
    包含文件
    //***********************************************************************

    #include <string.h>
    #include <stdio.h>
    //***********************************************************************
    //串口及时钟信号定义
    #define
    F_CPU
    16000000
    /* 单片机主频为16MHz,用于延时子程序 */
    #include <util/delay.h>
    //***********************************************************************
    #include <avr/io.h>
    #include <avr/iom64.h>
    #define delay_us(x)     _delay_us(x)    //AVR GCC延时函数 x(us)
    #define delay_ms(x)     _delay_ms(x)    //AVR GCC延时函数 x(ms)
    //***************************IO口设置***********************************
    //水平电机三线SPI接口设置
    #define MOTOH_STROBE_H  PORTC |= (1 << PC1)//拉高STROBE片选线
    #define MOTOH_STROBE_L  PORTC &=~(1 << PC1)//拉低STROBE片选线
    #define MOTOH_CLK_H 
    PORTC |=(1 << PC0)//拉高时钟线
    #define MOTOH_CLK_L 
    PORTC &=~(1 << PC0)//拉低时钟线
    #define MOTOH_DATA_H 
    PORTG |= (1 << PG1)//拉高数据线
    #define MOTOH_DATA_L 
    PORTG &=~(1 << PG1)//拉低数据线
    //LED指示
    #define LedOn
    PORTA &=~(1 << PA2)//LED点亮
    #define LedOff
    PORTA |= (1 << PA2)//LED灭
    #define Led
    PORTA ^= (1 << PA2)//LED状态取反

    //===========================================================2相四线1.8度步进电机相关=============
    unsigned long  MotoForward8[]=

    {0x4be98,0x4bd30,0x4ba44,0x4b658,0x4b168,0x4ac74,0x4a67a,0x4a07e,0x5667a,0x56c74,0x57168,0x57658,0x57a44,0x57d30,0x57e98,0x57f80, 

      

    0x4de98,0x4dd30,0x4da44,0x4d658,0x4d168,0x4cc74,0x4c67a,0x4c07e,0x5067a,0x50c74,0x51168,0x51658,0x51a44,0x51d30,0x51e98,0x51f80};
    //以上数组包含了电机的8细分的驱动数据
    //======================================================================

    //====================三线SPI发送数据给电机芯片

    void MOTO_Send(unsigned long  buf)//buf是要发送的数据
    {
    Led;
    unsigned char i;
    MOTOH_STROBE_L;
    for(i=0;i<19;i++)//一次发19个数据

    {
    if(buf&0x40000)
    MOTOH_DATA_H;//如果首位为1,数据线上送高电平,先送MSB
    else MOTOH_DATA_L;//否则送低电平
    delay_us(1);
    MOTOH_CLK_H;//时钟线的上升沿,驱动芯片读入一位数据
    buf<<=1;//数据左移,准备发送下一位数据
    MOTOH_CLK_L;//时钟线低
    }
    MOTOH_STROBE_H;//发送完一帧数据后拉高片选线
    }

    //*************************************************************************
    //
    系统初始化子程序 
    //*************************************************************************
    void system_init(void)
    {                                 
      DDRD =0xc2;//设置PD7,PD6,PD1为输出口
      DDRC =0x03;//设置PC1,PC0为输出口
      DDRG =0x03;//设置PG1,PG0为输出口
      DDRA =0x04;//设置PA2为输出口
      DDRB =0xff;
      DDRF =0xff;
      PORTB=0xff;
      LedOff;
    }


    //*******************************************************
    //
    主函数
    //*******************************************************
    int main(void)
    {
    unsigned char j;
    system_init();
    for(i=0;i<6;i++)//Led闪动3次

    {

    Led;

    delay_ms(200);

    }
    LedOff;
    MOTO_Send(0x40779);//设置电机芯片A3992
    while(1)
    {
    for(j=0;j<32;j++)//

    {

    MOTO_Send(MotoForward8[j]);//不停的把数组中的数据发送到电机驱动芯片,此处电机顺时针转

    //用上面这个代码,电机工作正常,工作时几乎没有声音,但是如果想反转启用下面那句代码时,

    //电机共振,声音很大

    //MOTO_Send(MotoForward8[31-j]);//此处电机逆时针转

    delay_us(800);//控制此延时,可以控制电机的转速。

    }
    }
    }

    百度文库搜索 《两相步进电机驱动器A3992及其应用》

  • 相关阅读:
    TS
    多点触摸的操作与图片放大缩小
    动画 -- 按钮 -- 左右晃动
    动画 -- 按钮 --- 从无到有(中心)
    动画 -- 点击按钮 -- 向右下方移动
    动画 -- 点击按钮 -- 顺时针旋转一圈
    动画 -- 点击按钮
    动画 -- ListView列表item逐个出来(从无到有)
    动画 --- 添加 和 移除 按钮
    动画-- 按钮按序列(从小到大)显示
  • 原文地址:https://www.cnblogs.com/cloudstep/p/5979142.html
Copyright © 2011-2022 走看看