第5章 机械结构调整
图5.3 电路主板图
- 15 -
第6章 控制算法及软件实现
6.1 总体控制流程图
开始 初始化设置 数据采集,速度检测 数据处理 第一圈采集值存入RAM中 舵机PID角度控 机速度控电图6.1 总体流程图
6.1.1 程序初始化
(a) 记忆初始化。记忆算法使用了图像处理的图像形态学方法,需要
使用大量数组存储数据和处理数据。所以我们先将所有的记忆相关的腐蚀数组与膨胀数组以及处理得到的数据数组等进行初始化。
(b) 时钟初始化。锁相环技术可以提高单片机的工作频率,从而提高单片机的运行速度。在安全允许范围内,我们使用锁相环超频到48MHZ。
void CLK_init(void){ SYNR=2; REFDV=1; while(!(CRGFLG & 0x08)){}
CLKSEL=CLKSEL_PLLSEL_MASK; }
其中PLL=2*OSC*(SYNR+1)/(REFDV+1)。
16
第6章 控制算法及软件实现
(c) PWM初始化。单片机的PWM模块有8 路独立的可设置周期和占空比的8 位PWM 通道,每个通道配有专门的计数器。我们利用其中的6路。该模块有4 个时钟源,能分别控制8 路信号。通过配置寄存器可设置PWM的使能与否、每个通道的工作脉冲极性、每个通道输出的对齐方式、时钟源以及使用方式。
为了提高控制精度,将PWM0、PWM1 两路8 位通道合并为一个16 位通道来控制舵机,PWM4与PWM5来控制电机转速,PWM2与PWM3分别作为两排的光电驱动。PWM 模块的初始化设置过程为:
void PWM_init() {
PWMCTL_CON01 = 1; // PWM01 合并 16 bit
PWMPRCLK = 0x20; // A=24M/1=24M,B=24/4=6M PWMSCLA =12; // SA=A/2/12=1M
PWMSCLB =150; // SB=B/2/150=20KHz
PWMCLK = 0x3E; // PWM0,1-SA;PWM4,5-SA,PWM2,3-SB; PWMPOL = 0xff; // 位极性=1 Duty=High Time PWMCAE = 0x00; // 对齐方式-左对齐 PWMPER01 = 20000;
PWMDTY01 = AngleMid;
PWMPER4 = 100; //Frequency=SA/300=10KHz PWMPER5 = 100; //Frequency=SA/300=10KHz PWMDTY4 = 50; PWMDTY5 = 50;
PWMPER2 = 30; //Frequency=SB/50=400Hz PWMPER3 = 30; //Frequency=SB/50=400Hz PWMDTY2 = 6; PWMDTY3 = 6;
PWME = 0x36; // 舵机enable for(i=0;i<8;i++){ //5ms 8 for(j=0;j<1300;j++){ asm\ } }
PWME|=0x08; }
- 17 -
第三届全国大学生智能汽车竞赛技术报告
(d) SCI串行口通信初始化。SCI串行通信接口是一种异步串行通信系统,它内置独立的波特率产生电路,可以选择8或9个数据位,发送和接收位可以选择是否由硬件生成。初始化设定如下:
void SCI_init() {
SCI0BD = 161; /*设置波特率约为9600 bit/s*/ SCI0CR1_LOOPS = 0; /*正常工作使能*/ SCI0CR1_SCISWAI = 0 ; /*SCI等待模式*/
SCI0CR1_RSRC = 0 ; /*接受器输入内部连接到发送器输出*/ SCI0CR1_M = 0 ; /*1个起始位,8个数据位,1个停止位*/ SCI0CR1_WAKE = 0 ; /*空闲线唤醒*/
SCI0CR1_ILT = 0; /*在一桢数据开始后立即对空闲特征位记数*/ SCI0CR1_PE = 0 ; /*奇偶校验禁止*/ SCI0CR2 = 0b00001100 ; }
6.1.2 光电数据采集
AD模块主要是用来采集模拟信号的AD值,并把它存入到寄存器当中,其中主要涉及到的内容主要有AD模块的时钟预分频,AD的通道选择,以及AD的数据寄存器的内容读取。相关代码如下:
void AD0_init(void) {
ATD0CTL2 = 0xC7 ;//控制寄存器:上电,标志位快速清零,开中断 ATD0CTL3 = 0x38; //控制寄存器3:转换序列长度为7,FIFO模式 ATD0CTL4 = 0x80; //控制寄存器4:8位转换精度,16分频 ATD0CTL5 = 0xB0;
ATD0DIEN=0x00; // 禁止数字输入缓冲 }
6.1.3 速度信息采集
我们采用模数计数器来计算上升沿个数继而计算车速.利用MCCNT和预分频器为数模计数器提供定时常数与时钟信号。设计程序如下:
void Speed_init(void){ asm sei;
ICSYS=0x03; //缓冲、锁定模式 TIOS=0x00; //Timer Input Capture
- 18 -
第6章 控制算法及软件实现
TCTL4=0b00000011;//PT0:Capture on rising edges only ICPAR_PA0EN=1;// 8-Bit Pulse Accumulator PT0 Enable DLYCT=0x11; //Delay Counter Control Register PulseCnt=0;
MCFLG_POLF0=0; MCFLG_MCZF=1; MCCTL=0xCF;
MCCNT=30000;//20ms
EnableInterrupts; }
#pragma CODE_SEG NON_BANKED #pragma TRAP_PROC void MDC_ISR(void) { SpeedTmp=PACN0; Speed=SpeedTmp; MCFLG_MCZF=1; PulseCnt+=Speed; SpeedCtrl();
}
#pragma CODE_SEG DEFAULT
6.1.4 赛道判别
给出光电管采集数据的高低阈值,对A/D转换得到的数据进行归一化处理,根据处理的结果就能算出小车中心线相对位置。由前后两排得到的相对位置就能算出小车目前相对于赛道的角度,从而确定小车的姿态。也就是说,在得到相对偏差的同时,也能得到角度值。这也是单排检测时不能做到的。如果在通过某些弯道时速度过快,赛道中间的黑线可能不再在路经检测传感器的搜索范围中时,我们采取的措施是保持上一个状态,这样能把赛车以最大转角修正回赛道,使黑线重新回到路经检测传感器的搜索范围。而且我们只对设定好的方位状态进行处理,其他的均视为无效状态,例如表示左转右转的状态同时出现,这在正常情况下显然是不可能的,这有可能就是赛道中的干扰,这时就会保持上一次的有效状态运行从而避免干扰。
- 19 -