重庆工商大学“飞思卡尔杯”智能汽车校内竞赛报告.doc
《重庆工商大学“飞思卡尔杯”智能汽车校内竞赛报告.doc》由会员分享,可在线阅读,更多相关《重庆工商大学“飞思卡尔杯”智能汽车校内竞赛报告.doc(9页珍藏版)》请在冰点文库上搜索。
2012重庆工商大学“飞思卡尔杯”智能汽车校内竞赛
重庆工商大学“飞思卡尔杯”智能汽车校内竞赛报告
智能车驱动电机控制
参赛队员:
学院:
计信学院班级:
10自动化学号:
姓名:
电话:
日期:
2012年11月19日
摘要:
本文以重庆工商大学“飞思卡尔杯”智能汽车校内竞赛为背景,根据比赛相关要求,提出了基于MC9S12XS128MAA单片机的智能车驱动电机控制系统的设计方案,并阐述了所选单片机的功能和指令系统特点以及所选外围硬件的功能和应用方法。
在此基础上通过开发软件CodeWarrior编程实现MC9S12XS128MAA单片机对智能车驱动电机控制并实现竞赛要求的相关功能。
关键词:
单片机CodeWarrior控制智能汽车
前言:
“飞思卡尔”杯智能车大赛是教育部为了加强大学生实践、创新能力和团队精神的培养而举办的面向全国大学生的智能汽车比赛。
而本次重庆工商大学“飞思卡尔杯”智能汽车校内竞赛是立足选拔选手参加教育部举办的第八届“飞思卡尔”杯智能车大赛而举办的。
在本次比赛中本文以研究“智能车驱动电机控制”为主题展开,以MC9S12XS128MAA单片机结合H桥电机驱动电路进行驱动电机控制并实现小车电机在单片机上电5s后启动,先高速正向转动5s,然后慢速正向转动3s后停止转动5s,然后反向高速转动5s,再反向慢速转动3s,再高速正向转动5s后制动停止转动的功能。
1、飞思卡尔MC9S12XS128MAA单片机的功能特点和指令系统特点(试举一两例)
MC9S12XS128MAA单片机是16位单片机,由16位中央处理单元、128KB程序Flash、8KBRAM、8KB数据Flash组成片内存储器。
主要功能模块包括:
内部存储器、内部PLL锁相环模块、2个异步串口通讯SCI、1个串行外设接口SPI、MSCAN模块、1个8通道脉冲宽度调制模块PWM、输入/输出数字I/O口。
例如PWM模块,PWM调制波有8个输出通道,每一个输出通道都可以独立的进行输出。
每一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器和两个可供选择的时钟源。
每一个PWM输出通道都能调制出占空比从0—100%变化的波形。
PWM的主要特点有:
a.它有8个独立的输出通道,并且通过编程可控制其输出波形的周期。
b.每一个输出通道都有一个精确的计数器。
c.每一个通道的PWM输出使能都可以由编程来实现。
d.PWM输出波形的翻转控制可以通过编程来实现。
e.周期和脉宽可以被双缓冲。
当通道关闭或PWM计数器为0时,改变周期和脉宽才起作用。
f.8字节或16字节的通道协议。
g.有4个时钟源可供选择(A、SA、B、SB)他们提供了一个宽范围的时钟频率。
h.通过编程可以实现希望的时钟周期。
i.具有遇到紧急情况关闭程序的功能。
j.每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。
2、开发软件CodeWarrior的试用心得
在参加重庆工商大学“飞思卡尔杯”智能汽车校内竞赛的过程中,我学习了一款开发软件——CodeWarrior。
通过了解得知CodeWarrior包括了构建平台和应用所必需的所有主要工具-IDE、编译器、调试器、编辑器、链接器、汇编程序等,是一款功能强大的开发软件。
事实也是如此,在这次比赛当中,我用CodeWarrior进行编程,调试。
充分的感受到了它的强大功能。
我个人感觉CodeWarrior有这么两个突出的优点:
一是CodeWarrior可以对很多种芯片进行编程,同时支持多种编程语言。
二是CodeWarrior能够自动检查代码中明显的错误,以找到并减少明显的错误,然后编译并连接程序以便计算机能够理解并执行我们编写的程序。
总之,通过对CodeWarrior学习让我初步的了解到了单片机开发的基本过程。
3、所选题目的程序流程图和源程序
a.源程序如下:
#include/*commondefinesandmacros*/
#include/*derivativeinformation*/
#pragmaLINK_INFODERIVATIVE"mc9s12xs128"
unsignedintflag=0;
/***************************************************
**FunctionName:
PLL_Init
**FunctionDiscription:
ClockInitialization
**FunctionStatement:
BusClockis48MHz
****************************************************/
voidPLL_Init(void)//PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{
CLKSEL=0x00;//初始化PLL前先使用外部晶振
PLLCTL_PLLON=1;//开启PLL
SYNR=0XC0|0X05;
REFDV=0X80|0X01;
POSTDIV=0X00;//fpllclk=fvco
_asm(nop);//busclock=PLLCLK/2=48MHz
_asm(nop);
while(0==CRGFLG_LOCK);//等待PLL稳定
CLKSEL_PLLSEL=1;//fBUS采用根据PLL频率设定
}
/***********************************************************
**FunctionName:
PIT_Init
**FunctionDiscription:
PeriodicInterruptTimerInitialization
**FunctionStatement:
InterruptTimeis10ms
************************************************************/
voidPIT_Init(void)//定时中断初始化函数0.01s=10ms定时中断设置
{
PITCFLMT_PITE=0;//定时中断通道关
PITCE_PCE0=1;//使能0通道
PITMTLD0=240-1;//8位定时器初值设定240分频,在48MHzBusClock下,为0.2MHz。
即5us
PITLD0=2000-1;//16位定时器初值设定。
2000*0.005ms
PITINTE_PINTE0=1;//PIT通道0定时中断使能,当计数器递减溢出时,申请中断
PITCFLMT_PITE=1;//定时器通道0使能
}
/**********************************************************
**FunctionName:
PWM_Init
**FunctionDiscription:
PulseWidthModulationInitialization
**FunctionStatement:
PWM3isassignedtoMotorIn1
PWM4isassignedtoMotorIn2
***********************************************************/
voidPWM_Init(void)
{
//CH3MotorIn1
//CH4MotorIn2
//SB,Bforch2367
//SA,Aforch0145
PWME=0x00;//PWM禁止
PWMCAE=0x00;//左对齐模式
PWMPOL=0xFF;//正极性脉冲
PWMPRCLK=0x33;//clockA=clockB=busclock/8=48/8=6MHz
PWMSCLA=0x03;//clockSA=clockA/(2*PWMSCLA)=6/6=1MHz
PWMSCLB=0x03;//clockSB=clockB/(2*PWMSCLB)=6/6=1MHz
PWMCLK=0xFF;//时钟源选择SA,SB
PWMPER3=40;//PWM周期=通道时钟周期*PWMPER3=(1/1MHz)s*40=0.04ms25khz
PWMDTY3=0;//占空比=PWMDTY3/PWMPER3=0
PWMPER4=40;
PWMDTY4=0;
PWMCNT3=0;
PWMCNT4=0;
PWME=0x18;//输出PWM3和pwm4
}
/**********************************************************
**FunctionName:
Main
**FunctionDiscription:
MainFunction
***********************************************************/
voidmain(void){
/*putyourowncodehere*/
PLL_Init();
PWM_Init();
PIT_Init();
EnableInterrupts;
for(;;)
{
_FEED_COP();/*feedsthedog*/
}/*loopforever*/
/*pleasemakesurethatyouneverleavemain*/
}
/**********************************************************
**FunctionName:
PeriodicInterruptTimer
**FunctionDiscription:
**FunctionStatement:
MotorCotrolBlock
************************************************************/
#pragmaCODE_SEG__NEAR_SEGNON_BANKED//指示该程序在不分页区
voidinterrupt66PIT0(void)
{
flag++;
PITTF_PTF0=1;//清中断标志位
//------单片机上电5s后启动-----//
if(flag==500)
{
PWME=0x00;
PWMDTY3=0;
PWMDTY4=0;
}
//------高速正向转动5s-------//
if(flag==1000)
{
PWMDTY3=40;
PWMDTY4=0;
PWME=0x18;
}
//------慢速正向转动3s-------//
if(flag==1300)
{
PWMDTY3=20;
PWMDTY4=0;
PWME=0x18;
}
//------停止转动5s----------//
if(flag==1800)
{
PWME=0x00;
PWMDTY3=0;
PWMDTY4=0;
}
//------反向高速转动5s--------//
if(flag==2300)
{
PWMDTY3=0;
PWMDTY4=40;
PWME=0x18;
}
//------反向慢速转动3s--------//
if(flag==2600)
{
PWMDTY3=0;
PWMDTY4=20;
PWME=0x18;
}
//------高速正向转动5s--------//
if(flag==3100)
{
PWMDTY3=40;
PWMDTY4=0;
PWME=0x18;
}
if(flag==3200)
{
PWME=0x00;
flag=0;
}
}
b.程序流程图如下:
N
Y
开始
初始化PLL
设置总线频率
初始化PWM
设置占空比及输出脉冲频率
初始化PIT
设置定时中断
开放中断
等待中断响应
flag=3200?
进入中断程序
判断标志flag++
中断标志flag置0
中断返回
结束
4、所选题目的外围硬件的功能及应用方法
a.TPS7350
功能:
TPS7350的主要特点和功能有:
输出电压精度高(20%),输出噪声低(2μa),压差低,在输出为100ma时,最大压差为35mv(tps7350),静态电流小,典型值为340μa(与负载电流大小有关),有关闭电源控制端,在关闭电源状态时,耗电仅为0.5μa,内部有监视输出电压电路,降到门限电压时,reset端输出低电平复位信号(当输入电压上升时,使输出电压上升到门限电压时,有200ms的延迟后,输出正常电压),内部有过流限制及过热保护。
tps7350各引脚的功能:
应用:
在本方案中,考虑到飞思卡尔MC9S12XS128MAA单片机正常工作的额定电压为5V,并且为了延长电池的使用寿命同时减小电压波动对单片机工作产生干扰,故选用TPS7350组成一个低压差稳压器(电路图见)对单片机进行供电,以实现单片机正常的工作。
b.BTS7960
功能:
BTS7960是应用于电机驱动的大电流半桥集成芯片,它带有一个P沟道的高边MOSFET、一个N沟道的低边MOSFET和一个驱动IC。
P沟道高边省去了电荷泵的需求,因而减少了电磁干扰。
集成的驱动IC具有逻辑电平输入、电流诊断、斜率调节、死区时间产生和超温、过压、欠压、过流及短路保护功能。
其通态电阻典型值为16毫欧,驱动电流可达43A,调节SR引脚外接电阻的大小可以调节MOS管导通和关断时间,具有防磁干扰功能。
IS引脚是电流检测输出引脚。
INH引脚为使能引脚,IN引脚用于确定哪个MOSFET导通。
当IN=1且INH=1时,高边MOSFET导通,输出高电平;当IN=0且INH=1是,低边MOSFET导通,输出低电平。
应用:
目前直流电机的驱动方式有两种形式:
线性驱动方式和开关驱动方式。
结合两种方式的优缺点以及要实现竞赛要求的直流电机正反转的功能,故在本方案中电机的驱动电路采用的是2片半智能功率驱动芯片BTS7960组合成的一个全桥驱动电路(H桥驱动电路),驱动直流电机转动。
该驱动电路的工作原理为:
通过对下桥臂开关管进行频率为25kHZ的脉宽调制(PWM)信号控制BTS7960的开关动作,实现对电机的正反向PWM驱动、反接制动、能耗制动等控制状态。
5、所选题目的电路图
9