飞思卡尔智能车大赛技术报告 下载本文

避障很好,估计是加入去噪点的原因吧。

动态阈值即使在很差的环境之下他都会有一个阈值的输出,二值化后可以清晰分辨出赛道信息的。

(3)计算问题:

很大可能是当时计算时候把此处的圆心到赛道中心线距离45按照圆心到内圆边沿45来算的整整差出将近25CM....还有一个硬件上的问题。由于用的是几年前的一个后轮,昨天晚上发现重大缺陷,后轮没有差速.............……

根据提取到的赛道信息给定角度&红圈左后轮极限情况是刚刚压到内黑线和右前轮刚刚压到外圆边沿。下面是对环形弯道的定时分析。

解决此问题尽可以适当增大离心率来解决其突发盲点。

6.3队员之间的合作尤为重要

在整个制作过程中,时时刻刻都会面临新的问题

26

附录:

各模块的部分程序:

A/D转换初始化,设置A/D转换时钟频率为4MHz

#include \/*

*********************************************************************************************************

//函 数 名:AD_Init //功 能:A/D转换初始化,设置A/D转换时钟频率为4MHz //参 数:无 //返 回:无

********************************************************************************************************* */

void AD_Init_40M(void) {

//ATD0CTL4: SRESS8=0, 将采集到的模拟量以10位二进制数表示 //SMP1=0,SMP0=0,采样时间:2 A/D 时钟周期

//PRS4=0,PRS3=0,PRS2=1,PRS1=0,PRS0=0 AD时钟频率

ATD0CTL4 = 0x04;//设置采样时间和频率,fATDCLK=fBUS/(2 ×(PRS + 1)) //ATD0CTL3: DJM=1,S8C=0,S4C=0,S2C=0,S1C=1,FIFO=0,FRZ1=0,FRZ0=0 ATD0CTL3 = 0x88; //采样结果右对齐,每个序列的转换个数为1

//ATD0CTL0: ??=0,??=0,??=0,??=0,WRAP3=0,WRAP2=0,WRAP1=0,WRAP0=1

27

ATD0CTL0 = 0x01; //AD循环采集到AN1后即可

//ATD0CTL1: ETRIGSEL=0,SRES1=1,SRES0=0,SMP_DIS=0,ETRIGCH3=1,ETRIGCH2=1 //ETRIGCH1=1,ETRIGCH0=1

ATD0CTL1 = 0x4F; //12位分辨率,采样前内部采样电容不放电

//ATD0CTL2: ??=0,AFFC=1,ICLKSTP=0,ETRIGLE=0,ETRIGP=0,ETRIGE=0,ASCIE=0, //ACMPIE=0

ATD0CTL2 = 0x40; //下降沿触发,不接受外部信号,禁用ATD比较中断请求 } /*

********************************************************************************************************* * Description: AD_Measure12 * function :通道选择,采样

********************************************************************************************************* */

uint16_t AD_Measure12(uint8_t Channel) { ATD0CTL5_Cx = Channel; while(ATD0STAT0_SCF == 0); return ATD0DR0; }

电机控制

************************************************************* *函数名称:SpeedControl *描述 ;电机控制 * *最后时间;

**************************************************************/

28

float Speed_P; float Speed_I;

float SpeedOutLast,SpeedOut; float SpeedError1,SpeedError0; float SpeedFactor=330; void SpeedControl(void) {

float RealSpeed,TheorySpeed,SpeedErrorDiff; float fP,fI;

TheorySpeed = DirectionError0/tan(DirectionOut*0.0016) ; //0.0016为弧度的比例

RealSpeed= PACNT/SpeedFactor; //PT7接受脉冲 PACNT=0;

SpeedError0 = RealSpeed - TheorySpeed; SpeedErrorDiff = SpeedError0 - SpeedError1; fP = SpeedErrorDiff* Speed_P; fI = SpeedError0 * Speed_I; SpeedOut = SpeedOutLast+fP+fI; SpeedOutLast = SpeedOut; SpeedError1 = SpeedError0; if(SpeedOut>100) SpeedOut=100; if(SpeedOut<-100) SpeedOut=-100; MotorAction(SpeedOut); }

PWM模块:

void PWM_Init_40M(void) { PWME=0x00; //关PWM

29

为方向参数转化 PWMPRCLK=0x22; // 0011 0010 A=B=40M/4=10M 时钟预分频寄存器设置 PWMSCLA=5; // SA=A/2/5=1M 时钟设置 PWMSCLB=5; // SB=B/2/5=1M 时钟设置 PWMCTL=0x00; // 不级联 控制寄存器设置 //motor_1

PWMCLK_PCLK0=1; // PWM0-----SA 时钟源的选择 PWMPOL_PPOL0=1; // Duty=High Time PWMCAE_CAE0=0; // Left-aligned PWMPER0=100; // Frequency=SB/100=10K PWMDTY0=0; // Duty cycle = 0

//motor_2

PWMCLK_PCLK1=1; // PWM1-----SA PWMPOL_PPOL1=1; // Duty=High Time PWMCAE_CAE1=0; // Left-aligned PWMPER1=100; // Frequency=SA/100=10K PWMDTY1=25; // Duty cycle = 0 //servo

PWMPOL_PPOL7=1; // PWM PWMCLK_PCLK7=1; // PWMCAE_CAE7=0; // PWMCTL_CON67=1; // PWMPER67=20000; // PWMDTY67=18525; // WME=0xC3; // }

SCI模块

极性设置 对齐方式设置 周期寄存器设置 占空比寄存器设置 时钟源的选择 极性设置 对齐方式设置 周期寄存器设置 占空比寄存器设置 输出先高后低

选择Clock B作为通道7的时钟 左对齐,1为中心对对齐 级联67

舵机PP67,,20MS 舵机中间值 20000-1475 开PWM

30