原创 步进电机驱动-TMC262驱动程序解读1

2014-1-23 07:00 3110 10 10 分类: 工业电子 文集: 步进电机驱动笔记

 

DEMO的程序和电路可以在trinamic的官网上下载到,下载完成后,发现电路MCU为AT91SAM7XC512_256_128.pdf芯片,32位ARM!!

并且程序注解都是德语,基本上注解对我来说是天书,不管了,先大概理解一下:

下面内容为TMC26X.H头文件解读
 Projekt: TMC26x.h
 
#ifndef __TMC26x_H
#define __TMC26x_H
定义变量类型
typedef unsigned char UCHAR;
typedef unsigned short USHORT;
typedef unsigned int UINT;
这个好像是linux自带的编译器里面的一个东东,好像是存放后面的中断程序的一个入口地址,具体为什么要用这个,未知。
#define FASTRUN __attribute__ ((long_call, section (".fastrun")))
下面宏定义一些参数
#define TRUE 1
#define FALSE 0
 
#define MIN(a,b) (a
#define MAX(a,b) (a>b) ? (a) : (b)
中间宏定义部分省略,需要的话可以下载附件看看。
下面的函数为使能和去使能中断,在源程序里面都没有找到,估计整套程序没有用到这两个函数。
extern void AT91F_DisableInterrupts(void);
extern void AT91F_EnableInterrupts(void);
 
#endif
 
下面是主函数:
 Projekt: TMC26x_main.c
包含的一系列头文件这里不再写了
下面几个C语言的关键字:
Volatile定义一个随时可能改变的变量
Extern:遇到这个参数的时候,不一定就在这个文件定义,也可能在其他文件中定义
Const:定义的是一个常量,不能变化
//Globale Variablen
volatile int Dummy; //f黵 Dummy-Reads bestimmter I/O-Register
 
extern volatile UINT ActualAcceleration;
extern volatile int TargetVelocity;
 
const char *VersionString="262V1.02";
之后主函数里面有两个函数,一个为初始化IO,另外一个为main()函数。
void InitIO(void)
{
 RESET_WATCHDOG();
先复位看门狗:
如下定义:
#define RESET_WATCHDOG() AT91C_BASE_WDTC->WDTC_WDCR=(0xA5 << 24)|AT91C_WDTC_WDRSTT
后面的函数如下:
AT91C_BASE_WDTC是一个基址,这里设置了看门狗的三个寄存器,控制,状态,模式寄存器。给控制寄存器赋什么值呢?
AT91C_WDTC_WDRSTT:定义为((unsigned int) 0x1 << 0)相当于把最后一位赋值1.
下面初始化IO的值,因为主芯片是32位,定义方式为,基址开始,有一系列的寄存器,每一个寄存器都有32位,需要配置一个32位的值。比如AT91C_BASE_PIOB->PIO_PDR=BIT22;相当于IO方向去使能寄存器设置为0X00400000.
所有ARM芯片的寄存器在头文件定义中,将有一个简单的描述。
WDTC_WDCR基址后面的
 
 AT91C_BASE_PIOB->PIO_PDR=BIT22;
 AT91C_BASE_PIOB->PIO_BSR=BIT22;
 AT91C_BASE_PMC->PMC_SCER=AT91C_PMC_PCK2;
 AT91C_BASE_PMC->PMC_PCKR[2]=AT91C_PMC_PRES_CLK|AT91C_PMC_CSS_MAIN_CLK;  
下面介绍主函数:
int main(void)
{
先定义了主函数的变量
 UINT BlinkDelay;
 UINT i;
 UINT Count1;
 UINT Count2;
 UINT DemoMode;
然后初始化接口,包括上文定义的IO口。
这里只看一下SPI,先看一下SPI有哪些常用寄存器,定义在ARM头文件中。
里面有一个PERIPHERAL ID DEFINITIONS FOR AT91SAM7XC256段,定义了相关的外设寄存器一共32个,其中20~29是保留的。SPI有两个:
#define AT91C_ID_SPI0   ((unsigned int) 4) // Serial Peripheral Interface 0
#define AT91C_ID_SPI1   ((unsigned int) 5) // Serial Peripheral Interface 1
初始化函数如下:
AT91C_BASE_PMC->PMC_PCER=1 << AT91C_ID_SPI0; 
时钟初始化
然后是IO端口输出使能,SPI复位和模式,比特率设置等。SPI的通信函数在后面的日志再分析。
 //Initialisierung
 InitIO();
 InitSPI();
 InitUART(7);
 InitUSB();
 InitSysTimer();
 InitStepDirIrq();
 
 //Pr黤en, ob die Pins RxD und TxD der RS232-Schnittstelle miteinander verbunden sind.
 //Wenn ja: Zur點ksetzen des Moduls auf Werkseinstellungen.
 Count1=Count2=0;
 for(i=0; i<10; i++)
 {
    AT91C_BASE_PIOA->PIO_CODR=BIT28;
    for(Dummy=0; Dummy<1000; Dummy++);
    if(!(AT91C_BASE_PIOA->PIO_PDSR & BIT27)) Count1++;
 
    AT91C_BASE_PIOA->PIO_SODR=BIT28;
    for(Dummy=0; Dummy<1000; Dummy++);
    if((AT91C_BASE_PIOA->PIO_PDSR & BIT27)) Count2++;
 }
 if(Count1==10 && Count2==10)
    DemoMode=TRUE;
 else
    DemoMode=FALSE;
上面的这个循环不看了……
初始化驱动器:
 InitMotorDrivers();
设置寄存器
然后等待进程命令,并且点亮指示灯。
 if(DemoMode)
 {
    Set262StepDirInterpolation(0, 1);
    Set262StepDirMStepRes(0, 4);
    Set262SmartEnergyIMin(0, 1);
    Set262SmartEnergyDownStep(0, 2);
    Set262SmartEnergyStallLevelMax(0, 2);
    Set262SmartEnergyUpStep(0, 0);
    Set262SmartEnergyStallLevelMin(0, 1);
    Set262StallGuardFilter(0, 1);
 
    ActivateStepDir();
    ActualAcceleration=10000;
    TargetVelocity=10000;
 }
 
 BlinkDelay=0;
 
 //Hauptschleife
 for(;;)
 {
    RESET_WATCHDOG();
 
    ProcessCommands();
 
    //Blinken der LED
    if(abs(GetSysTimer()-BlinkDelay)>5000)
    {
      if(LED_STATE())
        LED_OFF();
      else
        LED_ON();
 
      BlinkDelay=GetSysTimer();
    }
 }
 
 return 0;
}
)>
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条