logo资料库

AVR-VID6606.doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
#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)) &&
分享到:
收藏