第八届飞思卡尔线性ccd组平衡车获奖程序.docx
《第八届飞思卡尔线性ccd组平衡车获奖程序.docx》由会员分享,可在线阅读,更多相关《第八届飞思卡尔线性ccd组平衡车获奖程序.docx(27页珍藏版)》请在冰点文库上搜索。
第八届飞思卡尔线性ccd组平衡车获奖程序
#include/*commondefinesandmacros*/
#include"derivative.h"/*derivative-specificdefinitions*/
#include
#include
///////////ccd引脚///////////////////////////////
#defineTSL1401_CLK_DDRDDRK_DDRK5//
#defineTSL1401_CLKPORTK_PK5//
#defineTSL1401_SI_DDRDDRK_DDRK4//
#defineTSL1401_SIPORTK_PK4//
/////////////////////////////////////////////////
#defineMOTOR_LEFT_SPEED_POSITIVE(g_fLeftMotorOut>0)
#defineMOTOR_RIGHT_SPEED_POSITIVE(g_fRightMotorOut>0)
#defineSPEED_CONTROL_OUT_MAX10000
#defineSPEED_CONTROL_OUT_MIN-10000
#defineCONTROL_PERIOD5
#defineOPTICAL_ENCODE_CONSTANT157//编码器线数
#defineSPEED_CONTROL_COUNT20
#defineSPEED_CONTROL_PERIOD(SPEED_CONTROL_COUNT*CONTROL_PERIOD)//ms
#defineCAR_SPEED_CONSTANT1000.0/(SPEED_CONTROL_COUNT*CONTROL_PERIOD)/(float)OPTICAL_ENCODE_CONSTANT
#defineDIRECTION_CONTROL_COUNT2
#defineDIRECTION_CONTROL_PERIOD(DIRECTION_CONTROL_COUNT*CONTROL_PERIOD)
#defineTHRESHOLD8
#defineMIDDLE0x49
#defineANGLE_CONTROL_P22.6
#defineANGLE_CONTROL_D0.89
#defineSPEED_CONTROL_P55
#defineSPEED_CONTROL_I4.5
#defineDIR_CONTROL_P7.4
#defineDIR_CONTROL_D0.13
/*ad采集有关的变量*/
floatAD_Gyro_Sum,AD_Gyro,AD_Angle_Sum,AD_Angle;
/*角度控制有关的变量*/
floatj,g_fAngleControlOut,angle_offset=945,gyro_offset=1533;
/*速度控制有关的变量*/
floatg_fCarSpeed,g_fSpeedControlIntegral,g_fSpeedControlOutOld,
g_fSpeedControlOutNew,g_fSpeedControlOut;
/*电机输出相关变量*/
floatg_fLeftMotorOut,g_fRightMotorOut;
/*测速有关的变量*/
intg_nLeftMotorPulse,g_nRightMotorPulse,g_nLeftMotorPulseSigma,g_nRightMotorPulseSigma;
/*方向控制有关的变量*/
floatline,direction,direction_control,g_fDirectionControlOutOld,DIR_GYRO_SUM,
g_fDirectionControlOutNew,g_fDirectionControlOut,DIR_GYRO,DIR_GYRO_Sum,DIRECTION_OFFSET=1378;
/*各类计数器*/
unsignedinti,g_n1MSEventCount,g_nSpeedControlPeriod,g_nDirectionControlCount,
g_nDirectionControlPeriod,g_nSpeedControlCount;
//-------------------------ccd用到的变量---------------------------//
unsignedcharTimerCnt20ms;//
unsignedcharintegration_piont;//
/*128个像素点的平均AD值*///
unsignedcharPixelAverageValue;//
/*128个像素点的平均电压值的10倍*///
unsignedcharPixelAverageVoltage;//
/*设定目标平均电压值,实际电压的10倍*///
intTargetPixelAverageVoltage=30;//
/*设定目标平均电压值与实际值的偏差,实际电压的10倍*///
intPixelAverageVoltageError=0;//
/*设定目标平均电压值允许的偏差,实际电压的10倍*///
intTargetPixelAverageVoltageAllowError=2;//
/*曝光时间*///
unsignedcharIntegrationTime=10;//
unsignedcharTimerFlag20ms=0;//
unsignedcharSciBuf[200]=0;//发送数据//
//////////////////////////////////////////////////////////////////////
//---------------------------cdd用到的函数------------------------//
voidImageCapture(void);//提取像素点//
voidCalculateIntegrationTime(void);//计算曝光时间//
unsignedcharPixelAverage(unsignedcharlen);//计算像素点平均值
voidStartIntegration(void);//开始曝光//
voidCpu_Delay200ns(void);//延时//
voidSamplingDelay(void);//
voidCpu_Delay1us(void);//
//////////////////////////////////////////////////////////////////////
unsignedintg_nAngleControlFlag=1,//角度控制开关
g_nMotorControlFlag=1,//电机开关
g_nSpeedControlFlag=1,//速度控制开关,为0时不进行速度控制.
g_nDirectionControlFlag=1;//方向控制开关
floatCAR_SPEED_SET=0;
voiddelay(unsignedintz);
voidtimer0_init(void);//定时器中断
voidpll_init(void);
voidad_init(void);
voidsci_init(void);
voidio_init(void);
voidCCD_IO_Init(void);
voidpwm_init(void);
voidPutChar(unsignedcharChr);
voidSCI_SendData(unsignedchar*data);
voidSendHex(unsignedchardata);
voidGetMotorPulse(void);
voidSpeedControl(void);
voidSpeedControlOutput(void);
voidAngleControl(void);
voidMotorOutput(void);
voidMotorSpeedOut(void);
voidSetMotorVoltage(floatfLeftVoltage,floatfRightVoltage);
voidDirectionVoltageSigma(void);
voidDirectionControl(void);
voidDirectionControlOutput(void);
unsignedcharsend_data_cnt;
voidmain(void){
pwm_init();
pll_init();
sci_init();
ad_init();
io_init();
CCD_IO_Init();
timer0_init();
delay(3000);
while(PORTK_PK2!
=0);
while(PORTK_PK2==0){
for(i=0;i<10;i++){
ATD0CTL5=0x30;
while(ATD0STAT0_SCF!
=1);
AD_Angle_Sum=AD_Angle_Sum+ATD0DR0;
AD_Gyro_Sum=AD_Gyro_Sum+ATD0DR1;
DIR_GYRO_Sum=DIR_GYRO_Sum+ATD0DR3;
}
AD_Angle=(float)(AD_Angle_Sum/10);
AD_Gyro=(float)(AD_Gyro_Sum/10);
DIR_GYRO=(float)(DIR_GYRO_Sum/10);
AD_Angle_Sum=0;
AD_Gyro_Sum=0;
DIR_GYRO_Sum=0;
angle_offset=AD_Angle;
gyro_offset=AD_Gyro;
DIRECTION_OFFSET=DIR_GYRO+35;
while(PORTK_PK2==0);
}
EnableInterrupts;
SciBuf[0]=0;//长度高字节,此设置为0
SciBuf[1]=12+4;//16
SciBuf[2]=0;//通道4的高字节数据
SciBuf[3]=0;//通道4的低字节数据
SciBuf[4]=0;//保留字节,设置为0
SciBuf[5]=0;//保留字节,设置为0
delay(2000);
for(;;){
/*if(TimerFlag20ms==1){
TimerFlag20ms=0;
if(++send_data_cnt>=5){
send_data_cnt=0;
SCI_SendData(&SciBuf[0]);
}
}*/
for(;;){
while(CAR_SPEED_SET<=30){
CAR_SPEED_SET+=1;
delay(200);
}
}
}
}
///////初始化锁相环,定时中断,AD采集,PWM,串口通信,io////////////////////////////////////////
voiddelay(unsignedintz){//
unsignedintx,y;//
for(x=0;xfor(y=0;y<2000;y++);//
}//
//
voidpll_init(void){//
SYNR=0x53;//
REFDV=0x07;//
while(CRGFLG_LOCK!
=1);//时钟频率已稳定,锁相环频率锁定//
CLKSEL_PLLSEL=1;//使能锁相环时钟//
}//
voidtimer0_init(void){//
PITCFLMT_PITE=0;//
PITCE_PCE0=1;//使能pit0//
PITMTLD0=200-1;//5us//
PITLD0=200-1;//1ms//
PITINTE_PINTE0=1;//使能通道0中断//
PITCFLMT_PITE=1;//使能PIT模块,1ms产生一次中断//
}//
voidad_init(void){//
ATD0CTL0=0x04;//采样完3后回绕道0//
ATD0CTL1=0x4f;//7:
0-外部触发,65:
10-12位精度,4:
0不放电,3210:
ch//
ATD0CTL2=0x40;//7:
06:
1快速清除5:
0停止模式使能43:
00下降沿触发2:
0禁止外部触发10:
00中断禁止
ATD0CTL3=0xa0;//7:
1右对齐无符号6543:
0100每次转换4个序列210:
000NoFIFO,Freeze模式下继续转
ATD0CTL4=0x04;//765:
000采样时间为4个AD时钟周期43210:
00400ATDClock=[BusClock*0.5]/[PRS+1]
ATD0CTL5=0x30;//6:
0特殊通道禁止,5:
1连续转换,4:
1多通道轮流采样//
ATD0DIEN=0x0000;//禁止数字输入//
}//
//
voidpwm_init(void){//
PWMCTL=0xf0;//级联成4个16位pwm//
PWMPOL=0xff;//初始输出高电平//
PWMPRCLK=0x11;//时钟源A,B为总线周期4分频,为10MHZ//
PWMSCLA=5;//
PWMSCLB=5;//时钟SA,SB为A,B的1/250,即1MHZ//
PWMCLK=0x00;//选择时钟源SA,SB作为时钟//
PWMPER01=1500;//
PWMPER23=1500;//
PWMPER45=1500;//
PWMPER67=1500;//
PWMDTY01=0;//
PWMDTY23=0;//
PWMDTY45=0;//
PWMDTY67=0;//
PWME=0xff;//
}//
voidsci_init(){//
SCI0CR1=0x00;//
SCI0SR2=0x80;/*Switchtothealternativeregisterset*///
SCI0ASR1=0x83;/*Clearalternativestatusflags*///
SCI0ACR1=0x00;//
SCI0ACR2=0x00;//
SCI0SR2=0x00;/*Switchtothenormalregisterset*///
(void)SCI0SR1;/*Resetinterruptrequestflags*///
SCI0CR2=0x00;/*Disableerrorinterrupts*///
SCI0BD=0x16;/*Setprescalerbits*///
SCI0CR2|=(SCI0CR2_TE_MASK|SCI0CR2_RE_MASK);//
}//
voidPutChar(unsignedcharChr){//
while(SCI0SR1_TDRE==0){}/*Isthetransmitterempty?
*///
SCI0DRL=Chr;//
}//
voidSCI_SendData(unsignedchar*data){//
intlen;//
unsignedcharlrc=0;//
PutChar('*');//发送帧头,一个字节//
len=(int)(data[0]<<8)|(int)(data[1]);//
data+=2;//调整指针//
PutChar('L');//发送帧类型,共两个字节//
PutChar('D');//
while(len--){//发送数据的ASCII码,含保留字节和CCD数据//
SendHex(*data);//
lrc+=*data++;//
}//
lrc=0-lrc;//计算CRC,可以为任意值//
SendHex(lrc);//发送CRC校验ASCII//
PutChar('#');//发送帧尾,一个字节//
}//
voidSendHex(unsignedchardata){//
unsignedchartemp;//
temp=data>>4;//
if(temp>=10){//
PutChar(temp-10+'A');//
}//
else{//
PutChar(temp+'0');//
}//
temp=data&0x0F;//
if(temp>=10){//
PutChar(temp-10+'A');//
}//
else{//
PutChar(temp+'0');//
}//
}//
voidio_init(void){//
DDRK=0x03;//011//
PORTK_PK0=0;//
PORTK_PK1=0;//
DDRB=0x00;//
DDRA=0x00;//
}//
voidCCD_IO_Init(void){//
TSL1401_CLK_DDR=1;//
TSL1401_SI_DDR=1;//
TSL1401_CLK=0;//
TSL1401_SI=0;//
}//
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////ccd函数//////////////////////////////////////////////
voidImageCapture(void){//
unsignedchari;//
unsignedinttemp_int;//
TSL1401_SI=1;/*SI=1*///
SamplingDelay();//
TSL1401_CLK=1;/*CLK=1*///
SamplingDelay();//
TSL1401_SI=0;/*SI=0*///
SamplingDelay();//
//Delay20usforsamplethefirstpixel//
for(i=0;i<20;i++){//
Cpu_Delay1us();//
}//
//SamplingPixel1//
ATD0CTL5=0x30;//
while(ATD0STAT0_SCF==0);//
temp_int=ATD0DR2;//
SciBuf[6]=(byte)(temp_int>>4);//
TSL1401_CLK=0;/*CLK=0*///
for(i=7;i<134;i++){//
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();//////
TSL1401_CLK=1;/*CLK=1*///
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();////////
ATD0CTL5=0x30;//
while(ATD0STAT0_SCF==0);//
temp_int=ATD0DR2;//
SciBuf[i]=(byte)(temp_int>>4);//
TSL1401_CLK=0;/*CLK=0*///
}//
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();//////
TSL1401_CLK=1;/*CLK=1*///
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();
SamplingDelay();