在线时间10 小时
UID350030
注册时间2012-3-28
NXP金币21
TA的每日心情 | 开心 2023-11-28 08:39 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
中级会员
 
- 积分
- 209
- 最后登录
- 2025-2-21
|
其实刚接触飞思卡尔的时候,还是蛮打出的,自己不是一个那么擅长尝试新事物的人!我们其实很积极,因为内心喜欢这东西自然不怕困难,我先是在年前10月份就买了一个112引脚的XS128,拿到手其实自己都不知道如何下手,╮(╯▽╰)╭!!!但是后来和我一个队的兄弟我两个研究了有多半个月,就这问题解决了。其实对于新手来说,可能一听芯片的介绍好繁琐啊,我们就开始畏惧了,但在我们这些用熟了的看来也不过如此,其实和51单片机一样,就是寄存器多了,在控制的时候要先设置寄存器,但一般来讲寄存器的设置是固定的,而且有些只要该动一下单个寄存器的参数就可以达到你的要求!在下面我会贴出我整理的函数,都有详细说明。现在对我来说如果把K10,K60当做普通单片机的话,其实和51没什么区别就是高级功能多,速度快,RAM大,没什么难的地方;但话又说回来,当你要调试一些模块的时候不得不下点功夫,这改改那改改的有时候就出来了,还会给你带来点小惊喜!!!
对于新手,我的建议是你怎么理解单片机?怎样弄明白单片机之间的区别?依我看来,单片机无非就是控制各个引脚的高低电平,后或者说读取,没什么大不了的东西。单片机的区别就是运用在什么方面上,要是用于嵌入式系统就是麻烦,可以怎么理解就是在一个高级芯片上运行操作系统(linux),同理就是PC机上运行XP系统一样,只不过硬件平台不一样了,要求降低了,而且我们所要做的任务也变了,就是在linux平台上写在这个环境下运行的软件,和硬件就扯不上边了!!!
只有正确认识了单片机的应用方面,我们才能更好地运用它!
下面是我整理的程序有注释,希望对大家有无用
上面的这些初始化程序其实改一下相应的参数就可以进行相应的调节;这些都是大面上的只要动动手就能试出来并且有助于自己的理解,下面我想说的是我都摄像头一些算法的理解:
有些人在说什么PID PD算法什么的,我的理解是这样的,在舵机打角的时候会出现误差,打过或欠缺,我们可以通过2级误差来衡量一次误差带来的影响,用二级误差来弥补,或许还有3级误差,同样来衡量2此修正的精度,级别越多越精确,但会影响响应速度,一般只调节到三级误差不会再次深入纠正,车速多级都可以!设想一下,当车在转弯时,理应是告诉转大角低速状态随意,这样可确保车不会出界,在图像中找一个标志,为了使车在过弯的时候内切,必须在静态的情况下找到合适的状态,设为车在转弯时的最佳状态!!!举个例子但你找到最佳静态状态后,图像的底部会看到内测赛道而且位于图像的某个地方,我们可以试着怎么想,当内侧边线位置超过标准值时,转弯过大,反之欠缺!!!不停的试验就能找到良好地参数!!!我也在测试中!!!!附件是我的总结压缩包,以上是我个人的见解,可以参考,不要一味的认为就是对的!!!大家一起努力吧!!!!
第一步:提取图像
在提取图像的的时候是有窍门的,我举个例子:
图像下方为接近车头的图像我们可以通过图像的缩放和平移使车头处的图像看不到两边黑线;也使用动态图像提取算法,图像提取跟随车头的转向进行提取。
第二步:图像分析处理
直道情况一般分为3中,其中前两种出现的几率较大分别是:⑴图像中间无黑色点,两根边线对称;⑵图像中间无黑色点,两根边线不对称;还有一种是⑶车体与赛道相比发生倾斜(多出现在弯道入直道情况下)。
弯道分为两个阶段:第一阶段:图像中间黑色点位于40行以下(行数越大越靠近车0行为距车最远的位置);第二阶段:大于40行,由于车本身具有盲区此时舵机车速应处于一种可靠地保护状态(防止出界),此阶段一般发生在为侧边界处。
在处理的时候尽量有赛道内向赛道外处理查找。
第三部:数据提取与处理
直道中的舵机应以尽量小的微摆来控制车体位于赛道中央(舵机系数尽量小);弯道舵机系数应以逐渐变化速度快的趋势变化,此外我认为应将车速带入其中,当车速较高时,入弯时的初始角度应大,当车速较第时,入弯时的初始角度应小;此处一旦调节好车会一直保持在内线高速过弯。
我们测试的是以3.4米每秒(cs=130)的速度如弯,当看到中间黑点是就直接送给舵机满偏值Turn=220(由硬件限制,舵机1520摆正)可以完美的过90度弯;我们的编码器37.6对应实际中的1m/s。以上数据根据赛道摩擦力和曲率半径有关,需要实际测出。
/*************************************************************
舵机初始化
*************************************************************/
void PWM_01(void)
{
PWME_PWME1 = 0;
PWMCTL_CON01=1; //0和1联合成16位PWM;
PWMCAE_CAE1=0; //选择输出模式为左对齐输出模式
PWMCNT01 = 0; //计数器清零;
PWMPOL_PPOL1=1; //先输出高电平,计数到DTY时,反转电平
PWMPRCLK = 0X22; //clockA 不分频,clockB=busclock;clockA 4分频:18Mhz
PWMSCLA = 0x09; //对clockSA 18分频,clockSA=clockA/(2*PWMSCLA);
PWMCLK_PCLK1 = 1; //选择clockSA做时钟源 1Mhz 周期为1微秒
PWMPER01 = 20000; //0x57 PWM1的周期16ms 50Hz PWMx的周期=通道时钟周期*PWMPERx
PWMDTY01 = 1520; //0x6 当PWMPOL_PPOLx为高电平时 占空比=PWMDTYx/PWMPERx
PWME_PWME1 = 1;
}
/*************************************************************/
/* 电机初始化 */
/*************************************************************/
void init_pwm(void)
{
PWMCTL_CON23= 1; //通道23为16位的PWM
PWMCTL_CON45= 1; //通道01为16位的PWM
PWMPOL_PPOL5= 1; //通道的极性为高电平有效
PWMPOL_PPOL3= 1; //通道的极性为高电平有效
PWMPRCLK = 0x22; //总线时钟72mhz,A时钟和B时钟的分频系数为4,频率为18MHz
PWMSCLA = 9; //SA时钟频率为1MHz
PWMSCLB = 9;
PWMCLK_PCLK5= 0; //45和23用A,B时钟
PWMCLK_PCLK3= 0;
PWMCAE = 0x00; //脉冲模式为左对齐模式
PWMPER45 = 1800; //通道45 的周期为10KHz
PWMPER23 = 1800; //通道23的周期为10KHz
PWMDTY23 = 900; //通道23的占空比设置
PWMDTY45 = 0; //通道45 的占空比设置
PWME_PWME5=1;
PWME_PWME3=1;
}
/***************************************************
** 函数名称: PLL_Init
** 功能描述: 时钟初始化函数
** 说明: PLLCLK=2*OSCCLK(外部晶振时钟)*(SYNR+1)/(REFDV=+1)
****************************************************/
void PLL_Init(void)
{
CLKSEL=0x00;
PLLCTL_PLLON=1;
SYNR=0XC0 | 0X08; //05,01 48MHz 06,01 56MHz 07,01 64MHz 08,01 72MHz 0B,01 96MHz
REFDV=0X80 | 0X01;
POSTDIV=0X00;
_asm(nop);
_asm(nop);
while(0==CRGFLG_LOCK);//锁相环锁定
CLKSEL_PLLSEL=1;//选定外部时钟
}
/***************************************************
** 函数名称: SCI_Init
** 功能描述: 串口初始化函数
** 说明: 当PLLSET=1时BusClock=PLLCLK/2 当PLLSET=0时BusClock=OSCCLK/2 BusClock为总线时钟
** 比特率:Baud Rate=BusClock/(16*SCIBD)
****************************************************/
void SCI_Init()
{
SCI0BD=0xEA; //9600bps Baud Rate=BusClock/(16*SCIBD)
//BusClock 48MHz, 9600bps,SCI0BD=0x138
//BusClock 56MHz, 9600bps,SCI0BD=0x16D
//BusClock 64MHz, 9600bps,SCI0BD=0x1A0
//BusClock 72MHz, 9600bps,SCI0BD=0x1D5
//BusClock 48MHz, 19200bps,SCI0BD=0x9C
//BusClock 72MHz, 19200bps,SCI0BD=0xEA
//BusClock 96MHz, 19200bps,SCI0BD=0x138
//BusClock 48MHz, 57600bps,SCI0BD=0x34
//BusClock 72MHz, 57600bps,SCI0BD=0x4E
//BusClock 48MHz, 115200bps,SCI0BD=0x1A
//BusClock 72MHz, 115200bps,SCI0BD=0x27
SCI0CR1=0x00; //正常8位模式,无奇偶校验
SCI0CR2=0x2C; //发送允许 接受中断允许
}
/***************************************************
** 函数名称: TIM_Init
** 功能描述: 行场中断初始化函数
** 说明: ECT模块 外部中断 一共有8个通道 7通道优先级最高
****************************************************/
void TIM_Init(void)
{
TIOS=0x00; //外部输入捕捉 0,1 通道
TCTL4=0x09; //通道 0上升沿触发,通道 1 下降沿触发
TSCR1=0x80; //使能
TIE=0x03; //通道 0,1 中断使能
TFLG1=0xFF; //清中断标志位
}
/**************************************************
** 函数名称: SCI_Write
** 功能描述: 给串行口写一个字符数据
** 输 入: SendChar为写入字符
** 输 出: 无
** 说明:
***************************************************/
void SCI_Write(uchar SendChar)
{
while (!(SCI0SR1&0x80));
SCI0DRH=0; //高位寄存器一般用不到
SCI0DRL=SendChar; //SCI0D RL相当于51中的SUBBF寄存器 这里我们只用了其低8位
}
新建文本文档 (2).rar
(126 Bytes, 下载次数: 12)
|
-
-
总结.rar
5.13 MB, 下载次数: 157, 下载积分: 威望 1
|