第八届飞思卡尔线性ccd组平衡车获奖程序.docx
- 文档编号:4339014
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:27
- 大小:21.06KB
第八届飞思卡尔线性ccd组平衡车获奖程序.docx
《第八届飞思卡尔线性ccd组平衡车获奖程序.docx》由会员分享,可在线阅读,更多相关《第八届飞思卡尔线性ccd组平衡车获奖程序.docx(27页珍藏版)》请在冰点文库上搜索。
第八届飞思卡尔线性ccd组平衡车获奖程序
#include
#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;x for(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();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 届飞思 卡尔 线性 ccd 平衡 获奖 程序