避障很好,估计是加入去噪点的原因吧。
动态阈值即使在很差的环境之下他都会有一个阈值的输出,二值化后可以清晰分辨出赛道信息的。
(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