飞思卡尔智能车程序汇总讲课稿
第五界飞思卡尔智能车大赛程序(光电组)
}
else if(turn_value==direction_turn[0])
{
turn_value=direction_turn[0];
speed_expect=speed_set[0];
}
break;
case 2:if(turn_value==direction_turn[0])
//The PIT module has no external pins.
//PIT 模式没有外部引脚
unsigned char light=0; //激光管检测标志
unsigned short turn_value=0; //转向的PWM数值
unsigned short direction_turn[7]={333,430,560,647,705,780,888}; //转向给定值初始化
{
turn_value=direction_turn[6];
speed_expect=speed_set[6];
}
else if(turn_value==direction_turn[6])
{
turn_value=direction_turn[6];
speed_expect=speed_set[6];
}
else if(turn_value==direction_turn[2])
{
turn_value=direction_turn[1];
speed_expect=speed_set[1];
}
break;
case 4:if(turn_value==direction_turn[1])
2024年飞思卡尔智能车总结(四篇)
2024年飞思卡尔智能车总结关于飞思____智能车轨迹追踪竞赛飞思____智能车竞赛,由飞思____公司赞助,是一项全国本科院校共同参与的科技竞赛活动。
今年,安徽省有幸成为第____届省级赛区,我们专科院校也有幸参与其中。
基于专业的匹配,我们系在本专业中选拔了一些同学,我非常荣幸能与我的团队并肩合作。
由于我们学校初次参加,缺乏经验,指导老师正与我们一起逐步探索解决方案。
我们选择使用B型车进行光电寻迹任务。
根据任务需求,老师将其划分为几个关键模块(寻迹模块、电源模块、驱动模块、测速模块),我负责的是寻迹模块的构建。
起初,对于黑白寻迹,我仅感到“神秘”。
通过查阅资料和老师的指导,我理解了其寻迹原理。
这主要基于黑白颜色对光的反射差异(白色完全反射,黑色完全吸收)来识别黑白线。
由于我们之前未接触过传感器知识,对此领域略感模糊,因此我专门投入时间学习传感器,理解了其在电路中的功能。
接下来,我们面临材料选择的挑战,市场上的光电管种类繁多,各校使用的也不尽相同。
我们需要找到一款适合我们车辆的光电管。
我最初在网上找到一些电路图,并购买了一些光电管进行焊接,但结果并未达到预期。
我一度认为问题出在光电管上,但即使更换为光电发射与接收一体管,问题仍未解决。
在一段时间的停滞和反复试验后,我尝试调整了与接收管串联的电阻值(从10k改为100k),意外地提高了接收距离,达到十几厘米。
这仍不理想,因为为了防止光电管之间的相互影响,每个光电管都需要加上套管,而我们购买的光电管无法满足这一要求。
经过深入研究,查阅资料,以及反复实验,我们最终选择了____公司的光电管(型号)。
我想强调的是,他人的经验可以作为参考,但不一定适用于我们自身,就像我之前选择的光电管电路图,可能在某些情况下适用,但在我们的特定需求下并不理想。
在探索阶段,逐步实验始终是至关重要的。
确定光电管后,我们进入了电路焊接阶段。
我们借鉴了其他学校的经验,初步决定使用____来配置光电管。
飞思卡尔A车编程讲座
徐海飞思卡尔A车编程讲座
• 1、如何入手编程? • 2、如何运用编程? • 3、如何改善编程?
徐海飞思卡尔A车编程讲座
• 1、如何入手编程?
可能有一部分同学已经对飞思卡尔的 单片机有了相当的了解了,但也有一部 分同学可能还处于迷茫的状态,一直在 观望,对于智能车的程序运行还是什么 什么都不了解。所以在这里我先讲一下 具体的模块化问题,帮助大家有个稍微 具体点的思路。
// clock SB 64分频
clock SB=clockB/64=1MHz 0.001ms //选择clock SB做时钟源 //周期10ms
徐海飞思卡尔A车编程讲座
• 2、如何运用编程?
徐海飞思卡尔A车编程讲座
• 2、如何运用编程? • 电机的PWM设定 • PWMPOL_PPOL0=1; //PWM0首先输出高电平 • PWMPOL_PPOL1=1; //PWM1首先输出高电平 • PWMCLK_PCLK0=1; // pwm0 用 SA 做时钟源 • PWMCLK_PCLK1=1; // pwm1 用 SA 做时钟源 • PWMCAE_CAE0=0; //左对齐输出 • PWMCAE_CAE1=0; //左对齐输出 • PWMSCLA=16;// CLOCK SA =CLOCK
徐海飞思卡尔A车编程讲座
• 1、如何入手编程?
•
如果你才刚刚上手,那么我不建议你 采用飞思卡尔的专用单片机进行编程。飞 思卡尔的单片机有许多内部寄存器,有些 同学可能连最基本的if语句的运行都没有实 现出来,如果直接上手使用MC9S12XS128 单片机可能反而会对前期的理解造成困扰。
徐海飞思卡尔A车编程讲座
•
•
•
•
[电子教案(PPT版本)]“飞思卡尔”杯智能汽车设计与实例教程 (3)[72页]
低频段 基本相同
用PWM波代替正弦半波
用一等幅不等宽的脉冲来代替 一个正弦半波
把正弦半波N等分,看成N个相
连的脉冲序列,宽度相等,但 幅值不等;
用矩形脉冲代替,等幅,不等 宽,中点重合,面积(冲量) 相等,宽度按正弦规律变化
相关概念
占空比:高电平保持的时间与该PWM 时钟周期的时间之比
分辨率:指占空比最小值 频率 双斜率/单斜率
单片机需要一个稳定的电压保持平稳工作,所以供电 最好设计为独立供电,避免与其他负载并联导致负载变化时 影响单片机供电引起问题。 推荐使用“三端固定式集成稳压器”来为单片机提供降压稳
压供电。
正 输 入 电 压
C1、C3 滤波电容
C2、C4 抑制芯片 自激振荡
常用的稳压芯片有78系列、LM2940、AMS1117 等系列。由于78系列的稳压芯片发热量较大,不作推 荐。在5V稳压方案中使用LM2940进行讲解,在3.3V 稳压方案中则使用AMS1117-3.3。
5V传感器获取的信号要经过缓冲芯片变换为 3.3V的信号输入到单片机中
2.2 电动机驱动电路设计
电动机的速度是根据传感器的反馈 随时调整的
脉宽调制(PWM) 需要驱动模块来放大单片机输出的
信号 PWM信号的占空比决定电动机的转速
,故电动机的调速可通过改变PWM信 号的占空比来实现 欲实现双向控制,就要使用H桥。H 桥可以实现电动机的双向调速
LM2940S(TO-263-3)
AMS1117-3.3(SOT-223)
思考题:总结常用的稳压芯片,列出他们的异同点
滤
波
检测稳
电
压IC是
容
否有正
LM2940S 5V稳压电路示例
飞思卡尔智能车开发教程Chap03
3.2 XS128的GPIO寄存器与GPIO构件封装
低功耗驱动寄存器
低功耗输出
记忆要点:输出时:低功耗驱动寄存器的一位:0—输出 功耗正常, 1—输出功耗为正常的1/5
上拉下拉电阻使能寄存器与上拉下拉选择寄 存器 禁用或允许上拉或下拉电阻
记忆要点:上拉下拉使能寄存器的一位:0—无上拉或 下拉,1—有上拉或下拉
记忆要点: 在引脚被定义为低功耗驱动时,可通过低功耗允许寄存器RDRIV中的相应位来定义是否低功耗驱动使能:0—不允许低功耗驱动使能 1—允许低功耗驱动使能。 输出时:数据寄存器的一位:0—输出低电平,1—输出高电平
3.2 XS128的GPIO寄存器与GPIO构件封装
ห้องสมุดไป่ตู้
A、B、E口共用的上拉电阻控制寄存器 (PUCR) 共用一个控制寄存器(PUCR)
3.2 XS128的GPIO寄存器与GPIO构件封装
3.2.1 XS128的GPIO寄存器 9个GPIO口(A口,B口,E口,J口,M口,P 口,S口,T,口AD口) (1)A、B、E口除具有独立的数据方向寄存器
与数据寄存器外,还共用上拉电阻控制寄存器 A、B、E、T、AD都有8个引脚,而J口有2 (PUCR)与低功耗驱动寄存器(RDRIV)。 个引脚,M口有6个引脚,S口有4个引脚, (2)T口、S口、M口、P口、J口有:数据方向 寄存器、数据寄存器、输入寄存器、低功耗驱动 P口有7个引脚 寄存器、上拉下拉使能寄存器、上拉下拉选择寄 存器。 引脚其他寄存器 (3)P口、J口还有两个寄存器,是中断使能寄 存器和中断标志寄存器。S口、M口还有线或寄 存器。
3.4 CW环境C语言工程文件的组织
• • • • •
prm 文件有五个组成部分构成 NAMES ~ END部分 SEGMENTS ~ END部分 PLACEMENT ~ END部分 STACKSIZE部分 VECTOR部分
飞思卡尔智能车总结标准(2篇)
飞思卡尔智能车总结标准脚踏实地艰苦风斗我有幸能够参加____年全国点学生飞思____智能车竞赛,在这次竞赛中我们学到了很多,有专业方面的知识,比如单片机,各类传感器,不同芯片间的通信等等,也学会了一些书本上没有的东西,比如团队合作,如何网上购买到好的元器件,如何布局pcb板上各个元器件的位置等。
为了这次比赛,学校提前好久就开始准备了。
只是我们的课程比较多,平时去实验室的机会不是很多,为此我们也很伤脑筋。
终于等到寒假了,我们几个全身心的投入到这次比赛的准备中。
每天早上起来买点早餐就直奔实验室,白天动手做下硬件,晚上回到宿舍在就看下理论,联系编程。
这样的日子我们一点都没有感觉到累,每天都希望自己会学到更懂得东西,好似饿了许久的动物,得到了食物一般。
每天感觉都那么充实,想想大学里前两年学到的东西还没有那个寒假学到的东西多。
寒假里我们把历届的技术报告都看了看,这期间学到不少东西,尤其是对各类元器件的认识及使用。
真是受益匪浅。
接下来就是一些以前失败的经验,希望能有所参考。
比赛前在不注重实际赛道和自己练习赛道的区别,赛道一变,以前调试的结果都将无效。
所以,谨记一点,一定要吧硬件做好,比赛前一定好好利用好试车时间,多注意自己的赛道和比赛的赛道的区别,注意摩擦程度,光线的亮暗,空气的潮湿程度等。
其次是传感器的____,这次我们选用的是激光做传感器。
这个传感器相比其它传感器有很多优点,比光电的射的远,而且稳定性高,但是激光的很贵,所以提前一定要看好电路图,____一定要够稳固,不然后期传感器坏起来就头疼了。
我们以前有好多关键时刻传感器出问题失败的例子,不胜枚举,经验惨痛。
如果____不好,系统不够稳定,导致在比赛失败,而且平时调试浪费了好多宝贵的调试时间。
这一点,谨记,硬件固定一定要牢固。
其次是装配,各个模块间的连接线固定不牢靠。
使得导线接触不良,导致小车参赛时好几次冲出跑道(其中一个传感器的输入信号接触不良造成的)。
第五届飞思卡尔智能车电磁组程序
第五届飞思卡尔智能车电磁组获奖程序MC9S12XS128单片机、用前置线圈检测磁感线、用无线蓝牙采集数据、干簧管检测起跑线磁铁。
#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */#include <stdio.h>/****************************************************************************** ******一·全局变量声明模块******************************************************************************* ******/typedef unsigned char INT8U;typedef unsigned int INT16U;typedef int INT32;typedef struct {INT8U d; //存放这一次AD转换的值}DATA;/****************************************************全局变量声明区*****************************************************/DA TA data[6]={0}; //全局变量数组,存放赛道AD转换最终结果INT8U a[6][8]={0}; //全局变量用来存放赛道AD转换中间结果INT8U cross0,cross1; //记录十字叉线#define LED PORTA_PA7#define LED_CS PORTA_PA0byte START ;INT16U dianji0;//用来存放上次电机转速PWM,来判断是否减速#define duojmax 9200 //向左转向最大值#define duojmid 8400 //打在中间#define duojmin 7600 //向右转向最小值#define duojcs 8000;#define dianjmax 1200#define dianjmin 10#define dianjmid 600static INT8U look=0,look1=0;int road_change[100]={0}; //判断赛道情况数组int roat_change0;int *r_change0; //指向数组最后一位int *r_change1; //指向数组倒数第二位int sum_front=0,sum_back=0; //分别存储数组前后两部分的和INT16U waittime=0;INT8U choise; //读拨码开关数值/******************************速度测量参数定时********************************/#define PIT0TIME 800 //定时0初值:设定为4MS 测一次速度,采一次AD值#define PIT1TIME 1390 //定时1初值:设定为7ms定时基值/*******************************脉冲记数变量*******************************/ static INT16U PulseCnt;//最终的脉冲数/******************************电机PID变量*********************************/float speed_return_m ;struct {int error0;int error1;int error2;int speed;int chage;float q0,q1,q2,Kp,Kd,Ki;}static SpeedPid;/********************************速度变量设定*******************************/ INT8U speedmax ; //直道加速INT8U speedmin ; //急转弯刹车INT8U speedmid ; //弯道内部限速INT8U speedaveg ; //INT8U breaktime ; //刹车时间////////////////////////////////////////////////////////////////////////////#define speederror_min 2 //允许的最小误差static int NowSpeed;static int speed_control; //存储pid输出值static int speed_return;/*******************************舵机PID参数******************************/struct{int error0;int error1;int error2;int chage;float Kp,Kd,Ki;}PositionPid;int change;static INT16U angle_left [52]={8550,8562,8574,8586,8598,8610,8622,8634,8646,8658,8670,8682,8694,8706,8718,8730,8 742,8754,8766,8778,8790,8802,8814,8826,8838,8850,8862,8874,8886,8898,8910,8922,8934,894 6,8958,8970,8982,8994,9006,9018,9030,9042,9054,9066,9078,9090,9102,9114,9126,9138,9150,9 150};static INT16U angle_right[52]={8250,8238,8226,8214,8202,8190,8178,8166,8154,8142,8130,8118,8106,8094,8 082,8070,8058,8046,8034,8022,8010,7998,7986,7974,7962,7950,7938,7926,7914,7902,7890,787 8,7866,7854,7842,7830,7818,7806,7794,7782,7770,7758,7746,7734,7722,7710,7698,7686,7674,7 662,7650,7650};static INT16U *angle_l=angle_left ,*angle_r=angle_right;static INT16U angle_control=duojmid; //舵机PWM最终控制量static INT16U angle_control0=duojmid;static INT16U angle_control1=duojmid;static INT16U break_pwm=0;INT16U angle_return;/****************************lcd液晶显示变量定义**************************/#define LCD_DATA PORTB#define LCD_RS PORTA_PA4 //PA6#define LCD_RW PORTA_PA5 //PA7#define LCD_E PORTA_PA6 //PA7INT8U start[]={"WELCOME TO LZJTU"};INT8U date[]={"2011-3-15 TUS"};INT8U time[]={"00:00:00"};INT16U Counter=0;INT8U Counter0=0,select=0,min=0;INT8U Counter1=0;INT8U LCD_choice;/**************************标志变量区*************************************/INT8U stop_flag=0;INT8U start_flag=0;INT8U backflag=0;INT8U AD_start ;INT8U zhijwan=0 ;INT8U shizi=0;/****************************************************************************** ******二·初始化函数模块******************************************************************************* ******//**************************************************************1. 芯片初始化--------MCUInit()**************************************************************/void MCUInit(void){//////////////////////////////////////////////////////////////////////////////////////////// ********总线周期计算方法******** //// fBUS=fPLL/2 //// fvoc=2*foscclk*(synr+1)/(refdv+1) //// PLL=2*16M*(219+1)/(69+1)=96Mhz /////////////////////////////////////////////////////////////////////////////////////////////////CLKSEL=0X00;PLLCTL_PLLON=1; //锁相环控制SYNR = 0X40|0X05;REFDV =0X80|0X01;POSTDIV=0X00;while( CRGFLG_LOCK != 1); //等待锁相环时钟稳定,稳定后系统总线频率为24MHz CLKSEL_PLLSEL = 0x01; //选定锁相环时钟PLLCTL=0xf1; //锁相环控制//时钟合成fpllclk=2*foscclk*(synr+1)/(refdv+1)//synr=2;refdv=1;外部时钟foscclk=16mb//fpllclk=48mb 总线时钟24mb// CRGFLG=0x40; //时钟复位控制// CRGINT=0x00 ; //时钟复位中断使能// CLKSEL =0xc0; //时钟选择//COPCTL =0x00;// ARMCOP =0x00; //看门狗复位// RTICTL =0x00; //实时中断}/**************************************************************2. AD转换初始化--------ADCInit()**************************************************************/void ADCInit(void){A TD0CTL1=0x00;A TD0CTL2=0x40; //0100,0000,自动清除使能控制位,忽略外部触发//转换结束允许中断,中断禁止A TD0CTL3=0xA4; //0100,0100,转换序列长度为4;FIFO模式,冻结模式下继续转换A TD0CTL4=0x05; //00001000,8位精度,PRS=5,ATDCLOCK=BusClock(24mb)/(5+1)*2,约为2MHz,采样周期位4倍AD周期A TD0DIEN=0x00; //输入使能禁止}/**************************************************************3. PWM初始化--------PWMInit()**************************************************************/void PWMInit(void) //PWM初始化{//总线频率24mb//1. 选择时钟:PWMPRCLK,PWMSCLA,PWMSCLB,PWMCLKPWME=0x00; //PWM通道关闭PWMPRCLK=0x01; //00010011时钟源A=BusClockA/2=48M/2=24MB;//低位clockA:01,45;高位clockB:23,67 时钟源B=48/1=48MBPWMSCLA =2; //ClockSA=ClockA/2/2=24MB/4=6MBPWMSCLB =2; //ClockSB=ClockB/2/2=12MBHzPWMCLK =0xFF; //通道均级联,均用SA,SB ,且都为6MB//2. 选择极性:PWMPOLPWMPOL =0xff; //电机正反转寄存器(PWMPOL)起始输出为高电平//3. 选择对齐方式:PWMCAEPWMCAE=0x00; //输出左对齐//4.PWMCTL PWM控制寄存器PWMCTL=0xF0; //01,23,45,67通道都级连,输出风别由1,3,5,7口控制//5. 使能PWM通道; PWME//6. 对占空比和周期编程//周期计算公式:输出周期=通道时钟周期*(PWMPERX+1)//占空比:=(PWMPERYX+1)/(PWMPERX+1)//开始时刻应使舵机打直,电机不转//1.通道45用来控制舵机PWMPWMPER45=60000-1; //PWM01=6MB/(60000)=100HzPWME_PWME5 =0; //舵机PWM通道开//2.通道23用来控制电机PWM1,通道01用来作为电机PWM2PWMPER23=1200-1;//电机正转PWM周期初始化。
飞思卡尔智能车完整程序
#include <hidef.h> /* common defines and macros */#include <mc9s12dg128.h> /* derivative information */ #include "lib.c"#include "funtion.h"#pragma LINK_INFO DERIV ATIVE "mc9s12dg128b"void s_ini(void) //系统初始化{uchar tmp;SYNR=3;REFDV=1;PLLCTL=0x50;delay(100);CLKSEL|=0x80; //超频到48M, 总线24M// INITRG = 0x00; /* lock registers block to 0x0000 */// INITRM = 0x39; /* lock Ram to end at 0x3FFF */// INITEE = 0x09; /* lock EEPROM block to end at 0x0fff */ delay(100);PORTB=0xff;DDRB=0xff;DDRA=0x00; //A口设置为输入PTH=0x00;DDRH=0x68; //PH1=inputPERH=0x97; //enable pullPPSH=0x80; //PH7,PH6,PH5 pull up, PH4 pull down PIEH=0x00; //使能遥控中断PH7PTP =0x00;DDRP=0x30; //PP4,PP5 outputDDRA=0x00;PUCR=0x01; //Port A enable pull upPTJ=0x00;DDRJ=0x00;PERJ=0x00; //diable pullPPSJ=0x80;PIEJ=0xc0; //enable PJ interruptPTT=0x00;DDRT=0x00; //PT7-PT4 =inputPERT=0x40; //enable pull for PT6// PACN3=0x00;// PACN2=0x00;// PACTL=0x40; //enable pulse couter B// DL YCT=0x00; //TIOS=0x80; //ch 7 compare modeOC7M=0x00;OC7D=0x00;// PACTL=0x74;TSCR2=0x0f; //when ch7 compare rst pre div =128 TC7=50000; //timer for 200mS //*/TSCR1=0x80; //enable timerTCTL1=0x00;TCTL2=0x00;TCTL3=0x20;TCTL4=0x00; //通道6下降沿输入捕捉TIE =0xC0; //中断使能ini_at45(); //初始化SPI0PWME=0xc3; //enable ch1, ch7PWMPOL=0xc3; //high level effectPWMDTY6=(uchar)(3000>>8);PWMDTY7=(uchar)(3000&0x00ff); //占空比PWMPER6=(uchar)(40000>>8); // 舵机PWMPER7=(uchar)(40000&0x00ff); //周期PWMDTY0=(uchar)(0>>8);PWMDTY1=(uchar)(0&0x00ff); //占空比// PWMPER0=(uchar)(2000>>8); //电机PWMPER1=(uchar)(2000&0x00ff); //周期PWMCLK=0x00;PWMPRCLK=0x40; //SB=Fck/1 SA=Fck/8PWMCTL=0x90; //4_16 bit PWM //*/SCI0BDH=0; //串口0初始化SCI0BDL=35; //set bandrate=57600bpsSCI0CR1=0x00;SCI0CR2=0x2c; //enable to sent and receivetmp=SCI0SR1;A TD0CTL2=0xc0; //enable ATD, interruptA TD0CTL3=0x08;A TD0CTL4=0x80; //8bit,A TD1CTL2=0xc0; //enable ATD, interruptA TD1CTL3=0x08;A TD1CTL4=0x80; //8bit,A TD0DIEN=0x00; //AD口数字输入使能,使能CCD输入A TD1DIEN=0x80; //CCD二元输入ECLKDIV=0x5C; //EEPROM时钟分频器INTCR=0xc0; //行同步中断, 下降沿触发,delay(10);SE_s; //舵机供电}interrupt 20 void sci0(void) //SCI0 interrupt{uchar sta,das;sta=SCI0SR1; //read the statedas=SCI0DRL;if(sta&0x40) //sent finish{}if(sta&0x20) //receve a data{speed(das*8);SCI0DRL=das;}}interrupt 15 void ch7(void) //ch7 interrupt 266mS {TFLG1=0x80; //clr flagif(m_en) //LED falshPORTB^=0xf0;}void choice(void) //choice a funtion{uchar kv;uchar pp=0;uchar tmp=0;V1: kv=0;wu(CN1[0],CN1[1],CN1[2],CN1[3]); //displayset(2);go(0,pp); //flashfor(;;) //loop{kv=key();if(kv==5&&pp) //lastpp--,go(0,pp);else if(kv==6&&pp<3) //nextpp++,go(0,pp);if(kv==8||kv==10) //enter{if(pp==0) //进入比赛{match();goto V1;}else if(pp==1) //传感受器测方式{text();goto V1;}else if(pp==2) //CCD 测试{t_ccd();goto V1;}else if(pp==3) //参数设定{setting();goto V1;}} //*/}}void main(void) {/* put your own code here */volatile uint t1=0;s_ini(); //系统初始化EnableInterrupts;get_s(); //获取设定参数choice(); //shoicefor(;;) {} /* wait forever *//* please make sure that you never leave this function */ }/****************************************************************************** FILE : datapage.cPURPOSE : paged data access runtime routinesMACHINE : Freescale 68HC12 (Target)LANGUAGE : ANSI-CHISTORY : 21.7.96 first version created******************************************************************************/#include "hidef.h"#include "non_bank.sgm"#include "runtime.sgm"#ifndef __HCS12X__ /* it's different for the HCS12X. See the text below at the #else // __HCS12X__ *//*According to the -Cp option of the compiler the__DPAGE__, __PPAGE__ and __EPAGE__ macros are defined.If none of them is given as argument, then no page accesses should occur andthis runtime routine should not be used !To be on the save side, the runtime routines are created anyway.If some of the -Cp options are given an adapted versions which only covers theneeded cases is produced.*//* if no compiler option -Cp is given, it is assumed that all possible are given : *//* Compile with option -DHCS12 to activate this code */#if defined(HCS12) || defined(_HCS12) || defined(__HCS12__) /* HCS12 family has PPAGE register only at 0x30 */#define PPAGE_ADDR (0x30+REGISTER_BASE)#ifndef __PPAGE__ /* may be set already by option -CPPPAGE */#define __PPAGE__#endif/* Compile with option -DDG128 to activate this code */#elif defined DG128 /* HC912DG128 derivative has PPAGE register only at 0xFF */#define PPAGE_ADDR (0xFF+REGISTER_BASE)#ifndef __PPAGE__ /* may be set already by option -CPPPAGE */#define __PPAGE__#endif#elif defined(HC812A4)/* all setting default to A4 already */#endif#if !defined(__EPAGE__) && !defined(__PPAGE__) && !defined(__DPAGE__)/* as default use all page registers */#define __DPAGE__#define __EPAGE__#define __PPAGE__#endif/* modify the following defines to your memory configuration */#define EPAGE_LOW_BOUND 0x400u#define EPAGE_HIGH_BOUND 0x7ffu#define DPAGE_LOW_BOUND 0x7000u#define DPAGE_HIGH_BOUND 0x7fffu#define PPAGE_LOW_BOUND (DPAGE_HIGH_BOUND+1)#define PPAGE_HIGH_BOUND 0xBFFFu#define REGISTER_BASE 0x0u#ifndef DPAGE_ADDR#define DPAGE_ADDR (0x34u+REGISTER_BASE)#endif#ifndef EPAGE_ADDR#define EPAGE_ADDR (0x36u+REGISTER_BASE)#endif#ifndef PPAGE_ADDR#define PPAGE_ADDR (0x35u+REGISTER_BASE)#endif/*The following parts about the defines are assumed in the code of _GET_PAGE_REG :- the memory region controlled by DPAGE is above the area controlled by the EPAGE andbelow the area controlled by the PPAGE.- the lower bound of the PPAGE area is equal to be the higher bound of the DPAGE area + 1*/#if EPAGE_LOW_BOUND >= EPAGE_HIGH_BOUND || EPAGE_HIGH_BOUND >= DPAGE_LOW_BOUND || DPAGE_LOW_BOUND >= DPAGE_HIGH_BOUND || DPAGE_HIGH_BOUND >= PPAGE_LOW_BOUND || PPAGE_LOW_BOUND >= PPAGE_HIGH_BOUND#error /* please adapt _GET_PAGE_REG for this non default page configuration */#endif#if DPAGE_HIGH_BOUND+1 != PPAGE_LOW_BOUND#error /* please adapt _GET_PAGE_REG for this non default page configuration */#endif/* this module does either control if any access is in the bounds of the specified page or *//* ,if only one page is specified, just use this page. *//* This behavior is controlled by the define USE_SEVERAL_PAGES. *//* If !USE_SEVERAL_PAGES does increase the performance significantly *//* NOTE : When !USE_SEVERAL_PAGES, the page is also set for accesses outside of the area controlled *//* by this single page. But this is should not cause problems because the page is restored to the old value before any other access could occur */#if !defined(__DPAGE__) && !defined(__EPAGE__) && !defined(__PPAGE__)/* no page at all is specified *//* only specifying the right pages will speed up these functions a lot */#define USE_SEVERAL_PAGES 1#elif defined(__DPAGE__) && defined(__EPAGE__) || defined(__DPAGE__) && defined(__PPAGE__) || defined(__EPAGE__) && defined(__PPAGE__)/* more than one page register is used */#define USE_SEVERAL_PAGES 1#else#define USE_SEVERAL_PAGES 0#if defined(__DPAGE__) /* check which pages are used */#define PAGE_ADDR PPAGE_ADDR#elif defined(__EPAGE__)#define PAGE_ADDR EPAGE_ADDR#elif defined(__PPAGE__)#define PAGE_ADDR PPAGE_ADDR#else /* we do not know which page, decide it at runtime */#error /* must not happen */#endif#endif#if USE_SEVERAL_PAGES /* only needed for several pages support *//*--------------------------- _GET_PAGE_REG --------------------------------Runtime routine to detect the right register depending on the 16 bit offset partof an address.This function is only used by the functions below.Depending on the compiler options -Cp different versions of _GET_PAGE_REG are produced.Arguments :- Y : offset part of an addressResult :if address Y is controlled by a page register :- X : address of page register if Y is controlled by an page register- Zero flag cleared- all other registers remain unchangedif address Y is not controlled by a page register :- Zero flag is set- all registers remain unchanged--------------------------- _GET_PAGE_REG ----------------------------------*/#if defined(__DPAGE__)#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEstatic void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */__asm {L_DPAGE:CPY #DPAGE_LOW_BOUND ;// test of lower bound of DPAGE#if defined(__EPAGE__)BLO L_EPAGE ;// EPAGE accesses are possible#elseBLO L_NOPAGE ;// no paged memory below accesses#endifCPY #DPAGE_HIGH_BOUND ;// test of higher bound DPAGE/lower bound PPAGE#if defined(__PPAGE__)BHI L_PPAGE ;// EPAGE accesses are possible#elseBHI L_NOPAGE ;// no paged memory above accesses#endifFOUND_DPAGE:LDX #DPAGE_ADDR ;// load page register address and clear zero flagRTS#if defined(__PPAGE__)L_PPAGE:CPY #PPAGE_HIGH_BOUND ;// test of higher bound of PPAGEBHI L_NOPAGEFOUND_PPAGE:LDX #PPAGE_ADDR ;// load page register address and clear zero flagRTS#endif#if defined(__EPAGE__)L_EPAGE:CPY #EPAGE_LOW_BOUND ;// test of lower bound of EPAGEBLO L_NOPAGECPY #EPAGE_HIGH_BOUND ;// test of higher bound of EPAGEBHI L_NOPAGEFOUND_EPAGE:LDX #EPAGE_ADDR ;// load page register address and clear zero flagRTS#endifL_NOPAGE:ORCC #0x04 ;// sets zero flagRTS}}#else /* !defined(__DPAGE__) */#if defined( __PPAGE__ )#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEstatic void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */__asm {L_PPAGE:CPY #PPAGE_LOW_BOUND ;// test of lower bound of PPAGE#if defined( __EPAGE__ )BLO L_EPAGE#elseBLO L_NOPAGE ;// no paged memory below#endifCPY #PPAGE_HIGH_BOUND ;// test of higher bound PPAGEBHI L_NOPAGEFOUND_PPAGE:LDX #PPAGE_ADDR ;// load page register address and clear zero flagRTS#if defined( __EPAGE__ )L_EPAGE:CPY #EPAGE_LOW_BOUND ;// test of lower bound of EPAGEBLO L_NOPAGECPY #EPAGE_HIGH_BOUND ;// test of higher bound of EPAGEBHI L_NOPAGEFOUND_EPAGE:LDX #EPAGE_ADDR ;// load page register address and clear zero flagRTS#endifL_NOPAGE: ;// not in any allowed page area;// its a far access to a non paged variableORCC #0x04 ;// sets zero flagRTS}}#else /* !defined(__DPAGE__ ) && !defined( __PPAGE__) */#if defined(__EPAGE__)#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEstatic void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */__asm {L_EPAGE:CPY #EPAGE_LOW_BOUND ;// test of lower bound of EPAGEBLO L_NOPAGECPY #EPAGE_HIGH_BOUND ;// test of higher bound of EPAGEBHI L_NOPAGEFOUND_EPAGE:LDX #EPAGE_ADDR ;// load page register address and clear zero flagRTSL_NOPAGE: ;// not in any allowed page area;// its a far access to a non paged variableORCC #0x04 ;// sets zero flagRTS}}#endif /* defined(__EPAGE__) */#endif /* defined(__PPAGE__) */#endif /* defined(__DPAGE__) */#endif /* USE_SEVERAL_PAGES *//*--------------------------- _SET_PAGE --------------------------------Runtime routine to set the right page register. This routine is used if the compilerdoes not know the right page register, i.e. if the option -Cp is used for more thanone pageregister or if the runtime option is used for one of the -Cp options.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- page part written into the correct page register.- the old page register content is destroyed- all processor registers remains unchanged--------------------------- _SET_PAGE ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _SET_PAGE(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGESTAB 0,X ;// set page registerL_NOPAGE:PULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {STAB PAGE_ADDR ;// set page registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_8 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- value to be read in the B register- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_8 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_8(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHA ;// save A registerLDAA 0,X ;// save page registerSTAB 0,X ;// set page registerLDAB 0,Y ;// actual load, overwrites pageSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:LDAB 0,Y ;// actual load, overwrites pagePULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerLDAB 0,Y ;// actual load, overwrites pageSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_16 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- value to be read in the Y register- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_16 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_16(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHA ;// save A registerLDAA 0,X ;// save page registerSTAB 0,X ;// set page registerLDY 0,Y ;// actual load, overwrites addressSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:LDY 0,Y ;// actual load, overwrites addressPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerLDY 0,Y ;// actual load, overwrites addressSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_24 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument. Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- value to be read in the Y:B registers- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_24 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_24(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHA ;// save A registerLDAA 0,X ;// save page registerSTAB 0,X ;// set page registerLDAB 0,Y ;// actual load, overwrites page of addressLDY 1,Y ;// actual load, overwrites offset of addressSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:LDAB 0,Y ;// actual load, overwrites page of addressLDY 1,Y ;// actual load, overwrites offset of addressPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerLDAB 0,Y ;// actual load, overwrites page of addressLDY 1,Y ;// actual load, overwrites offset of addressSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_32 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- low 16 bit of value to be read in the D registers- high 16 bit of value to be read in the Y registers- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_32 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_32(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGELDAA 0,X ;// save page registerPSHA ;// put it onto the stackSTAB 0,X ;// set page registerLDD 2,Y ;// actual load, low wordLDY 0,Y ;// actual load, high wordMOVB 1,SP+,0,X ;// restore page registerPULX ;// restore X registerRTSL_NOPAGE:LDD 2,Y ;// actual load, low wordLDY 0,Y ;// actual load, high wordPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {LDAA PAGE_ADDR ;// save page registerPSHA ;// put it onto the stackSTAB PAGE_ADDR ;// set page registerLDD 2,Y ;// actual load, low wordLDY 0,Y ;// actual load, high wordMOVB 1,SP+,PAGE_ADDR ;// restore page registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_8 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B register- value to be stored in the B registerResult :- value stored at the address- all registers remains unchanged- all page register still contain the same value--------------------------- _STORE_FAR_8 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_8(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHB ;// save B registerLDAB 0,X ;// save page registerMOVB 0,SP, 0,X ;// set page registerSTAA 0,Y ;// store the value passed in ASTAB 0,X ;// restore page registerPULB ;// restore B registerPULX ;// restore X registerRTSL_NOPAGE:STAA 0,Y ;// store the value passed in APULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHB ;// save A registerLDAB PAGE_ADDR ;// save page registerMOVB 0,SP,PAGE_ADDR ;// set page registerSTAA 0,Y ;// store the value passed in ASTAB PAGE_ADDR ;// restore page registerPULB ;// restore B registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_16 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B register- value to be stored in the X registerResult :- value stored at the address- all registers remains unchanged- all page register still contain the same value--------------------------- _STORE_FAR_16 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_16(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHALDAA 0,X ;// save page registerSTAB 0,X ;// set page registerMOVW 1,SP,0,Y ;// store the value passed in XSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:STX 0,Y ;// store the value passed in XPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerSTX 0,Y ;// store the value passed in XSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_24 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B register- value to be stored in the X:A registers (X : low 16 bit, A : high 8 bit)Result :- value stored at the address- all registers remains unchanged- all page register still contain the same value--------------------------- _STORE_FAR_24 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_24(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHALDAA 0,X ;// save page registerSTAB 0,X ;// set page registerMOVW 1,SP, 1,Y ;// store the value passed in XMOVB 0,SP, 0,Y ;// store the value passed in ASTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:STX 1,Y ;// store the value passed in XSTAA 0,Y ;// store the value passed in XPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerMOVB 0,SP, 0,Y ;// store the value passed in ASTX 1,Y ;// store the value passed in XSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_32 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address is on the stack at 3,SP (just below the return address)- value to be stored in the X:D registers (D : low 16 bit, X : high 16 bit)Result :- value stored at the address- all registers remains unchanged- the page part is removed from the stack- all page register still contain the same value--------------------------- _STORE_FAR_32 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_32(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHDLDAA 0,X ;// save page registerMOVB 6,SP, 0,X ;// set page registerMOVW 2,SP, 0,Y ;// store the value passed in X (high word)MOVW 0,SP, 2,Y ;// store the value passed in D (low word)STAA 0,X ;// restore page registerPULD ;// restore A registerBRA doneL_NOPAGE:MOVW 0,SP, 0,Y ;// store the value passed in X (high word)STD 2,Y ;// store the value passed in D (low word) done:PULX ;// restore X registerMOVW 0,SP, 1,+SP ;// move return addressRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHD ;// save D registerLDAA PAGE_ADDR ;// save page registerLDAB 4,SP ;// load page part of addressSTAB PAGE_ADDR ;// set page registerSTX 0,Y ;// store the value passed in XMOVW 0,SP, 2,Y ;// store the value passed in D (low word)STAA PAGE_ADDR ;// restore page registerPULD ;// restore D registerMOVW 0,SP, 1,+SP ;// move return addressRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _FAR_COPY_RC --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of the source int the X register- page part of the source in the A register- offset part of the dest int the Y register- page part of the dest in the B register- number of bytes to be copied is defined by the next 2 bytes after the return address.Result :- memory area copied- no registers are saved, i.e. all registers may be destroyed- all page register still contain the same value as before the call- the function returns after the constant defining the number of bytes to be copiedstack-structure at the loop-label:0,SP : destination offset2,SP : source page3,SP : destination page4,SP : source offset6,SP : points to length to be copied. This function returns after the sizeA usual call to this function looks like:struct Huge src, dest;; ...LDX #srcLDAA #PAGE(src)LDY #destLDAB #PAGE(dest)JSR _FAR_COPY_RCDC.W sizeof(struct Huge); ...--------------------------- _FAR_COPY_RC ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _FAR_COPY_RC(void) {#if USE_SEVERAL_PAGES__asm {DEX ;// source addr-=1, because loop counter ends at 1PSHX ;// save source offsetPSHD ;// save both pagesDEY ;// destination addr-=1, because loop counter ends at 1PSHY ;// save destination offsetLDY 6,SP ;// Load Return addressLDX 2,Y+ ;// Load Size to copySTY 6,SP ;// Store adjusted return addressloop:LDD 4,SP ;// load source offset。
飞思卡尔智能车程序汇总
#include "24c02.h"
#include "button.h"
#define servo_period 20 //ms
#define motor_pwm_frequ 1 //khz
void delay(unsigned int ms)
{
unsigned int i;
PWMPER23 = 80/4*servo_period*125;
PWMPER01 = 80/4*servo_period*125;
PWMDTY67 =0;
PWMDTY45 =0;
PWMDTY23 =0;
PWMDTY01 =0;
}
void main(void) {
/* put your own code here */
disply_listchar(0,3," TURN POWER OFF ",1);
disply_listchar(0,4,"=================",1);
disply_listchar(0,5," ",1);
delay(setnum[1]*100);
PORTB_PB0=0;
}
}
3.电机程序
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
unsigned char j;
for(i=0;i<ms;i++)
飞思卡尔智能车总结范本(二篇)
飞思卡尔智能车总结范本先静下心来看几篇技术报告,可以是几个人一起看,边看边讨论,大致了解智能车制作的过程及所要完成的任务。
看完报告之后,对智能车也有了大概的了解,其实总结起来,要完成的任务也很简单,即输入模块-控制-输出。
(1)输入模块。
各种传感器(光电,电磁,摄像头),原理不同,但功能都一样,都是用来采集赛道的信息。
这里面就包含各种传感器的原理,选用,传感器电路的连接,还有传感器的____、传感器的抗干扰等等需要大家去解决的问题。
(2)控制模块。
传感器得到了我们想要的信息,进行相应的ad转换后,就把它输入到单片机中,单片机负责对信息的处理,如除噪,筛选合适的点等等,然后对不同的赛道信息做出相应的控制,这也是智能车制作过程中最为艰难的过程,要想出一个可行而又高效的算法,确实不是一件容易的事。
这里面就涉及到单片机的知识、c语言知识和一定的控制算法,有时为了更直观地动态控制,还得加入串口发送和接收程序等等。
(3)输出模块。
好的算法,只有通过实验证明才能算是真正的好算法。
经过分析控制,单片机做出了相应的判断,就得把控制信号输出给电机(控制速度)和舵机(控制方向),所以就得对电机和舵机模块进行学习和掌握,还有实现精确有效地控制,又得加入闭环控制,pid算法。
明确了任务后,也有了较为清晰的控制思路,接下来就着手弄懂每一个模块。
虽然看似简单,但实现起来非常得不容易,这里面要求掌握电路的知识,基本的机械硬件结构知识和单片机、编程等计算机知识。
最最困难的是,在做的过程中会遇到很多想得到以及想不到的事情发生,一定得细心地发现问题,并想办法解决这些问题。
兴趣是首要的,除此之外,一定要花充足的时间和精力在上面,毕竟,有付出就会有收获,最后要明确分工和规划好进度。
飞思卡尔智能车总结范本(二)刚进入大学半年,我就有幸参加飞思____智能车比赛。
说实话,刚报名参加这项赛事的时候我只是抱着好奇的心态去参加,可是真的进入了这个团队的时候,我发现这个活动是多么的吸引我,让我顿时在枯燥的学习生活中找到了乐趣。
智能车源程序+很详细 -
3.1舵机部分为了使转弯更加灵活,对舵机相关部分作了部分改动。
首先,我们将舵机力臂加长85mm。
这样,对于同样的转弯角度值,只需更小的舵机转角,减小了舵机转弯时惯性带来的弊端。
其次,我们将舵机反装,使舵机连杆水平,因为此时舵机提供的力全部用在转弯上。
3.2前轮部分为了增加前轮转弯时的稳定性,对前轮相关部分进行了部分改动。
首先,更改前后垫片的数量,使前轮主销后倾,这样,车轮具有更好的自动回正功能。
其次,更改连杆的长度,使车轮外倾,车轮转弯时,前半部分重心上移,促使赛车转弯更加稳定。
再次,我们通过更改舵机连杆的长度,增加前轮前束,同样增加了前轮的稳定性。
3.3底盘部分为了提高赛车运行时的稳定性,对地盘相关部分作了部分改动。
首先,前轮相关位置加垫片,降低了前轮重心。
其次,更改后轮车轴处的调节块,使后轮重心升高,这样,车身前倾,一定程度上,增加了车的稳定性。
3.4后轮部分首先,更换后轮轮距调节块,使后轮两轮之间间距加大。
这样,车在转弯时不容易产生侧滑。
其次,调节后轮差速,使赛车转弯更加灵活。
4.1电源部分为了能使智能车系统能正常工作,就需要对电池电压调节。
其中,单片机系统、车速传感器电路需要5V电压,路径识别的光电传感器和接收器电路电压工作为5V、伺服电机工作电压范围4.8V到6V(或直接由电池提供),直流电机可以使用7.2V 2000mAh Ni-cd 蓄电池直接供电。
考虑到由于驱动电机引起的电压瞬间下降的现象,因此采用低压降的三端稳压器成为必然。
我们在采用lm7805,和lm7806作为稳牙芯片。
经试验电压纹波小,完全可以满足要求。
图4.2 7805电路图电池(7.2v ) 2000mAh Ni-cd稳压电路电机图4.1系统电压调节图 5V对管单片机舵机测速板6V7.2V图4.3 电源模块示意图4.2电机驱动电路电机驱动使用飞思卡尔专用电机驱动芯片MC33886。
驱动电路如图4.4 所示。
为了增大驱动能力,减少单片发热量,电路采用两片MC33886 并联的方案。
第六届飞思卡尔智能车东北赛区经验交流ppt课件
1
b1 c
1 a h2
h2
h2 x2
100 100
k
x2 x2
d k k
d d
C XA
B E
x 50ac ab
2bc ac ab
从而准确知道了信号线的实际位置了。
PID算法+模糊算法
• 在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控 制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。 PID控制器是一种最优控制。PID调节规律是连续系统动态品质校正的 一种有效方法,它的参数整定方式简便,结构改变灵活(PI、 PD、…)。
• 如果这时差速过紧,造成两个轮子互相角力以使自己得 到适当的转速,从而使总体抓地力下降。
• 另一方面,如果差速比较松,当一个轮子失去抓地力的 时候(比如通过一个起伏),会造成过度的空转,使另外 一个轮子失去动力。这样会减少加速的反应。
底盘调整
• 前轮主销后倾角的作用是在车轮 偏转后形成一回正力矩,会阻碍 车轮偏转。
r2
→ dB
0 4
Idl sin r2
元磁场积分:B
A2 dB 0 I
A1
4
A2 dl sin
A1
r2
通过空心螺绕环可以容易导出含磁芯的线圈的自感能为:
Wm
1 2
LI 2
1 2
0n2I 2V
1 2
B HV
V就是它的体积,所以磁能密度为:
m
Wm V
竞赛经验介绍
我们经历过
首届大连理 工大学智能 车竞赛
我们经历过
工学]长安大学飞思卡尔智能车专题讲座
车模简介
车模调校的主要参数: • 主销后倾角 • 前轮外倾角 • 前轮前束 • 减震弹簧预紧力 • 差速器磨合
主销后倾角 Caster
前轮前束 Toe
前轮外倾角 Camber
A型底盘
B型底盘
C型底盘
飞思卡尔 MC9S12XS128单片机
“飞思卡尔”杯智能汽车大赛赛车分类 摄像头组 光电组 电磁组
转向控制:在不允许更换舵机的限制下,合 理设计控制算法、选择适当的控制参数、充 分挖掘机械调整的余地,可加快电机的响应 速度,改善赛车的转向性能。
如何实现?
转向系简介
转向特性简介
关于赛道检测方式
赛道路径几何特点
由直线和圆弧组成;
赛道路径检测内容
确定路径中心位置; 确定路径方向; 确定路径曲率;
光电组
基于光电管赛道参数检测方法
光电管阵列优缺点:
优点:简单、响应快速等; 缺点:
空间分辨率低;
水平分辨率: < 16 pixel /线;(可以采用细分的方 法进行优化);受到大赛规则传感器个数限制;
垂直分辨率:只能检测一点位置;
占用CPU端口资源多; 安装固定、接线较困难; 容易受到外界环境影响;
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8
3 9
4 0
4 1
4 2
4 3
4 4
4 5
4 6
4 7
4 8
4 9
5 0
5 1
5 2
5 3
5 4
5 5
5 6
5 7
5 8
5 9
6 0
6 1
6 2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
disply_listchar(0,5," ",1);
while(1);
}
}
}
DDRA=0x00;
DDRB_DDRB0=1;
for(;;)
{
delay(setnum[0]*100);
PORTB_PB0=1;
disply_number((i/6)*42+16,i%6,setnum[i],5);
}
if(btn_change())
{
cur_sel=0;
for(i=0;i<12;i++)
{
disply_listchar((i/6)*42,i%6,lcd_show[i],(cur_sel==i)?0:1);
disply_number((i/6)*42+16,i%6,setnum[i],5);
#include "lcd5110.h"
#include "24c02.h"
#include "button.h"
void delay(unsigned int ms)
{
unsigned int i;
unsigned char j;
for(i=0;i<ms;i++)
{
for(j=0;j<100;j++);
delay(setnum[1]*100);
PORTB_PB0=0;
}
}
3.电机程序
vPLLInit();
lcd_init();
init_24c02();
init_btn();
// EnableInterrupts;
for(i=0;i<12;i++)setnum[i]=RdEEPROM(i); //读取24c02
for(i=0;i<12;i++) //显示初值
{
disply_listchar((i/6)*42,i%6,lcd_show[i],1);
}
}
/******************************倍频*****************************************/
void vPLLInit(void)
{
unsigned char refdv;
refdv=3;
CLKSEL=0X00;//disengage PLL to system
}
for(;;)
{
if(btn_add()){setnum[cur_sel]++;
disply_number((cur_sel/6)*42+16,cur_sel%6,setnum[cur_sel],5);
}
if(btn_sub())
{
setnum[cur_sel]--;
disply_number((cur_sel/6)*42+16,cur_sel%6,setnum[cur_sel],5);
PLLCTL_PLLON=1;//turn on PLL
SYNR =0xc0 | ((80/(refdv+1))-1);
REFDV=0x40 | refdv;
POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
_asm(nop); //BUS CLOCK=80M
disply_listchar(0,0," SMART CAR ",1);
disply_listchar(0,1," SAVE OK ",1);
disply_listchar(0,2,"=================",1);
disply_listchar(0,3," TURN POWER OFF ",1);
}
if(btn_change())
{
cur_sel++;
if(cur_sel>11)cur_sel=0;
for(i=0;i<12;i++) disply_listchar((i/6)*42,i%6,lcd_show[i],(cur_sel==i)?0:1);
}
if(btn_sav())
{
for(i=0;i<12;i++)WrEEPROM(i,setnum[i]);
{
unsigned int i;
unsigned char j;
for(i=0;i<ms;i++)
{
for(j=0;j<100;j++);
}
}
void main(void) {
/* put your own code here */
EnableInterrupts;
DDRA=0x00;
DDRB_DDRB0=1;
_asm(nop);
while(!(CRGFLG_LOCK==1));//when pll is steady ,then use it;
CLKSEL_PLLSEL =1;//engage PLL to system;
}
/******************************倍频*****************************************/
飞思卡尔智能车程序汇总
1.流水灯程序:
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
void delay(unsigned int ms)
for(;;)
{
delay(25000);
PORTB_PB0=1;
delay(25000);
PORTB_PB0=0;
}
}
2.液晶屏按键程序
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
void main(void) {
/* put your own code here */
unsigned char i;
unsigned char setnum[12];
unsigned char cur_sel;
const char lcd_show[12][4]={"MID\0","LEF\0","RIG\0","Kp \0","Kd \0","K1 \0","K2 \0","STP\0","MAX\0","MIN\0","HTM\0","HTX\0"};