|
楼主 |
发表于 2011-5-20 08:17:26
|
显示全部楼层
什么都不说,先上料。A3992的底层驱动程序:
// 头文件////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __MOTOR_H__
#define __MOTOR_H__
#include "StepMotor.h"
#include "Pan.h"
#include "Tilt.h"
#include "PanTiltEncode.h"
#define EFFECT_LEFT_ROTATION 0
#define EFFECT_RIGHT_ROTATION 1
#define EFFECT_LOCATION 2
#define DRIVE_LOW_CURRENT 0
#define DRIVE_HIGH_CURRENT !DRIVE_LOW_CURRENT
// A3972
#define PinA3972Latch_0 3
#define PORTpinA3972Latch_0 PORTC
#define DDRpinA3972Latch_0 DDRC
#define PinA3972Latch_1 2
#define PORTpinA3972Latch_1 PORTC
#define DDRpinA3972Latch_1 DDRC
typedef struct _MOTRO
{
unsigned char
cDmxValue,
cEffect,
cDrivePosition,
cSpeed,
cResetState,
bDirection,
cDecreaseSpeedCount;
unsigned int
wPosition;
} MOTOR, *P_MOTOR;
extern MOTOR Motor;
void MotorReset(void);
void MotorProcStep(void);
void MotorProcDmxValue(unsigned char cValue);
void A3972Initial(void); // (A3972)接口初始化 :SPI / PinA3972Latch
void A3972Drive_0(DOUBLE_BYTE wDriveValue); // 向(A3972)驱动缓冲区写入数值
void A3972WriteMode_0(void); // 设置(A3972)工作模式
void A3972WriteValue_0(unsigned char cCurrent); // 把驱动缓冲区的数值写入(A3972)
void A3972Drive_1(DOUBLE_BYTE wDriveValue);
void A3972WriteMode_1(void);
void A3972WriteValue_1(unsigned char cCurrent);
void MotorDrive(void);
void MotorProcPositionValue(void);
#endif
//驱动源代码//////////////////////////////////////////////////////////////////////////////////////////
#include "Main.h"
#include "motor.h"
MOTOR Motor;
#define ClearPinA3972Strobe_0() PORTpinA3972Latch_0 &= ~(1 << PinA3972Latch_0)
#define SetPinA3972Strobe_0() PORTpinA3972Latch_0 |= (1 << PinA3972Latch_0)
#define ClearPinA3972Strobe_1() PORTpinA3972Latch_1 &= ~(1 << PinA3972Latch_1)
#define SetPinA3972Strobe_1() PORTpinA3972Latch_1 |= (1 << PinA3972Latch_1)
unsigned char code cTbDriveCurrent0[] = // CP2(62:103) CP3(153:236)
{
0, 1, 3, 4, 6, 7, 9, 11, 12, 13, 15, 16, 18, 19, 21, 22,
23, 24, 26, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 41, 42,
43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 52, 53, 53, 54, 55, 55,
56, 57, 58, 58, 59, 59, 60, 60, 61, 61, 61, 62, 62, 63, 63, 63,
};
unsigned char code cTbDriveCurrent1[] = // CP2(46:80) CP3(139:213)
{
0, 0, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 10, 11,
12, 12, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19, 19, 20, 20, 21,
22, 22, 23, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 28,
29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 32,
0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 7, 8,
9, 9, 9, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15,
16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20,
21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24,
};
unsigned char code cTbDriveLowCurrent[] = // CP2(46:80) CP3(139:213)
{
0, 0, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 10, 11,
12, 12, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19, 19, 20, 20, 21,
22, 22, 23, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 28,
29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 32,
};
struct
{
unsigned char
cDriveValue[3];
} A3972[2];
void A3972Initial(void)
{
DDRB |= (1 << PinSpiSck) | (1 << PinSpiMosi) | (1 << PinSpiSs);
SPCR = (1 << SPE) | (1 << MSTR);
SPSR = (1 << SPI2X);
DDRpinA3972Latch_0 |= (1 << PinA3972Latch_0);
SetPinA3972Strobe_0();
DDRpinA3972Latch_1 |= (1 << PinA3972Latch_1);
SetPinA3972Strobe_1();
}
void A3972Drive_0(DOUBLE_BYTE i)
{
unsigned char c;
c = i.dByte[0];
i.dByte[0] &= 0x07f;
if (i.dByte[0] < 64)
{
i.dByte[1] = 63 - i.dByte[0];
}
else
{
i.dByte[1] = i.dByte[0] - 64;
i.dByte[0] = 127 - i.dByte[0];
}
//if (Pan.StepMotor.wNowSpeed < 250)
{
i.dByte[0] = pgm_read_byte(cTbDriveCurrent0 + i.dByte[0]);
i.dByte[1] = pgm_read_byte(cTbDriveCurrent0 + i.dByte[1]);
}
//else
{
//i.dByte[0] = pgm_read_byte(cTbDriveLowCurrent + i.dByte[0]);
//i.dByte[1] = pgm_read_byte(cTbDriveLowCurrent + i.dByte[1]);
}
i.dByte[0] <<= 1;
if (i.dByte[1] & 0x01)
{
i.dByte[0] |= 0x80;
}
A3972[0].cDriveValue[2] = i.dByte[0];
i.dByte[1] >>= 1;
if (c & 0x80)
{
i.dByte[1] |= 0x20; // 马达控制方向
if (c & 0x40)
{
i.dByte[1] &= 0xbf;
}
else
{
i.dByte[1] |= 0x40;
}
}
else
{
i.dByte[1] &= 0xdf; // 马达控制方向
if (c & 0x40)
{
i.dByte[1] |= 0x40;
}
else
{
i.dByte[1] &= 0xbf;
}
}
A3972[0].cDriveValue[1] = i.dByte[1];
A3972[0].cDriveValue[0] = 0x04;
}
#define FAST_DECAY_TIME_0 0x04 // 0x01 - 0x0f
#define FIXED_OFF_TIME_0 0x03 // 0x01 - 0x1f
#define BLABK_TIME_0 0x03 // 0x01 - 0x03
void A3972WriteMode_0(void)
{
Disable();
ClearPinA3972Strobe_0();
SPDR = 0x04;
Delay(1);
SPDR = FAST_DECAY_TIME_0;
Delay(1);
SPDR = (FIXED_OFF_TIME_0 << 3) | (BLABK_TIME_0 << 1) | 1;
Delay(1);
SetPinA3972Strobe_0();
Enable();
}
void A3972WriteValue_0(unsigned char bCurrent)
{
unsigned char c;
c = A3972[0].cDriveValue[0];
if (bCurrent == DRIVE_LOW_CURRENT)
{
c &= 0xfb;
}
else
{
c |= 0x04;
}
Disable();
ClearPinA3972Strobe_0();
SPDR = c;
Delay(1);
SPDR = A3972[0].cDriveValue[1];
Delay(1);
SPDR = A3972[0].cDriveValue[2];
Delay(1);
SetPinA3972Strobe_0();
Enable();
}
void A3972Drive_1(DOUBLE_BYTE i)
{
unsigned char c;
c = i.dByte[0];
i.dByte[0] &= 0x07f;
if (i.dByte[0] < 64)
{
i.dByte[1] = 63 - i.dByte[0];
}
else
{
i.dByte[1] = i.dByte[0] - 64;
i.dByte[0] = 127 - i.dByte[0];
}
i.dByte[0] = pgm_read_byte(cTbDriveCurrent1 + i.dByte[0]);
i.dByte[1] = pgm_read_byte(cTbDriveCurrent1 + i.dByte[1]);
i.dByte[0] <<= 1;
if (i.dByte[1] & 0x01)
{
i.dByte[0] |= 0x80;
}
A3972[1].cDriveValue[2] = i.dByte[0];
i.dByte[1] >>= 1;
if (c & 0x80)
{
i.dByte[1] |= 0x20; // 马达控制方向
if (c & 0x40)
{
i.dByte[1] &= 0xbf;
}
else
{
i.dByte[1] |= 0x40;
}
}
else
{
i.dByte[1] &= 0xdf; // 马达控制方向
if (c & 0x40)
{
i.dByte[1] |= 0x40;
}
else
{
i.dByte[1] &= 0xbf;
}
}
A3972[1].cDriveValue[1] = i.dByte[1];
A3972[1].cDriveValue[0] = 0x04;
}
#define FAST_DECAY_TIME_1 0x03 // 0x01 - 0x0f
#define FIXED_OFF_TIME_1 0x02 // 0x01 - 0x1f
#define BLABK_TIME_1 0x03 // 0x01 - 0x03
void A3972WriteMode_1(void)
{
Disable();
ClearPinA3972Strobe_1();
SPDR = 0x04;
Delay(1);
SPDR = FAST_DECAY_TIME_1;
Delay(1);
SPDR = (FIXED_OFF_TIME_1 << 3) | (BLABK_TIME_1 << 1) | 1;
Delay(1);
SetPinA3972Strobe_1();
Enable();
}
void A3972WriteValue_1(unsigned char bCurrent)
{
unsigned char c;
c = A3972[1].cDriveValue[0];
if (bCurrent == DRIVE_LOW_CURRENT)
{
c &= 0xfb;
}
else
{
c |= 0x04;
}
Disable();
ClearPinA3972Strobe_1();
SPDR = c;
Delay(1);
SPDR = A3972[1].cDriveValue[1];
Delay(1);
SPDR = A3972[1].cDriveValue[2];
Delay(1);
SetPinA3972Strobe_1();
Enable();
}
void MotorReset(void)
{
PanReset();
TiltReset();
}
void MotorProcStep(void)
{
PanProcStep();
TiltProcStep();
}
void MotorProcPositionValue(void)
{
if (Pan.cPositionDmxValue != Pan.cDriveValue)
{
PanProcPositionDmxValue(Pan.cDriveValue);
}
if (Pan.cSpeedTempValue != Pan.cSpeedDmxValue)
{
PanProcSpeedDmxValue(Pan.cSpeedDmxValue);
}
if (Tilt.cPositionDmxValue != Tilt.cDriveValue)
{
TiltProcPositionDmxValue(Tilt.cDriveValue);
}
if (Tilt.cSpeedTempValue != Tilt.cSpeedDmxValue)
{
TiltProcSpeedDmxValue(Tilt.cSpeedDmxValue);
}
} |
|