打印
[AVR单片机]

ATmega64+A3992驱动步进电机,大侠救命,重金RMB

[复制链接]
4837|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yukaigogogo 于 2012-11-17 22:28 编辑

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;//否则送低电平

MOTOH_CLK_L;//时钟线低

delay_us(1);

MOTOH_CLK_H;//时钟线的上升沿,驱动芯片读入一位数据

buf<<=1;//数据左移,准备发送下一位数据

}
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);//控制此延时,可以控制电机的转速。

}
}
}



原来800多行的代码,精简成现在这样,怕是其它代码干扰,结果还是问题依旧。
用尽了各种方法,反转还是共振。联系过电机芯片的厂家,驱动表是正确的,
也确认是反读驱动数组是让电机反转的。试着去掉AVR GCC的优化编译,未能解决。
各位大侠,走过路过帮我看一看,解决有重谢。

相关帖子

沙发
airwill| | 2012-11-19 20:05 | 只看该作者
本帖最后由 airwill 于 2012-11-19 20:16 编辑

直觉, 这是个控制时序的问题. 特别下载了 A3992 的数据手册看了一下.


你的这段程序给的 C 的时间段可能太短了.
将改变 DAT 放在 DAT 线阴影那个位置去.

//====================三线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;//否则送低电平

MOTOH_CLK_L;//时钟线低

delay_us(1);

MOTOH_CLK_H;//时钟线的上升沿,驱动芯片读入一位数据

buf<<=1;//数据左移,准备发送下一位数据

}
MOTOH_STROBE_H;//发送完一帧数据后拉高片选线
}

这段程序的中间部分改成类似:
if(buf&0x40000)
MOTOH_DATA_H;//如果首位为1,数据线上送高电平,先送MSB
else MOTOH_DATA_L;//否则送低电平
delay_us(1);
MOTOH_CLK_H;//时钟线的上升沿,驱动芯片读入一位数据
buf<<=1;//数据左移,准备发送下一位数据
MOTOH_CLK_L;//时钟线低

试试看吧

使用特权

评论回复
板凳
yukaigogogo|  楼主 | 2014-8-1 09:06 | 只看该作者
今天来结贴,学了别人的笨办法,数据不用循环,一位位的送出,问题可以解决。楼上说的应该是正确的。

使用特权

评论回复
地板
yanxinzou| | 2014-8-9 09:37 | 只看该作者
真是高人一群啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

25

帖子

1

粉丝