AVRVID6606.docx
- 文档编号:26821839
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:18
- 大小:16.46KB
AVRVID6606.docx
《AVRVID6606.docx》由会员分享,可在线阅读,更多相关《AVRVID6606.docx(18页珍藏版)》请在冰豆网上搜索。
AVRVID6606
#ifndef_VID6606_H_
#define_VID6606_H_
#include"Main.h"
#ifdefVID6606_IsValid
#defineVID6606_MotorNum4//定义控制电机的数量
#defineVID6606_Speed10//定义指针旋转速度
#defineVID6606_RST_GPIOxGPIOC
#defineVID6606_RST_PINxBIT1
//--------------A---------------------------
#defineVID6606_FSCXA_GPIOxGPIOC
#defineVID6606_FSCXA_PINxBIT3
#defineVID6606_CCWA_GPIOxGPIOC
#defineVID6606_CCWA_PINxBIT2
//--------------B---------------------------
#defineVID6606_FSCXB_GPIOxGPIOA
#defineVID6606_FSCXB_PINxBIT7
#defineVID6606_CCWB_GPIOxGPIOC
#defineVID6606_CCWB_PINxBIT7
//--------------C---------------------------
#defineVID6606_FSCXC_GPIOxGPIOA
#defineVID6606_FSCXC_PINxBIT6
#defineVID6606_CCWC_GPIOxGPIOA
#defineVID6606_CCWC_PINxBIT5
//--------------D---------------------------
#defineVID6606_FSCXD_GPIOxGPIOC
#defineVID6606_FSCXD_PINxBIT0
#defineVID6606_CCWD_GPIOxGPIOD
#defineVID6606_CCWD_PINxBIT7
#defineVID6606_ON*AvrGPIOx[VID6606_RST_GPIOx][PORTx]|=VID6606_RST_PINx;
#defineVID6606_OFF*AvrGPIOx[VID6606_RST_GPIOx][PORTx]&=~VID6606_RST_PINx;
//-------------------------------------------------
//#defineVID6606_CW(x)*VID6606_Diver[x].CCW_GPIO|=VID6606_Diver[x].CCW_PINx
//#defineVID6606_CCW(x)*VID6606_Diver[x].CCW_GPIO&=~VID6606_Diver[x].CCW_PINx
//#defineVID6606_FSCX_H(x)*VID6606_Diver[x].FSCX_GPIO|=VID6606_Diver[x].FSCX_PINx
//#defineVID6606_FSCX_L(x)*VID6606_Diver[x].FSCX_GPIO&=~VID6606_Diver[x].FSCX_PINx
#defineVID6606_CW(x)*VID6606_Diver[x].CCW_GPIO|=VID6606_Diver[x].CCW_PINx
#defineVID6606_CCW(x)*VID6606_Diver[x].CCW_GPIO&=~VID6606_Diver[x].CCW_PINx
#defineVID6606_FSCX_H(x)*VID6606_Diver[x].FSCX_GPIO|=VID6606_Diver[x].FSCX_PINx
#defineVID6606_FSCX_L(x)*VID6606_Diver[x].FSCX_GPIO&=~VID6606_Diver[x].FSCX_PINx
/*unionVid6606_Flag
{
struct
{
uint8_tA:
1;
uint8_tB:
1;
uint8_tC:
1;
uint8_tD:
1;
uint8_tRE4:
4;
}Bit;
uint8_tByte;
};*/
typedefstruct
{
volatileuint8_t*FSCX_GPIO;
volatileuint8_tFSCX_PINx;
volatileuint8_t*CCW_GPIO;
volatileuint8_tCCW_PINx;
}Vid6606_Diver;
structVid6606_Data
{
int16_tAngle[2][4];
int32_t*Clock;
uint8_tstep[4];
};
externVid6606_DiverconstVID6606_Diver[4];
//externunionVid6606_FlagVID6606_Flag;
externstructVid6606_DataVID6606_Data;
externvoidVID6606_Init(void);
externvoidVID6606_GPIO_Config(void);
externvoidVID6606_Main(void);
externvoidVID6606_Run(void);
externvoidVID6606_GetAngle(void);
#endif
#endif
/*************************************************************************************
需要修改,
*************************************************************************************/
#include"VID6606.h"
//---------程序代码应在此下-------------------------------
#ifdefVID6606_IsValid
structVid6606_DataVID6606_Data;
Vid6606_DiverconstVID6606_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_GPIOx][PORTx],VID6606_CCWA_PINx},
//{AvrGPIOx[VID6606_FSCXB_GPIOx][PORTx],VID6606_FSCXB_PINx,AvrGPIOx[VID6606_CCWB_GPIOx][PORTx],VID6606_CCWB_PINx},
//{AvrGPIOx[VID6606_FSCXC_GPIOx][PORTx],VID6606_FSCXC_PINx,AvrGPIOx[VID6606_CCWC_GPIOx][PORTx],VID6606_CCWC_PINx},
//{AvrGPIOx[VID6606_FSCXD_GPIOx][PORTx],VID6606_FSCXD_PINx,AvrGPIOx[VID6606_CCWD_GPIOx][PORTx],VID6606_CCWD_PINx},
/***********************************************************************************************************
名称:
VID6606_Init
功能:
VID6606初始化
************************************************************************************/
voidVID6606_Init(void)
{
uint16_ti;
VID6606_GPIO_Config();
#ifdefSystemClock_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主题函数,需要扫描
************************************************************************************************************/
voidVID6606_Main(void)
{
VID6606_GetAngle();
VID6606_Run();
}
/**************************************************************************************************
名称:
功能:
得到偏转角度
说明:
这是一个函数接口,移植时需要在这里实现角度的转换
****************************************************************************************************/
voidVID6606_GetAngle(void)
{
#ifdefMeter_IsValid
floatdata;
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;
}
elseif(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;
}
}
else
{
VID6606_Data.Angle[0][3]=0;
}
}
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;
}
}
else
{
VID6606_Data.Angle[0][3]=0;
}
}
#endif
}
/***************************************************************************************************************
说明:
VID6606根据VID6606_Data.Angle[x]数据信息将指针角度调整到对应的位置
*************************************************************************************************************/
voidVID6606_Run(void)
{
uint8_ti,flag=0;
int16_terror[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))
{
VID6606_FSCX_L(i);
VID6606_Data.Angle[1][i]+=1;
VID6606_Data.step[i]=SET;
}
elseif((*VID6606_Data.Clock%VID6606_Speed<=(VID6606_Speed/2))&&(VID6606_Data.step[i]==SET))
{
VID6606_FSCX_H(i);
VID6606_Data.step[i]=RESET;
}
}
elseif(error[i]<0)
{
VID6606_CW(i);
if((*VID6606_Data.Clock%VID6606_Speed>(VID6606_Speed/2))&&(VID6606_Data.step[i]==RESET))
{
VID6606_FSCX_H(i);
VID6606_Data.Angle[1][i]-=1;
VID6606_Data.step[i]=SET;
}
elseif((*VID6606_Data.Clock%VID6606_Speed<=(VID6606_Speed/2))&&(VID6606_Data.step[i]==SET))
{
VID6606_FSCX_L(i);
VID6606_Data.step[i]=RESET;
}
}
else
{
continue;
}
}
}
/**************************************************************************************************
名称:
VID6606_GPIO_Config
功能:
控制VID6606的io口配置
***************************************************************************************************/
voidVID6606_GPIO_Config(void)
{
//--------------RST---------------------------------------------
#if(definedVID6606_RST_GPIOx)&&(definedVID6606_RST_PINx)
*AvrGPIOx[VID6606_RST_GPIOx][DDRx]|=VID6606_RST_PINx;
*AvrGPIOx[VID6606_RST_GPIOx][PORTx]|=VID6606_RST_PINx;
#endif
//--------------A---------------------------------------------
#if(definedVID6606_CCWA_GPIOx)&&(definedVID6606_CCWA_PINx)
*AvrGPIOx[VID6606_CCWA_GPIOx][DDRx]|=VID6606_CCWA_PINx;
*AvrGPIOx[VID6606_CCWA_GPIOx][PORTx]|=VID6606_CCWA_PINx;
#endif
#if(definedVID6606_FSCXA_GPIOx)&&(definedVID6606_FSCXA_PINx)
*AvrGPIOx[VID6606_FSCXA_GPIOx][DDRx]|=VID6606_FSCXA_PINx;
*AvrGPIOx[VID6606_FSCXA_GPIOx][PORTx]|=VID6606_FSCXA_PINx;
#endif
//--------------B---------------------------------------------
#if(definedVID6606_CCWB_GPIOx)&&(definedVID6606_CCWB_PINx)
*AvrGPIOx[VID6606_CCWB_GPIOx][DDRx]|=VID6606_CCWB_PINx;
*AvrGPIOx[VID6606_CCWB_GPIOx][PORTx]|=VID6606_CCWB_PINx;
#endif
#if(definedVID6606_FSCXB_GPIOx)&&(definedVID6606_FSCXB_PINx)
*AvrGPIOx[VID6606_FSCXB_GPIOx][DDRx]|=VID6606_FSCXB_PINx;
*AvrGPIOx[VID6606_FSCXB_GPIOx][PORTx]|=VID6606_FSCXB_PINx;
#endif
//--------------C---------------------------------------------
#if(definedVID6606_CCWC_GPIOx)&&(definedVID6606_CCWC_PINx)
*AvrGPIOx[VID6606_CCWC_GPIOx][DDRx]|=VID6606_CCWC_PINx;
*AvrGPIOx[VID6606_CCWC_GPIOx][PORTx]|=VID6606_CCWC_PINx;
#endif
#if(definedVID6606_FSCXC_GPIOx)&&(definedVID6606_FSCXC_PINx)
*AvrGPIOx[VID6606_FSCXC_GPIOx][DDRx]|=VID6606_FSCXC_PINx;
*AvrGPIOx[VID
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVRVID6606
![提示](https://static.bdocx.com/images/bang_tan.gif)