第六届技术报告最终完成版Word格式文档下载.docx
《第六届技术报告最终完成版Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第六届技术报告最终完成版Word格式文档下载.docx(38页珍藏版)》请在冰豆网上搜索。
检波输出波形电极输出波
根据电磁传感器中电感的方向与磁场的关系,采用垂直方向放置时,其测量的磁场大小为Bx,且根据比奥沙法尔定义可知:
图2.1垂直方向传感器测量理论图
垂直方向传感器测量出的电压大小为:
根据实验测定的数据,利用MATLAB可得下图:
可得出以下结论:
实验数据与理论基本相同。
采用水平方向放置时,其测量的磁场大小为By,且根据比奥沙法尔定义可知:
输出检波为:
水平方向电磁传感器测出的电压大小为:
其特性图为:
图2.2水平方向传感器测量理论图
根据车与导线的位置关系如图:
其中:
AE=lA;
h为传感器距赛道的高度;
根据实验测得的数据,我们采用了垂直位置的传感器,根据电磁传感器采集出的电压的大小,两相邻的传感器的距离去3~5cm左右,我们采用相邻的两传感器间距为4cm。
2.2PCB主板的设计
要求主板的面积小,质量轻,其PCB如图所示:
2.2.1电源管理模块:
把电压为7.2V的电池经LM2940稳压后,其电路图如下:
2.2.2.电机驱动模块:
利用MOS管构成双极性H桥,使电流更大,驱动能力更强,再结合逻辑电路,使其使用更安全,更稳定,如下图所示:
操作时序如下:
输入A输入B电机转向
01正转
10反转
00停车
11停车
第三章设计方案概述说明
由于本电磁智能车模型采用A型车模,通过电磁传感器阵列来采集电流约为20KHz、100mA的导线的电磁场强度来检测和识别路径,通过MC9S12XS128的AD口进行采集、处理,进而控制电机和舵机,进行模型车的智能控制。
3.1设计思路及方案的总体说明
根据电磁车循迹的要求,电磁车设计包括赛车的设计和恒流源的设计。
根据电磁传感器方案设计,赛车共包括五大模块:
电磁传感器模块、速度传感器、MC9S12XS128模块,电机驱动模块、电源管管理模块。
此处为框图
3.2系统各模块实现简介:
1.电磁传感器模块
检测导线电流约为100mA,频率20KHz的磁场的大小,进行路径识别,并输出电压给MC9S12XS128采集。
2.速度传感器
利用增量式红外编码器进行速度的测量,反馈给单片机,构成速度的闭环。
光电编码器线数越多,同等速度下单位时间内所能检测到脉冲数也越多,因而速度检测的分辨率也更高。
另一方面,线数增多后,相邻脉冲间的持续时间会变短,脉冲检测的可靠性会因相邻脉冲的干扰而受到影响。
3.MC9S12XS129模块
构成系统的控制器
4.电机驱动模块
通过MC9S12XS128单片机输出的PWM控制,功率放大用来驱动电机,要求驱动电流足够大,要考虑到大电流对整个系统的影响。
5.电源管理模块
制作相应的电源电路,针对个模块的输入信号要求。
利用稳压芯片将电源稳成5V,供单片机和速度传感器供电,舵机利用二极管降压供电,而电机则利用电源直接供电。
6.恒流源模块
由单片机产生频率20KHz的的方波信号,驱动三极管构成的电流源,然后经H桥进行功率放大,产生恒流功率信号。
第四章设计方案概述说明
为了体现程序的模块性和可移植性,我们把程序分成各个模块进行分别处理,而各模块也有相应的形参做为接口,可以做到可移植性,通用性。
下面就这些模块的设计与实现分别进行详细阐述。
程序中用到的硬件资源有PWM模块、AD模块、脉冲累加器、普通I/O口,主程序流程图如下:
此处需要修改
4.1传感器的测量算法
采用了垂直放置的传感器,根据采集到的数据,用MATLAB绘制出图形,并用直线拟合,
采集到的电压如下、MATLAB代码如下:
A=[8610814118422926728326322718514410883]/283;
B=-6:
1:
6;
plot(B,A);
gridminor;
C=[108141184229267]/283;
D=-5:
-1;
y1=polyfit(D,C,1);
x=-6:
0.1:
0;
y=40.6/283*x+307.6/283;
holdon;
plot(x,y);
如图的直线与原曲线在2—5cm处拟合很好,故用此段的线性来计算偏移量,用来控制电机和舵机。
4.2舵机的PD控制
根据电磁传感器采集到的偏移量,利用前后几次偏移量之差进行PD控制。
舵机转角为:
其中Kp为比例系数;
b为相对于中心的偏移量;
Kd为积分系数;
Diff为位置微分量
4.3编码盘
增量式编码器的输出经PAC采集,采集上升沿的个数,用来测定当前速度,其程序流程图如下:
4.4速度控制PID算法及其改进
PID控制是工业过程控制中历史最悠久,生命力最强的控制方式。
这主要是因为这种控制方式具有直观、实现简单和鲁棒性能好等一系列的优点。
位置式PID算式连续控制系统中的PID控制规律是
4.1
其中是偏差信号为零时的控制作用,是控制量的基准;
利用外接矩形法进行数值积分,一阶后向差分进行数值微分,当选定采样周期为T时,式4.1可离散为下面的差分方程
4.2
增量式PID算式。
根据式4.2得出
4.3
于是
4.4
式4.3的计算结果,反映了第k和第k-1次输出之间的增量,所以称为增量算式。
这个算式的结果是可正可负的。
利用增量算式控制执行机构,执行机构每次只增加一个增量,因此执行机构起了一个累加的作用。
对于整个系统来说,位置和增量式两种算式并无本质区别,只是将原来全部由计算机完成的工作,分出一部分由其他元件去完成。
然而,虽然增量式算式只是算法上的一点改进,却带来了不少优点:
算式只与最近几次采样值有关,不需要进行累加,不易引起误差累积,因此容易获得较好的控制效果。
计算机只输出增量,误动作时影响小,必要时可加逻辑保护,限制或禁止故障时的输出。
手动于自动切换时,由于步进电机具有保持作用,所以容易实现无扰动切换,机器故障时,也可以把信号保持在原位。
由于增量算式有上述优点,在实际控制中,应用得比位置式更为广泛。
4.5软件介绍
经过我们组队员的共同开发,设计,验证,我们依据所学的知识从入门到提高,经历的了开发工具的应用、方案的设计、调试过程如下。
4.5.1开发工具
采用了USB接口的HCS12BDM下载工具,是支持FreescaleMC9S12系列16位单片机的BDM调试工具。
软件上采用的是CodeWarriorforHCS12,经过源程序的编写,连接,通过BDM下载至MC9S12XS128,完成单片机的开发过程。
CodeWarrior是Metrowerks公司专门面向Motorola(Freescale)设计的嵌入式应用开发的软件工具,包括集成开发环境IDE,处理器专家库,全芯片仿真,可视化参数显示工具,项目管理器,C交叉编译器,汇编器,链接器以及调试器,支持在线编程和调试,给我们的开发,设计工作带来了很大的方便。
4.5.2制作调试过程说明
本系统采用MC9S12XS128作为主控制器,结合20KHz,100mA的恒流源,构成了智能路径识别系统。
各硬件部分我们通过制作PCB电路板安装在智能车的相关部位。
在车头我们制作了寻迹用的电磁传感器电路板,只要输入激励电源后,即可获取磁场强度。
通过杜邦线,连接到安装在车身中央的MC9S12XS128上。
主控电路板包括了电源管理电路、单片机接口电路,终点识别部分,留有电磁传感器信号输入接口、速度传感器信号输入接口、电源输入接口、舵机控制接口、电机接口等输入输出端口。
开始时的电流源让我们很头疼,在参考了网上的很多方案和设计之后,最终形成了方案,按照频率和电流大小的要求,先产生频率,后放大成功率信号,在队员们的共同努力和指导老师的指导下,终于完成了恒流源的制作。
车的重心问题一直是困扰我们的地方,车的重心前后方向调整,对智能车行驶性能有很大影响。
按照车辆运动学理论,车身重心前移,会增加转向,但会降低转向的灵敏度,同时降低后轮的抓地力;
重心后移,会减少转向,但会增大转向灵敏度,后轮抓地力也会增加。
因而调整合适的车体重心,让智能车更加适应跑道是很关键的。
根据实际调试经验,鉴于当前舵机响应较迟缓,因此,需要将车的重心前移,增加转向性能。
电机驱动是最脆弱的地方,有时会出现短路或起火的现象,由于我们的驱动加入了逻辑控制单元,操作的失误不会引起这种想象,我们经过试验和判断分析,原因可能是由于先给了驱动PWM信号,这时如果给驱动加上电压,由于这时加上了一个阶跃信号,导致上下桥臂的MOS管导通了,由于MOS管的电阻很小,经过的电流很大而导致MOS管烧毁。
第五章总结
智能车主要技术参数模型车的外形如下图所示:
主要技术参数如下:
项目
参数
车模几何尺寸(长、宽、高)(毫米)
395×
241×
78
电路电容总量(微法)
约1100uF
传感器种类及个数
电磁传感器×
6;
红外编码盘×
1,
干簧管×
2
主要芯片
7805X17806X1;
MC9S12XS128×
1MC33886X2
车模重量
1.2Kg
赛道检测精度
1cm
电机个数
舵机×
1;
电机×
1
赛道检测频率(AD检测频率)
160KHz
第六章源程序
#include<
hidef.h>
#include"
derivative.h"
#include<
mc9s12xs128.h>
//-----------宏定义---------------
#defineAngle_Center1735
#definead_max175//95
#definead_max_sum160
#definead_deadline60
#defineCha_zhi_M30
#definekp28//宏定义
#defineki5//宏定义
#definekd15//宏定义
#definespeed_max500//返回的最大值,是pwm的周期值
#definespeed_min0
#definelose_limit600
#defineK10.011177
#defineK20.05714
#defineK30.00625
#defineBRAKE0xfe
#defineDRIVER0x01
/***********变量定义*******/
floatad_k1,ad_k2,ad_k3,ad_k4,ad_k5,ad_k6;
interror_test;
intx_error,x_error_limit;
charpre_turn;
intad1,ad2,ad3,ad4,ad5,ad6;
floatbi_li=1;
floats_20ms=0,ss=0,s=0;
intad_max1,ad_max2,ad_max_num1,ad_max_num2;
//intad_max,Cha_zhi_M;
intx;
//车位置
intcar_positn;
intx_error1=0;
intx_error2=0;
unsignedcharx_work,numm;
intpre_x=0;
intstreet_flag=0;
intstreet_flag1=0;
intstraight_flag=0;
intbrake_flag=0;
intangle_data;
//舵机转角
uintPWM_OUT=0;
longt1,t2,t3,t4,t5,t6;
uintstop_flag=0;
uintturn_flag=0;
uintleft_e,right_e;
intpre_angle;
unsignedintcar_driver;
//驱动力参数
unsignedintpulse_speed;
//电机当前速度
floatideal_speed;
//理想状态下的速度
intspeed_error;
//理想速度与当前速度的差值
intpre_error=0;
//PID控制的速度差值
intpre_d_error=0;
//PID控制的速度上一次差值
intpk=0,error=0;
//速度的PID值
intpre_car_positn;
intnow_speed;
intkp1,ki1,kd1;
unsignedcharstop_now=0;
unsignedchardanger=1;
intd_error;
intdd_error;
inttemp_k;
inta_kp,a_kd,a_kd_bl;
floatk,k_bl,k_x,k_temp;
/*************数组***********/
uintad0_table[10],ad1_table[10],ad2_table[10],ad3_table[10],ad4_table[10],ad5_table[10];
uintad_mix_table[6];
uintangle_table[2];
unsignedcharx_table[2];
/************函数声明*********/
voidData_init(void);
//关键数据初始化
voidSetBusCLK_40M(void);
//锁相环初始化
voidatd_init(void);
//模/数转化初始化
voidpwm_init(void);
//脉冲PWM初始化
voidTIM_init(void);
//测速模块TIM初始化
voidsam_position(void);
//模/数转化模块函数
voidcar_position(void);
//计算当前模型车的位置函数
voidangle(void);
//计算舵机的转角值函数
voidspeed_ping(void);
voidcheck_start(void);
voiddriver(void);
//车的舵机和电机的驱动函数
voiddelay(unsignedintX);
//延时函数
voiddelay1(unsignedinty);
unsignedintabsolute(int);
voidTimer(void);
voidposition(void);
voidtingche(void);
voidcheck_turn(void);
voidbrake(void);
voidpid(void);
//uintabsolute(inty);
//=========********主程序*****============
voidmain(void)
{unsignedintn;
//先初始化各个初始化函数
Data_init();
//设置基本参数
SetBusCLK_40M();
TIM_init();
//TIM初始化
atd_init();
//ATD初始化
pwm_init();
Timer();
//PWM初始化
for(n=0;
n<
=65;
n++)
delay(40000);
EnableInterrupts;
for(;
;
)//控制车行驶的函数
{
//t1++;
check_start();
position();
car_position();
//计算车的位置
angle();
//计算舵机的转角
check_turn();
brake();
speed_ping();
driver();
//驱动控制
}
}
/***********函数定义********/
voidData_init(void)
{
DDRA=0x00;
PUCR_PUPAE=1;
PORTA=0xff;
DDRB=0xff;
PORTB=0XFF;
PWMDTY01=Angle_Center;
t1=0;
t2=0;
t3=0;
t4=0;
ad_k1=1;
ad_k2=1;
ad_k3=1;
ad_k4=1;
ad_k5=1;
ad_k6=1;
//------------锁相环初始化-----------
voidSetBusCLK_40M(void)
CLKSEL=0X00;
//disengagePLLtosystem
PLLCTL_PLLON=1;
//turnonPLL
//SYNR=4;
//REFDV=1;
//pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
SYNR=0x44;
REFDV=0x81;
//pullclock=80MHZ,BUSCLOCK=40M
_asm(nop);
while(!
(CRGFLG_LOCK==1));
CLKSEL_PLLSEL=1;
//engagePLLtosystem;
}
//------------ATD初始化---------------
voidatd_init(void)
ATD0CTL0=0x06;
//当完成第6通道转换后返回到第0通道
ATD0CTL1=0x10;
//8位转换精度,在采样前释放采样电容电荷
ATD0CTL2=0XC0;
//11000000启动A/D,快速清除标志位
//无等待模式,外部触发禁止(bit2=0),
//中断禁止(bit1=0)
ATD0CTL3=0X04;
//00000100转换序列为1、FIFO模式启动,冻结模式下继续转换
ATD0CTL4=0XE1;
//111000018位精度,24AD采样时间
//总线/(1+1)*2=4分频,AD时钟=1MHz
ATD0CTL5=0X30;
//连续转换序列多通道采样
}
//---------TIM初始化-----------
voidTIM_init(void)
PACTL=0X50;
//
PACNT=0X0000;
//------------------
voidTimer(void)
{
PITCFLMT_PITE=0;
//disablePIT//定时中断通道0关
PITCE_PCE0=1;
//enabletimerchannel0定时器通道0使能
PITMTLD0=250-1;
//timebase240clockcycles,it'
s0.1MHz定时器初值载入
PITMUX=0X00;
//ch0connectedtomicrotimer0定时器复合寄存器控制位16位寄存器与微时基0相连
PITLD0=800-1;
//INTVERALmicrotimebases
PITINTE_PINTE0=1;
//enableinteruptchannel0pt0
PITCFLMT_PITE=1;
//enablePIT
//--------------PWM初始化-------------
voidpwm_init(void)
{
PWMCTL=0XF0;
//11110000设置01级联,23级联,45级联,67级联01舵机,45,67电机
//PWMCTL=0XA0;
//设置6,7级联2,3通道级联
//PWMCTL_CON45=1;
//4,5级联
PWMPRCLK=0X22;
//A_COLK=10MHZB_COLK=10MHZ
PWMSCLA=0X05;
//COLKSA=1MHZ
PWMSCLB=0X05;
//COLKSB=1MHZ
//PWMCLK=0XA2;
//PWM01选择SA,PWM45选择SA,PWM67选择SB
PWMCLK_PCLK1=1;
//PWM01选择SA_CLK=1MHZ
PWMCLK_PCLK5=1;
//PWM45选择SA_CLK=1MHZ
PWMCLK_PCLK