#ifndef _VID6606_H_
#define _VID6606_H_
#include "Main.h"
#ifdef VID6606_IsValid
#define VID6606_MotorNum 4//定义控制电机的数量
#define VID6606_Speed 10 //定义指针旋转速度
#define VID6606_RST_GPIOx GPIOC
#define VID6606_RST_PINx BIT1
//--------------A---------------------------
#define VID6606_FSCXA_GPIOx GPIOC
BIT3
#define VID6606_FSCXA_PINx
#define VID6606_CCWA_GPIOx
GPIOC
#define VID6606_CCWA_PINx
BIT2
//--------------B---------------------------
#define VID6606_FSCXB_GPIOx GPIOA
BIT7
#define VID6606_FSCXB_PINx
GPIOC
#define VID6606_CCWB_GPIOx
#define VID6606_CCWB_PINx
BIT7
//--------------C---------------------------
#define VID6606_FSCXC_GPIOx GPIOA
BIT6
#define VID6606_FSCXC_PINx
GPIOA
#define VID6606_CCWC_GPIOx
#define VID6606_CCWC_PINx
BIT5
//--------------D---------------------------
#define VID6606_FSCXD_GPIOx GPIOC
#define VID6606_FSCXD_PINx
BIT0
#define VID6606_CCWD_GPIOx GPIOD
#define VID6606_CCWD_PINx
BIT7
#define VID6606_ON *AvrGPIOx[VID6606_RST_GPIOx][PORTx] |= VID6606_RST_PINx;
#define VID6606_OFF *AvrGPIOx[VID6606_RST_GPIOx][PORTx] &= ~VID6606_RST_PINx;
//-------------------------------------------------
// #define VID6606_CW(x) *VID6606_Diver[x].CCW_GPIO |= VID6606_Diver[x].CCW_PINx
// #define VID6606_CCW(x) *VID6606_Diver[x].CCW_GPIO &= ~VID6606_Diver[x].CCW_PINx
// #define VID6606_FSCX_H(x) *VID6606_Diver[x].FSCX_GPIO |= VID6606_Diver[x].FSCX_PINx
// #define VID6606_FSCX_L(x) *VID6606_Diver[x].FSCX_GPIO &= ~VID6606_Diver[x].FSCX_PINx
#define VID6606_CW(x) *VID6606_Diver[x].CCW_GPIO |= VID6606_Diver[x].CCW_PINx
#define VID6606_CCW(x) *VID6606_Diver[x].CCW_GPIO &= ~VID6606_Diver[x].CCW_PINx
#define VID6606_FSCX_H(x) *VID6606_Diver[x].FSCX_GPIO |= VID6606_Diver[x].FSCX_PINx
#define VID6606_FSCX_L(x) *VID6606_Diver[x].FSCX_GPIO &= ~VID6606_Diver[x].FSCX_PINx
/*union Vid6606_Flag
{
struct
{
uint8_t A :1;
uint8_t B :1;
uint8_t C :1;
uint8_t D :1;
uint8_t RE4:4;
}Bit;
uint8_t Byte;
};*/
typedef struct
{
volatile uint8_t*FSCX_GPIO;
volatile uint8_t FSCX_PINx;
volatile uint8_t* CCW_GPIO;
volatile uint8_t CCW_PINx;
}Vid6606_Diver;
struct Vid6606_Data
{
int16_t Angle[2][4];
int32_t * Clock;
uint8_t step[4];
};
extern Vid6606_Diver const VID6606_Diver[4];
//extern union Vid6606_Flag VID6606_Flag;
extern struct Vid6606_Data VID6606_Data;
extern void VID6606_Init(void);
extern void VID6606_GPIO_Config(void);
extern void VID6606_Main(void);
extern void VID6606_Run(void);
extern void VID6606_GetAngle(void);
#endif
#endif
/******************************************************************************
*******
需要修改,
*******************************************************************************
******/
#include "VID6606.h"
//---------程序代码应在此下-------------------------------
#ifdef VID6606_IsValid
struct Vid6606_Data VID6606_Data;
Vid6606_Diver
const
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
VID6606_Diver[4]
=
{&PORTC,BIT3,&PORTC,BIT2},//A
{&PORTA,BIT7,&PORTC,BIT7},//B
{&PORTA,BIT6,&PORTA,BIT5},//C
{&PORTC,BIT0,&PORTD,BIT7},//D
};
//
{AvrGPIOx[VID6606_FSCXA_GPIOx][PORTx],VID6606_FSCXA_PINx,AvrGPIOx[VID6606_CCWA_GPI
Ox][PORTx],VID6606_CCWA_PINx},
//
{AvrGPIOx[VID6606_FSCXB_GPIOx][PORTx],VID6606_FSCXB_PINx,AvrGPIOx[VID6606_CCWB_GPI
Ox][PORTx],VID6606_CCWB_PINx},
//
{AvrGPIOx[VID6606_FSCXC_GPIOx][PORTx],VID6606_FSCXC_PINx,AvrGPIOx[VID6606_CCWC_GPI
Ox][PORTx],VID6606_CCWC_PINx},
//
{AvrGPIOx[VID6606_FSCXD_GPIOx][PORTx],VID6606_FSCXD_PINx,AvrGPIOx[VID6606_CCWD_GPI
Ox][PORTx],VID6606_CCWD_PINx},
/******************************************************************************
*****************************
名称:VID6606_Init
功能:VID6606 初始化
*******************************************************************************
*****/
void VID6606_Init(void)
{
uint16_t i;
VID6606_GPIO_Config();
#ifdef SystemClock_IsValid
VID6606_Data.Clock = &System_RW.RunT1Ms.T;
#else
Error;!!!!!!!!!!
#endif
VID6606_ON;
for (i=0;i<4;i++)
{
VID6606_Data.step[i] = RESET;
VID6606_FSCX_L(i);
VID6606_Data.Angle[0][i] = 0;
VID6606_Data.Angle[1][i] = 0;
}
VID6606_CW(0);
VID6606_CW(1);
VID6606_CW(2);
VID6606_CW(3);
for(i=0;i<3000;i++)
{
VID6606_FSCX_L(0);
VID6606_FSCX_L(1);
VID6606_FSCX_L(2);
VID6606_FSCX_L(3);
Delay_MarkTime(100);
VID6606_FSCX_H(0);
VID6606_FSCX_H(1);
VID6606_FSCX_H(2);
VID6606_FSCX_H(3);
Delay_MarkTime(100);
}
Watchdog_Main();
}
/******************************************************************************
************************************************
名称:VID6606_Main
功能:VID6606 主题函数,需要扫描
*******************************************************************************
*****************************/
void VID6606_Main(void)
{
VID6606_GetAngle();
VID6606_Run();
}
/******************************************************************************
********************
名称:
功能:得到偏转角度
说明:这是一个函数接口,移植时需要在这里实现角度的转换
*******************************************************************************
*********************/
void VID6606_GetAngle(void)
{
#ifdef Meter_IsValid
float data;
if(Meter_RW.Analog.RyData > 0)
{
data = Meter_RW.Analog.RyData;
VID6606_Data.Angle[0][0] = (float)((data-10)/90*1440);
if (VID6606_Data.Angle[0][0] > 1440)
{
VID6606_Data.Angle[0][0] = 1440;
}
}
else
{
VID6606_Data.Angle[0][0] = 0;
}
if(Meter_RW.Analog.SwData > 0)
{
data = Meter_RW.Analog.SwData;
VID6606_Data.Angle[0][1] = (float)((data-40)*1440/80);
if (VID6606_Data.Angle[0][1] > 1440)
{
VID6606_Data.Angle[0][1] = 1440;
}
else if (VID6606_Data.Angle[0][1] < 0)
{
}
}
else
{
VID6606_Data.Angle[0][1] = 0;
}
//if(Meter_RW.Analog.QyData > 0)
//{
data = Meter_RW.Analog.QyData;
VID6606_Data.Angle[0][2] = (float)((data)*1488/10);
if (VID6606_Data.Angle[0][2] > 1488)
{
VID6606_Data.Angle[0][2] = 1488;
}
//}
if(Meter_RW.Analog.DyADC > Thr12V24V)//高于 17V 认为是 24V 车
{
if(Meter_RW.Analog.DyData > 220)
{
data = Meter_RW.Analog.DyData;
VID6606_Data.Angle[0][3] = (float)((data-220)/80*1440);
if (VID6606_Data.Angle[0][3] > 1440)
{
VID6606_Data.Angle[0][3] = 1440;
}
VID6606_Data.Angle[0][3] = 0;
}
else
{
}
}
else
{
if(Meter_RW.Analog.DyData > 90)
{
data = Meter_RW.Analog.DyData;
VID6606_Data.Angle[0][3] = (float)((data-90)/80*1440);//!!!!!!!!!!!!!!!!!!
if (VID6606_Data.Angle[0][3] > 1440)
{
VID6606_Data.Angle[0][3] = 1440;
}
VID6606_Data.Angle[0][3] = 0;
}
else
{
}
}
#endif
}
/******************************************************************************
*********************************
说明:VID6606 根据 VID6606_Data.Angle[x]数据信息将指针角度调整到对应的位置
*******************************************************************************
******************************/
void VID6606_Run(void)
{
uint8_t i,flag = 0;
int16_t error[4];
for(i = 0;i<4;i++)
{
error[i] = VID6606_Data.Angle[0][i] - VID6606_Data.Angle[1][i];
if(error[i] != 0)
{
flag = 1;
}
}
if(flag == 0)
{
//VID6606_OFF;
return;
}
VID6606_ON;
for(i=0;i<4;i++)
{
if (error[i] > 0)
{
VID6606_CCW(i);
if((*VID6606_Data.Clock
%VID6606_Speed
>
(VID6606_Speed/2))
&&
(VID6606_Data.step[i] == RESET))
{
}
else
VID6606_FSCX_L(i);
VID6606_Data.Angle[1][i] += 1;
VID6606_Data.step[i] = SET;
if((*VID6606_Data.Clock %VID6606_Speed
<=(VID6606_Speed/2)) &&
(VID6606_Data.step[i] == SET))
{
}
VID6606_FSCX_H(i);
VID6606_Data.step[i] = RESET;
}
else if(error[i] < 0)
{
VID6606_CW(i);
if((*VID6606_Data.Clock
(VID6606_Data.step[i] == RESET))
{
VID6606_FSCX_H(i);
%VID6606_Speed
>
(VID6606_Speed/2))
&&