嵌入式系统设计课设报告书.docx
《嵌入式系统设计课设报告书.docx》由会员分享,可在线阅读,更多相关《嵌入式系统设计课设报告书.docx(12页珍藏版)》请在冰点文库上搜索。
![嵌入式系统设计课设报告书.docx](https://file1.bingdoc.com/fileroot1/2023-5/29/5f82be74-593c-45e9-bd0a-fc2cae8448f0/5f82be74-593c-45e9-bd0a-fc2cae8448f01.gif)
嵌入式系统设计课设报告书
福州大学
《嵌入式系统设计课设》
报告书
题目:
基于飞思卡尔单片机
循迹小车的设计
姓名:
学号:
学院:
电气工程与自动化学院
专业:
电气工程与自动化专业
年级:
20**级
起讫日期:
20**年4月至5月
指导教师:
目录
1、课程设计目的1
2、课程设计题目和实现目标1
3、设计方案1
4、程序流程图1
5、程序代码1
6、调试总结1
7、设计心得体会1
8、参考文献1
1、课程设计目的
《嵌入式系统设计课设》是与《嵌入式系统设计》课程相配套的实践教学环节。
《嵌入式系统设计》是一门实践性很强的专业基础课,通过课程设计,达到进一步理解嵌入式芯片的硬件、软件和综合应用方面的知识,培养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。
培养大胆发明创造的设计理念,为今后就业打下良好的基础。
通过课程设计,掌握以下知识和技能:
1.嵌入式应用系统的总体方案的设计;
2.嵌入式应用系统的硬件设计;
3.嵌入式应用系统的软件程序设计;
4.嵌入式开发系统的应用和调试能力
2、课程设计题目和实现目标
课程设计题目:
基于飞思卡尔单片机循迹小车的设计。
实现目标:
控制小车在两边贴有黑线的白色KT板的跑道上自主循线运行。
3、设计方案-----介绍系统实现方案和系统原理图
系统实现方案:
采用飞思卡尔的MC9S12XS128芯片作为智能车的核心控制器,利用线性CCD采集图像,然后对图像进行边沿检测,提取赛道两旁黑线,计算出当前赛道的中点值进而求出当前位置偏差,通过PD控制两个电机的转速,使小车能沿着赛道行走。
系统原理图:
主控板:
电机驱动板:
4、程序流程--------各个模块的流程图
5、程序代码
系统的初始化:
AD初始化:
voidAD_Inits()
{
ATD0CTL1=0x4f;
ATD0CTL2=0X40;
ATD0CTL3=0X88;
ATD0CTL4=0x13;
ATD0DIEN=0x00;
}
PWM初始化:
voidPWM_Inits()
{
PWME=0X00;//80MHZ
PWMCTL=0X00;
PWMPRCLK=0X33;//预分频为8,80M/8=10M
PWMCLK=0xaa;
PWMSCLA=0X01;//SA为CLOCKSA=ClockA/(2*PEMSCLA)=10M/2=5M;
PWMSCLB=0x01;
PWMPOL=0xaa;
PWMCAE=0X00;
PWMPER1=250;//频率为20k,SA/250=20K,PWMPER=SA/20k;
PWMDTY1=0;
PWMPER3=250;
PWMDTY3=0;
PWMPER5=250;
PWMDTY5=0;
PWMPER7=250;
PWMDTY7=0;
PWME=0Xaa;
}
1ms中断初始化:
voidPIT_Inits()
{
PITCFLMT_PITE=0;
PITCE_PCE0=1;
PITMUX_PMUX0=0x00;
PITMTLD0=199;
PITLD0=399;
PITINTE_PINTE0=1;
PITCFLMT_PITE=1;
}
CCD提取赛道黑线:
voidCCDSigmaControl()
{
inti;
CCD_Mid();
for(i=Mid_temp;i>=2;i--)//先从左边找黑线
{
if(i==2)
{
fleft_temp=fleft_mid_temp;
fleft_white_flag=1;//左边全白
break;
}
Elseif(((CCD[i]-CCD[i-2])>=BLACK)&&((CCD[i]-CCD[i-3])>=BLACK)&&((CCD[i]-CCD[i-4])>=BLACK))
{
fleft_temp=i-2;//赋值黑线坐标
fleft_flag=1;//左边找到黑线
break;
}
}
for(i=Mid_temp;i<=125;i++)//再从右边找黑线
{
if(i==125)
{
fright_temp=fright_mid_temp;
fright_white_flag=1;//右边全白
break;
}
elseif(((CCD[i]-CCD[i+2])>=BLACK)&&((CCD[i]-CCD[i+3])>=BLACK)&&((CCD[i]-CCD[i+4])>=BLACK))
{
right_temp=i+2;//赋值黑线坐标
fright_flag=1;//右边找到黑线
break;
}
}
}
CCD方向控制:
voidDirectionControl()
{
floatfValue,fleftValue,frightValue;
if(fleft_white_flag&&fright_white_flag)//全白的话,偏差为0直走
{
fValue=0;
fleft_white_flag=fright_white_flag=0;
}
if(fleft_flag&&fright_white_flag)//左边黑线,右边全白,右转
{
fleftValue=fleft_temp-0;
fValue=Direction_Control_P2*fleftValue;
fleft_flag=fright_white_flag=0;
}
if(fright_flag&&fleft_white_flag)//右边黑线,左边全白,左转
{
frightValue=fright_temp-127;
fValue=Direction_Control_P2*frightValue;
fright_flag=fleft_white_flag=0;
}
if(fleft_flag&&fright_flag)//左右都找到黑线
{
mid_temp=(fleft_temp+fright_temp)/2;//两点取平均值求中点
fValue=(mid_temp-Mid_temp)*Direction_Control_P1;//
fleft_flag=fright_flag=0;
}
g_fDirectionControlOutNew=fValue;
}
两轮电机差速输出:
voidMotor_OutPut(void)
{
FleftValue=(Speed-g_fDirectionControlOut);
FrightValue=(Speed+g_fDirectionControlOut);
if(FleftValue>Motor_Out_Max)
FleftValue=Motor_Out_Max;
if(FleftValueFleftValue=Motor_Out_Min;
if(FrightValue>Motor_Out_Max)
FrightValue=Motor_Out_Max;
if(FrightValueFrightValue=Motor_Out_Min;
Motor_left_foreward((int)FleftValue);
Motor_right_foreward((int)FrightValue);
}
主函数:
voidmain()
{
SetBusCLK_80M();
IO_Inits();
CCD_IO_Init();
PWM_Inits();
UART_Inits();
AD_Inits();
PIT_Inits();
EnableInterrupts;
for(;;)
{
}
}
1ms中断服务函数:
voidinterrupt66PIT0Interrupt(void)
{
staticunsignedcharTimerCnt20ms=0;
PITTF_PTF0=1;
TimerCnt20ms++;
if(1==TimerCnt20ms)
StartIntegration();
g_n1MSEventCount++;
if(5==g_n1MSEventCount)
{
g_n1MSEventCount=0;
Motor_OutPut();//电机输出5ms一次
}
if(TimerCnt20ms>=DIRECTION_CONTROL_PERIOD)//10ms控制方向
{
TimerCnt20ms=0;
g_nDirectionControlPeriod=0;
ImageCapture(Pixel);//采集图像
CCDSigmaControl();//CCD提取黑线
DirectionControl();//方向控制计算
}
}
6、调试总结
当数据测试时,程序错误,要首先找到出错的函数,对函数中各个变量进行观察,有时变量很多,循环多重不要急,对各个数据的观察,对程序的调试有很大的帮助.你也可以,先对几个变量熟悉后,在多重循环里,确定正确的数据,将其跳过调试.对有疑问的数据循环进行仔细观察.虽然这是比较省力气的活,但对复杂的数据错误并不是很有效.所以仔细观察每个数据的变化对调试的成功与否有决定性作用!
测试时,根本的错误并不一定在运行错误的函数内,或许在前面的函数内已经奠定了这些错误数据的基础,需要反过头来,对所有的的函数进行一项项的调试!
从程序运行的第一个函数开始调试.按照程序运行的步骤下去.一个个的确定函数的正确性,每确定一个函数,在以后的调试中可以减少对该函数的调试次数,或者直接跳到下一个函数.所谓的各个击破便是如此.对头文件中的各个函数的返回值和它所要传入的参变量及其功能更是需要注意。
调试时,需要对错误缩小范围,从整个程序到指定函数,再到指定区域,再到指定行,在对程序缩小范围或对编译没通过的程序缩小错误范围时可以用"/**/"来进行调试,确定正常范围,缩小错误范围.
7、设计心得体会
在这次为期两周课程设计的过程中,我深深的感触到了团队合作的重要性,尤其是在当今的社会工作中,一个人的力量在一个巨大的任务前是那么的渺小,必须靠多人合作才能共同完成。
在设计规划过程,我们小组三个人亲密无间的合作,使得本次课程设计能够非常顺利地完成,在课程设计的过程中,每个人都能按要求很好的完成分配给自己的任务,最后大家一起通过讨论把所有任务串连起来完成总的设计任务。
通过本次课程设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。
既让我们懂得了怎样将理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。
在设计过程中,总是会遇到这样或那样的问题。
有时一个问题可能会需要大家集体去查阅资料,做大量的工作,花大量的时间才能解决。
通过不断地发现问题,解决问题,自然而然,我的发现问题和解决问题的能力便在其中建立起来了。
这都为以后的工作积累了经验,同时也增强了我们解决问题的能力。
8、参考文献
【1】.王武、蔡逢煌.“嵌入式学习基础之TMS32OF2027”
【2】.谢丽聪等.“C语言学习基础”