飞思卡尔2014mc9s12xs128学习及智能车制作笔记

飞思卡尔2014mc9s12xs128学习及智能车制作笔记
飞思卡尔2014mc9s12xs128学习及智能车制作笔记

S128学习笔记(一)

GPIO 模块

S128 IO操作主要有三个寄存器数据寄存器(PORTX)数据方向寄存器(DDRX) 上拉上拉电阻控制寄存器PUCR)

一. GPIO概述

通用I/O:GPIO(General Purpose I/O),是I/O的最基本形式,它是一组输入或输出引脚,有时也称为并行I/O(parallel I/O)。作为普通输入引脚,MCU内部程序可以读取该引脚,知道该引脚是“1”(高电平)或“0”(低电平),即开关量输入。作为普通输出引脚,MCU内部程序由该引脚输出“1”(高电平)或“0”(低电平),即开关量输出。大多数通用I/O引脚可以通过编程来设定工作方式为输入或输出,称之为双向通用I/O。

2. I/O口的使用方法

MC9S12DG128 MCU有10个普通I/O口,分别是A口、B口、E口、H口、J口、K口、M 口、P口、S口、T口。这些引脚中的大部分具有双重功能,其中A、B、E、K口只用做GPIO 功能,这里仅讨论它们编程方法。使用这些I/O口主要设置如下寄存器:

1)数据方向寄存器(Data Direction Register x,DDRx)

DDRx的第7~0位分别记为DDRx7~DDRx0,这些位分别控制着x口引脚PORTx7~PORTx0是输入还是输出,若DDRxn=0,则引脚PORTAxn为输入,若DDRxn=1,则引脚PORTxn为输出。复位时DDRx为$00。(注:x代表A、B、E、K口中的某一个,n表示某一位)

2)数据寄存器(Port x I/O Register,PORTx)

PORTx的第7~0位分别记为PORTx7~PORTx0。若A口的某一引脚PORTxn被定义。

成输出,程序使x口I/O寄存器PORTx的相应位PORTxn=0,则引脚PORTxn输出“低电平”;程序使PORTxn=1,则引脚PORTxn输出“高电平”。若x口的某一引脚PORTxn被定义成输入,程序通过读取x口I/O寄存器PORTx,获得输入情况,0表示输入为“低电平”,1表示输入为“高电平”。

3)上拉电阻控制寄存器(Pull Up Control Register,PUCR)

A口、B口、E口、K口分别都有上拉电阻,它们共用一个控制寄存器(PUCR)。PUCR的第0位称为PUPAE(标识中“A”代表A口;B口、E口、K口等亦如此),含义是A口的上拉电阻使能位。当PUPAE=1时,A口的8个引脚中被定义为输入的引脚有内部上拉电阻。类似地,有设定B口、E口、K口上拉电阻的位:PUPBE、PUPEE、PUPKE,分别是PUCR的第1、4、7位。PUCR的其它位未定

记忆要点:在引脚PORTA被定义成输入时,可通过上拉电阻允许寄存器PUCR中的PUPAE 位来定义有无内部上拉电阻:0—没有内部上拉电阻1—有内部上拉电阻

GPIO的基本编程方法举例

在对有关基本寄存器功能有所了解后,下面将以对D口第3脚的GPIO功能演示代码为例让读者对上述寄存器有更深的了解,完整工程请参阅随书光盘中本章的例程。首先,为了程序通用性,对要设置的引脚进行宏定义,如需对第2脚操作只需将下面的“3”修改为“2”即可。现在,设要使用的引脚名叫“RUNpin”,接在TC口的第3引脚上,则需使用如下宏定义:#define RUN_PORT PORT_D //灯使用的端口#define RUNpin 3 //用RUNpin代替“3”注意,PTC是一个代表D端口寄存器的8位地址指针,在芯片的映像文件中定义。这样,程序员就可以用普通C语言对该寄存器进行操作了。当需要对寄存器的具体位进行设置,而不改变该寄存器中其他位的值时,通常会使用到位操作。【例如】:RUN_PORT &= 0b11110111 //表示将RUN_PORT的第3位设置为0 RUN_PORT |= 0b00001000 //表示将RUN_PORT的第3

位设置为1 为了程序通用性,以上两行代码需要写成:45

RUN_PORT &= ~(0x01<< RUNpin) //将RUN_PORT的第3位设置为0 RUN_PORT |= 0x01<< RUNpin //将RUN_PORT的第3位设置为1 这样做的好处是,当需要改变所使用的引脚后,只需要改变RUN_PORT和RUNpin的宏定义,这也是软件工程的基本原则的体现。另外,若要对连续几位进行操作,则可以用以下代码来实现:RUN_PORT &= ~(0x03<< RUNpin) //将RUN_PORT的第3、4位都设置为0 RUN_PORT |= 0x03<< RUNpin //将RUN_PORT的第3、4位都设置为1 以上的例子说明了怎样设置具体寄存器的单独1位或连续2位的位值,若要对连续的3位或更多的位进行设置,只需要更改0x03为合适的值即可(3位对应0x07)。

二.串口模块

主要对两类寄存器进行操作即控制寄存器和状态寄存器

1.0SCI(serial communicstion interface ) 串行通信接口

SCI采用的是NRZ数据格式,英文全称是:“standard non-return-zero mark/space data format”,可以译为:“标准不归零传号/空号数据格式”。不归零”的最初含义是:

用负电平表示一种二进制值,正电平表示另一种二进制值,不使用零电平。

“mark/space”即“传号/空号”分别是表示两种状态的物理名称,逻辑名称记为“1/0”。

对学习嵌入式应用的读者而言,只要理解这种格式只有“1”、“0”两种逻辑值就可以

1.1SCI的使用方法

无论用查询方式还是中断方式进行串行通信编程,在程序初始化时均必须对SCI进行初始化,主要进行波特率设置、通信格式的设置、发送接收数据方式的设

置等。

手册402页中给出了串口波特率设置公式:

2

SCI bus clock就总线时钟f BUS,SCIBR[12:0]由SCIBDH和SCIBDL决定(手册中406页)

这SCIBDH设置[12:8],SCIBDL设置[7:0],一共13位。

假如我们现在要设置波特率为9600,怎么设置呢?假设总线时钟是40M 9600=40 000 000 /(16*SCIBR[12:0])

SCIBR[12:0]= 40 000 000 /16/9600 =260

260的十六进制是104H,也就是SCIBDH=0x01,SCIBDL=0x04.

除了波特率寄存器外,还有两个寄存器比较重要,SCICR1和SCICR2

LOOPS置1:SCI的发送端在内部直接接到SCI的发送端,也就是自发自收,这主要用来编程期间对程序进行测试。清0就进入正常模式。

M=0:SCI总线发送了1个起始位8个数据位和一个结束位

M=1:SCI总线发送了1个起始位9个数据位和一个结束位

PE=1:启用奇偶校验

PE=0:禁止奇偶校验

PT用来选择是采用奇校验还是偶校验。

SCICR2

TIE=1:使能发送数据为空中断,也就是现在发送数据寄存器可以接收新数据了,你可以发送新数据了。

TCIE=1:使能发送完成中断,告诉你发送结束啦

RIE=1:使能接收中断

TE=1:发送使能

RE=1:接收使能

最后一个重要的寄存器就是状态寄存器SCISR1

TDRE=1:标志着可以进行新的数据收发了

RDRF=1: 标志着接收到了新数据

//-------------------------------------------------------------------------*

//?? ?t ??: SCI.c £¨′??ú′|àíoˉêy???t£? ------------------------------------*

//?μ ?÷: ′??ú′|àíoˉêy -----------------------------------------------------*

//±????t°üo?: sci.h---- ---------------------------------------------------*

//ó2?tá??ó: ?T ------------------------------------------------------------*

//-------------------------------------------------------------------------*

//í·???t #include "sci.h"

//--------------------made by king song------------------------------------*

//í·???t

#include "sci.h"

extern uint8 temp = 0;

//SCIInit:DG128′?DD?ú03?ê??ˉoˉêy------------------------------------------*

//1| ?ü: *

// ?aSCI01?SCI1,1?′??ú?D??,??′?DD?ú??DD3?ê??ˉ,??è??a?êDíSCI,?y3£??ê?3?,

// 8??êy?Y,?TD£?éμè,?êDí·¢?í£??êDí?óê?.2é?ˉ·?ê?·¢?í,?D??·?ê??óê?*

// 2¨ì??ê?a9600 * (éèfBUS£?40M) *

//2? êy:?T * //·μ ??:?T * //?μ ?÷: *

// (1)è?3?ê??ˉSCI1,??DèSCI0->SCI1 *

//------------------------------------------------------------------------*

void SCIInit(void)

{

SCIBaudR = BUS_CLOCK/16/BAUD;

SCI0CR1 = 0x00; //éè???êDíSCI,?y3£??ê?3?,8??êy?Y,?TD£?é

SCI0CR2 = 0x2C; //?êDíSCI0?óê?oí·¢?í?D??·?ê??óê?

}

//SCISendChar:′?DD·¢?í1??×??ú---------------------------------------------*

//1| ?ü:′?DD·¢?í1??×??ú*

//2?êy:cdata = òa·¢?íμ?êy?Y *

//·μ ??:?T *

//------------------------------------------------------------------------*

void SCISendChar(uint8 cdata)

{

while (!SendTestBit)

{

;

}

ReSendDataR = cdata;

}

//SCISendString:′?DD·¢?í×?·?′?--------------------------------------------*

//1| ?ü:′?DD·¢?í×?·?′?

//2?êy:putchar ′?·?′y·¢?íêy?Yμ?êy×éê×μ??·*

//·μ ??:?T *

//?μ ?÷:2??ü·¢?í′?0x00μ?×?·?′??òêy×é *

//?ú2?μ÷ó?oˉêy:SCISend1 *

//-------------------------------------------------------------------------*

void SCISendString(uint8 *putchar)

{

while(*putchar != 0x00)

{

SCISendChar(*putchar++);

}

}

//SCISendN:′?DD·¢?íN??×??ú------------------------------------------------*

//1| ?ü:·¢?íêy×é?Dμ?N??×??úêy?Y *

//2?

êy:n=′y·¢?íμ?êy?Y×??úêy,ch=′?·?′y·¢?íêy?Yμ?êy×éê×μ??·* //·μ ??:?T *

//?ú2?μ÷ó?oˉêy:SCISend1

*

//-------------------------------------------------------------------------*

void SCISendN(uint8 n,uint8 ch[])

{

uint8 i;

for (i=0; i

SCISendChar(ch[i]);

}

//SCIReceive:′?DD?óê?ò???×??úêy?Y------------------------------------------*

//1| ?ü:′ó′?DD?ú?óê?1??×??úμ?êy?Y *

//2?êy: *

//·μ ??:?óê?μ?μ?êy?Y *

//?μ ?÷:2?êy*p′????óê?±ê??=0ê?μ?êy?Y,=1?′ê?μ?êy?Y

//-------------------------------------------------------------------------*

uint8 SCIReceive(void)

{

while(!ReTestBit)

{

;

}

return (ReSendDataR) ;

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 20 SCIrevInter(void)

{

temp=SCIReceive();

//SCI0?óê??D??£??á3?SCIxSR1£??ù?á3?SCIêy?Y??′??÷ê±??á?£??ò???±?ó?3?μSCI0SR1_RDRF = 1;??á?

//PORTB=temp;

DDRB = 0XFF;

PORTB = ~PORTB;

}

Printf()函数使用

包含库函数#include

printf( ) 需要调用底层函数void TERMIO_PutChar(char C)输出字节

为此在串口初始化后需要添加函数:void TERMIO_PutChar(char C)

void TERMIO_PutChar(char C)

{ while(!(SCI0SR1&0x80)) ; //keep waiting when not empty

SCI0DRL=C;

}

三、XS128的中断源与中断向量

/**************** interrupt vector numbers ****************/ #define VectorNumber_Vsi 119U

#define VectorNumber_Vsyscall 118U

#define VectorNumber_VReserved118 117U

#define VectorNumber_VReserved117 116U

#define VectorNumber_VReserved116 115U

#define VectorNumber_VReserved115 114U

#define VectorNumber_VReserved114 113U

#define VectorNumber_VReserved113 112U

#define VectorNumber_VReserved112 111U

#define VectorNumber_VReserved111 110U

#define VectorNumber_VReserved110 109U

#define VectorNumber_VReserved109 108U

#define VectorNumber_VReserved108 107U

#define VectorNumber_VReserved107 106U

#define VectorNumber_VReserved106 105U

#define VectorNumber_VReserved105 104U

#define VectorNumber_VReserved104 103U

#define VectorNumber_VReserved103 102U

#define VectorNumber_VReserved102 101U

#define VectorNumber_VReserved101 100U

#define VectorNumber_VReserved100 99U

#define VectorNumber_VReserved99 98U

#define VectorNumber_VReserved98 97U

#define VectorNumber_Vatd0compare 96U

#define VectorNumber_VReserved96 95U

#define VectorNumber_VReserved95 94U

#define VectorNumber_VReserved94 93U

#define VectorNumber_VReserved93 92U

#define VectorNumber_VReserved92 91U

#define VectorNumber_VReserved91 90U

#define VectorNumber_VReserved90 89U

#define VectorNumber_VReserved89 88U

#define VectorNumber_VReserved88 87U

#define VectorNumber_VReserved87 86U

#define VectorNumber_VReserved86 85U

#define VectorNumber_VReserved85 84U

#define VectorNumber_VReserved84 83U

#define VectorNumber_VReserved83 82U

#define VectorNumber_VReserved82 81U

#define VectorNumber_VReserved81 80U

#define VectorNumber_VReserved79 79U #define VectorNumber_VReserved78 78U #define VectorNumber_VReserved77 77U #define VectorNumber_VReserved76 76U #define VectorNumber_VReserved75 75U #define VectorNumber_VReserved74 74U #define VectorNumber_VReserved73 73U #define VectorNumber_VReserved72 72U #define VectorNumber_VReserved71 71U #define VectorNumber_VReserved70 70U #define VectorNumber_Vpit3 69U #define VectorNumber_Vpit2 68U #define VectorNumber_Vpit1 67U #define VectorNumber_Vpit0 66U #define VectorNumber_Vhti 65U #define VectorNumber_Vapi 64U #define VectorNumber_Vlvi 63U #define VectorNumber_VReserved62 62U #define VectorNumber_VReserved61 61U #define VectorNumber_VReserved60 60U #define VectorNumber_VReserved59 59U #define VectorNumber_VReserved58 58U #define VectorNumber_Vpwmesdn 57U #define VectorNumber_Vportp 56U #define VectorNumber_VReserved55 55U #define VectorNumber_VReserved54 54U #define VectorNumber_VReserved53 53U #define VectorNumber_VReserved52 52U #define VectorNumber_VReserved51 51U #define VectorNumber_VReserved50 50U #define VectorNumber_VReserved49 49U #define VectorNumber_VReserved48 48U #define VectorNumber_VReserved47 47U #define VectorNumber_VReserved46 46U #define VectorNumber_VReserved45 45U #define VectorNumber_VReserved44 44U #define VectorNumber_VReserved43 43U #define VectorNumber_VReserved42 42U #define VectorNumber_VReserved41 41U #define VectorNumber_VReserved40 40U #define VectorNumber_Vcan0tx 39U #define VectorNumber_Vcan0rx 38U #define VectorNumber_Vcan0err 37U #define VectorNumber_Vcan0wkup 36U

#define VectorNumber_Vflash 35U

#define VectorNumber_Vflashfd 34U

#define VectorNumber_VReserved33 33U

#define VectorNumber_VReserved32 32U

#define VectorNumber_VReserved31 31U

#define VectorNumber_VReserved30 30U

#define VectorNumber_Vcrgscm 29U

#define VectorNumber_Vcrgplllck 28U

#define VectorNumber_VReserved27 27U

#define VectorNumber_VReserved26 26U

#define VectorNumber_Vporth 25U

#define VectorNumber_Vportj 24U

#define VectorNumber_VReserved23 23U

#define VectorNumber_Vatd0 22U

#define VectorNumber_Vsci1 21U

#define VectorNumber_Vsci0 20U

#define VectorNumber_Vspi0 19U

#define VectorNumber_Vtimpaie 18U

#define VectorNumber_Vtimpaaovf 17U

#define VectorNumber_Vtimovf 16U

#define VectorNumber_Vtimch7 15U

#define VectorNumber_Vtimch6 14U

#define VectorNumber_Vtimch5 13U

#define VectorNumber_Vtimch4 12U

#define VectorNumber_Vtimch3 11U

#define VectorNumber_Vtimch2 10U

#define VectorNumber_Vtimch1 9U

#define VectorNumber_Vtimch0 8U

#define VectorNumber_Vrti 7U

#define VectorNumber_Virq 6U

#define VectorNumber_Vxirq 5U

#define VectorNumber_Vswi 4U

#define VectorNumber_Vtrap 3U

#define VectorNumber_Vcop 2U

#define VectorNumber_Vclkmon 1U

#define VectorNumber_Vreset 0U

/**************** interrupt vector table ****************/ #define Vsi 0xFF10U

#define Vsyscall 0xFF12U

#define VReserved118 0xFF14U

#define VReserved117 0xFF16U

#define VReserved116 0xFF18U

#define VReserved115 0xFF1AU

#define VReserved114 0xFF1CU #define VReserved113 0xFF1EU #define VReserved112 0xFF20U #define VReserved111 0xFF22U #define VReserved110 0xFF24U #define VReserved109 0xFF26U #define VReserved108 0xFF28U #define VReserved107 0xFF2AU #define VReserved106 0xFF2CU #define VReserved105 0xFF2EU #define VReserved104 0xFF30U #define VReserved103 0xFF32U #define VReserved102 0xFF34U #define VReserved101 0xFF36U #define VReserved100 0xFF38U #define VReserved99 0xFF3AU #define VReserved98 0xFF3CU #define Vatd0compare 0xFF3EU #define VReserved96 0xFF40U #define VReserved95 0xFF42U #define VReserved94 0xFF44U #define VReserved93 0xFF46U #define VReserved92 0xFF48U #define VReserved91 0xFF4AU #define VReserved90 0xFF4CU #define VReserved89 0xFF4EU #define VReserved88 0xFF50U #define VReserved87 0xFF52U #define VReserved86 0xFF54U #define VReserved85 0xFF56U #define VReserved84 0xFF58U #define VReserved83 0xFF5AU #define VReserved82 0xFF5CU #define VReserved81 0xFF5EU #define VReserved79 0xFF60U #define VReserved78 0xFF62U #define VReserved77 0xFF64U #define VReserved76 0xFF66U #define VReserved75 0xFF68U #define VReserved74 0xFF6AU #define VReserved73 0xFF6CU #define VReserved72 0xFF6EU #define VReserved71 0xFF70U #define VReserved70 0xFF72U

#define Vpit2 0xFF76U #define Vpit1 0xFF78U #define Vpit0 0xFF7AU #define Vhti 0xFF7CU #define Vapi 0xFF7EU #define Vlvi 0xFF80U #define VReserved62 0xFF82U #define VReserved61 0xFF84U #define VReserved60 0xFF86U #define VReserved59 0xFF88U #define VReserved58 0xFF8AU #define Vpwmesdn 0xFF8CU #define Vportp 0xFF8EU #define VReserved55 0xFF90U #define VReserved54 0xFF92U #define VReserved53 0xFF94U #define VReserved52 0xFF96U #define VReserved51 0xFF98U #define VReserved50 0xFF9AU #define VReserved49 0xFF9CU #define VReserved48 0xFF9EU #define VReserved47 0xFFA0U #define VReserved46 0xFFA2U #define VReserved45 0xFFA4U #define VReserved44 0xFFA6U #define VReserved43 0xFFA8U #define VReserved42 0xFFAAU #define VReserved41 0xFFACU #define VReserved40 0xFFAEU #define Vcan0tx 0xFFB0U #define Vcan0rx 0xFFB2U #define Vcan0err 0xFFB4U #define Vcan0wkup 0xFFB6U #define Vflash 0xFFB8U #define Vflashfd 0xFFBAU #define VReserved33 0xFFBCU #define VReserved32 0xFFBEU #define VReserved31 0xFFC0U #define VReserved30 0xFFC2U #define Vcrgscm 0xFFC4U #define Vcrgplllck 0xFFC6U

#define VReserved27 0xFFC8U #define VReserved26 0xFFCAU

#define Vportj 0xFFCEU #define VReserved23 0xFFD0U #define Vatd0 0xFFD2U #define Vsci1 0xFFD4U #define Vsci0 0xFFD6U #define Vspi0 0xFFD8U #define Vtimpaie 0xFFDAU #define Vtimpaaovf 0xFFDCU #define Vtimovf 0xFFDEU #define Vtimch7 0xFFE0U #define Vtimch6 0xFFE2U #define Vtimch5 0xFFE4U #define Vtimch4 0xFFE6U #define Vtimch3 0xFFE8U #define Vtimch2 0xFFEAU #define Vtimch1 0xFFECU #define Vtimch0 0xFFEEU #define Vrti 0xFFF0U #define Virq 0xFFF2U #define Vxirq 0xFFF4U #define Vswi 0xFFF6U #define Vtrap 0xFFF8U #define Vcop 0xFFFAU #define Vclkmon 0xFFFCU #define Vreset 0xFFFEU 四、pll 锁相环

,根据这三个公式设置总线频率

SYNDIV由SYNR寄存器的0-5位设定:

注意:你看它写操作的条件,除了PLLSEL=1,即在PLL启动后写无效了。只有没启用PLL 时才可以写。

SYNR寄存器的7、6位怎么设定呢,看下图。可见这2位由f VCO的大小决定

REFDIV由REVDV寄存器的0-5位决定:

PLL初始化步骤:

1. 设定总线频率由外部晶振频率决定

2. 设置PLL相关参数,改变f BUS 值

3. 等待PLL稳定

4. 设定总线频率由f PLL决定

外部晶振我们选用16M,假如设置f BUS=40M,怎么设置呢?

假如要设置f BUS=40M,则f PLL=80M,令POSTDIV=0,则f PLL=f VCO=80M,根据下图,VCOFRQ=01, 80M=2*16M*(SYNDIV+1)/(REFDIV+1),即(SYNDIV+1)/(REFDIV+1)=5/2,可以设SYNDIV=4,REFDIV=1.这样系统的时钟就设置成了40M。

例:

CLKSEL = 0X00; // 3?ê??ˉPLL?°?èê1ó?ía2??§??

PLLCTL_PLLON = 1; // ?a?? PLL

#ifdef PLL80MHZ //PLL?a80MHZ

SYNR = 0x40 | 0x04;

REFDV = 0x80 | 0x01;

#else //PLL?a48MHZ

SYNR = 0XC0 | 0X05;

REFDV = 0XC0 | 0X03;

#endif

POSTDIV = 0x00;

_asm(nop); //BUS CLOCK=40M

_asm(nop);

while(!CRGFLG_LOCK); //fbus =80/2=40MHz

while(CLKSEL_PLLSEL!=1) //fpll = fvoc/(2*POSTDIV) ?ùò?fpll= fvoc

CLKSEL_PLLSEL=1; //Enable PLL to system;

_asm(nop);_asm(nop);_asm(nop);_asm(nop);

五、周期中断定时器Periodic Interrupt Timer(PIT)

看下图,我们可以看到飞思卡尔PIT一共有四个定时16 bit Timer0,16 bit Timer1,16 bit timer2,16 bit timer3,每个定时器能产生相应的超时中断。那么8-bit MICRO Timer0和8-bit MICRO Timer1是干什么的呢?我举个例子你就明白了。假如8-bit MICRO Timer0=200,16 bit Timer0=100,现在启动定时器,8-bit MICRO Timer0从200开始每隔一个总线周期(1/总线频

率)降1,直到0为止;这时8-bit MICRO Timer0重新回到200,而16 bit Timer0则减1,8-bit MICRO Timer0继续每隔一个系统周期减1;直到8-bit MICRO Timer0和16 bit Timer0都将为0.则会产生中断,中断标志位置1。如果你启动了超时中断,这个时候就会去执行超时中断函数。

总结: 8-bit MICRO Timer0 起分频作用使时钟变慢加大定时时间

设置定时器按什么步骤呢?

比如设置定时器0。首先要设定8-bit MICRO Timer的数值,启动定时器模块,然后设置定时器0和哪一个8-bit MICRO Timer相关,设置定时器周期,启动定时器中断,使能定时器,开始计时

比如我想设定200ms,怎么设置呢?(看下图,芯片手册中361页)

PITMTLD就是8bit MICRO Timer的寄存器值,0-255;PITLD就是16 bit Timer寄存器的值,你能设定的最大超时时间为Tmax=256*65536/fBUS,假如总线周期为40M。Tmax=419.43ms。

1/40M=0.025us,如果我们把PITMTLD设置成199,那么(199+1)*0.025us=5us,如果要想达到200ms,即(PITLD+1)*5us=200ms,可以算出PITLD = 39999

总线时钟为40M,我们要设定200ms定时,可以令PITMTLD=199,PITLD = 39999。

PIT模块寄存器

PIT使能寄存器

(1)

PIT控制与强制加载微定时器寄存器

飞思卡尔智能汽车设计技术报告

第九届“飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 学校:武汉科技大学队 伍名称:首安二队参赛 队员:韦天 肖杨吴光星带队 教师:章政 0敏

I

关于技术报告和研究论文使用授权的说明 本人完全了解第九届“飞思卡尔”杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。 参赛队员签名: 带队教师签名: 日期:

II

目录 第一章引言 (1) 1.1 概述 (1) 1.2 内容分布 (1) 第二章系统总体设计 (2) 2.1 设计概述 (3) 2.2 控制芯片的选择 (3) 2.3 线性 CCD 检测的基本原理 (3) 2.3 系统结极 (5) 第三章机械系统设计 (7) 3.1 底盘加固 (7) 3.2 轮胎处理 (7) 3.3 四轮定位 (8) 3.4 差速器的调整 (12) 3.5 舵机的安装 (13) 3.6 保护杆的安装 (15) 3.7 CCD的安装 (16) 3.8 编码器的安装 (17) 3.9 检测起跑线光电管及加速度计陀螺仪的安装 (18) 第四章硬件系统设计 (19) 4.1 最小系统版 (20) 4.2 电源模块 (21) 4.3 CCD模块 (22) 4.4 驱动桥模块 (23) 4.5 车身姿态检测模块 (24) 4.7 测速模块 (24) 4.8 OLED液晶屏及按键、拨码 (25) 第5章程序设计 (27)

飞思卡尔智能车比赛细则

2016

目录

第十一届竞赛规则导读 参加过往届比赛的队员可以通过下面内容了解第十一届规则主要变化。如果第一次参加比赛,则建议对于本文进行全文阅读。 相对于前几届比赛规则,本届的规则主要变化包括有以下内容: 1.本届比赛新增了比赛组别,详细请参见正文中的图1和第四章的“比赛任务” 中的描述; 2.第十届电磁双车组对应今年的A1组:双车追逐组。其它组别与新组别的对应 关系请参见图2; 3.为了提高车模出界判罚的客观性,规则提出了两种方法:路肩法和感应铁丝 法,详细请见赛道边界判定”; 4.改变了原有的光电计时系统,所有赛题组均采用磁感应方法计时,详细请参 见“计时裁判系统”; 5.取消了第十届的发车灯塔控制的方式; 6.赛道元素进行了简化,详细请参见“赛道元素”; 7.赛道材质仍然为PVC耐磨塑胶地板,但赛题组A2不再需要赛道。 8.对于车模所使用的飞思卡尔公司MCU的种类、数量不再限制。 9.比赛时,每支参赛队伍的赛前准备时间仍然为20分钟,没有现场修车环节。

一、前言 智能车竞赛是从2006开始,由教育部高等教育司委托高等学校自动化类教学指导委员会举办的旨在加强学生实践、创新能力和培养团队精神的一项创意性科技竞赛。至今已经成功举办了十届。在继承和总结前十届比赛实践的基础上,竞赛组委会努力拓展新的竞赛内涵,设计新的竞赛内容,创造新的比赛模式,使得围绕该比赛所产生的竞赛生态环境得到进一步的发展。 为了实现竞赛的“立足培养、重在参与、鼓励探索、追求卓越”的指导思想,竞赛内容设置需要能够面向大学本科阶段的学生和教学内容,同时又能够兼顾当今时代科技发展的新趋势。 第十一届比赛的题目在沿用原来根据车模识别赛道传感器种类进行划分的基础类组别之上,同时增加了以竞赛内容进行划分的提高类组别,并按照“分赛区普及,全国总决赛提高”的方式,将其中一个类别拓展出创意类组别。第十一届比赛的题目各组别分别如下: ●基础类包括B1光电组、B2摄像头组、B3电磁直立组、B4电轨组; ●提高类包括A1双车追逐组、A2信标越野组; ●创意类包括I1 电轨节能组。 图 1 不同组别,不同挑战度 每个组别在选用的车模、赛道识别方法、完成任务等方面存在差别,对于参赛选手不同学科知识和能力要求也不同,制作的挑战度也有较大的区别。相比较而言,

基于嵌入式STM32的飞思卡尔智能车设计



飞思卡尔智能车大赛是面向全国大学生举办的应用型比赛, 旨在培养创新精 神、协作精神,提高工程实践能力的科技活动。大赛主要是要求小车自主循迹并 在最短时间内走完整个赛道。针对小车所安装传感器的不同,大赛分为光电组、 电磁组和摄像头组。 本文介绍了本院自动化系第一届大学生智能汽车竟赛的智能车系统。 包括总 体方案设计、机械结构设计、硬件电路设计、软件设计以及系统的调试与分析。 机械结构设计部分主要介绍了对车模的改进,以及舵机随动系统的机械结构。硬 件电路设计部分主要介绍了智能车系统的硬件电路设计, 包括原理图和 PCB 设计 智能车系统的软、 硬件结构及其开发流程。该智能车车模采用学校统一提供的飞 思卡尔车模,系统以 STM32F103C8T6 作为整个系统信息处理和控制命令的核心, 使用激光传感器检测道路信息使小车实现自主循迹的功能
关键字:飞思卡尔智能车STM32F103C8T6
激光传感器
第一章 概述

1.1 专业课程设计题目
基于嵌入式 STM32 的飞思卡尔智能车设计
1.2 专业课程设计的目的与内容
1.2.1 目的 让学生运用所学的计算机、传感器、电子电路、自动控制等知识,在老师的 指导下,结合飞思卡尔智能车的设计独立地开展自动化专业的综合设计与实验, 锻炼学生对实际问题的分析和解决能力,提高工程意识,为以后的毕业设计和今 后从事相关工作打下一定的基础。 1.2.2 内容 本次智能车大赛分为光电组和创新做,我们选择光电组小车完成循迹功能。 该智能车车模采用学校统一提供的飞思卡尔车模, 系统以 STM32F103C8T6 作为整 个系统信息处理和控制命令的核心,我们对系统进行了创造性的优化: 其一, 硬件上采用激光传感器的方案, 软件上采用 keil 开发环境进行调试、 算法、弯道预判。 其二,传感器可以随动跟线,提高了检测范围。 其三,独立设计了控制电路板,充分利用 STM32 单片机现有模块进行编程, 同时拨码开关、状态指示灯等方便了算法调试。
1.3 方案的研讨与制定
1.3.1传感器选择方案 方案一:选用红外管作为赛道信息采集传感器。 由于识别赛道主要是识别黑白两种不同的颜色, 而红外对管恰好就能实现区 分黑白的功能,当红外光照在白色KT板上时,由于赛道的漫反射作用,使得一部 分红外光能反射回来, 让接收管接的输出引脚的电压发生变化,通过采集这个电 压的变化情况来区分红外光点的位置情况,以达到区分赛道与底板的作用。 红外管的优点在于价格便宜,耐用;缺点却用很多:1、红外光线在自然环 境中,无论是室内还是室外均比较常见,就使得其抗干扰能力不强,容易受环境 变化的影响。2、调试不方面,由于红外光是不可见光,调试的时候需要采用比 较麻烦的方法来判断光电的位置。3、由于红外管光线的直线性不好,就使得红 外传感器所能准确的判断的最远距离比较小,也就是通常所说的前瞻不够远。

飞思卡尔智能车竞赛新手入门建议

每年都会有很多新人怀着满腔热情来做智能车,但其中的很多人很快就被耗光了热情和耐心而放弃。很多新人都不知道如何入手,总有些有劲无处使的感觉,觉得自己什么都不会,却又不知道该干什么。新人中存在的主要问题我总结了以下几点: l缺乏自信,有畏难情绪 作为新人,一切都是新的。没有设计过电路,没有接触过单片机,几乎什么都不会。有些新人听了两次课,看了两篇技术报告,就发现无数不懂不会的东西,于是热情在消退,信心在减弱。这些都是放弃的前兆。殊不知,高手都是从新人过来的,没有谁天生什么都会做。一件事件,如果还没开始做,就自己否定自己,认为自己做不到,那么肯定是做不到的。 l习惯了被动接收知识,丧失了主动学习的能力。 现在的学生大多从小习惯了被灌输知识,只学老师教的,只学老师考的。殊不知一旦走向社会,将不再有老师来教,不再有应付不完的考试。做智能车和传统的教学不同,学生将从被动学习的地位转变为主动学习。就算有指导老师,有指导的学长,但也都处于被动地位,往往都不会主动来教。有的学生一开始就没有转变思想,还希望就像实验课一样,老师安排好步骤1,2,3……,然后自己按照老师安排好的步骤按部就班的完成。这样的学生,往往都丧失了提出问题和分析问题的能力,只是一个应付考试的机器。要知道,解决问题的第一步是提出问题,如果总等着别人来教,那么问题永远会挡在你面前。 l缺乏团队精神和合作意识 智能车比赛是以团队的形式参赛,只依靠个人能力单兵作战就能取得好成绩的是很少很少的。当今社会,任何人的成功都离不开身后的团队的支撑。智能车是一个很复杂的系统,电路、机械、传感器、单片机、底层驱动、控制算法……。如果所有的任务都是一个人去完成,固然锻炼了自己,但想做的很好却很不现实。很多新人,来到实验室,来到一个陌生的环境和团队,连向学长请教,和同学交流的勇气都没有,又如何融入团队呢。除了要主动融入团队,还要培养自己的团队意识。团队精神往往表现为一种责任感,如果团队遇到问题,每个人都只顾自己,出了错误,不想着解决问题,而是互相推诿埋怨。这样的团队,肯定是无法取得好成绩的。 l缺乏耐心和细心的精神 其实把一件事做好很简单,细心加上耐心。不细心就想不到,没有耐心,即使想到了也做不到。做事怕麻烦,将就,说白了就是惰性在作祟。明明可以把支架做的更轻更漂亮,明明可以把程序写的更简洁,明明可以把电路设计得更完善……。其实,每个人都有很大潜力,如果不逼自己一次,你永远不知道自己的潜力有多

飞思卡尔智能车电机资料

3.1.6驱动电机介绍 驱动电机采用直流伺服电机,我们在此选用的是RS-380SH型号的伺服电机,这是因为直流伺服电机具有优良的速度控制性能,它输出较大的转矩,直接拖动负载运行,同时它又受控制信号的直接控制进行转速调节。在很多方面有优越性,具体来说,它具有以下优点: (1)具有较大的转矩,以克服传动装置的摩擦转矩和负载转矩。 (2)调速范围宽,高精度,机械特性及调节特性线性好,且运行速度平稳。 (3)具有快速响应能力,可以适应复杂的速度变化。 (4)电机的负载特性硬,有较大的过载能力,确保运行速度不受负载冲击的 影响。 (5)可以长时间地处于停转状态而不会烧毁电机,一般电机不能长时间运行于 停转状态,电机长时间停转时,稳定温升不超过允许值时输出的最大堵转转矩称为连续堵转转矩,相应的电枢电流为连续堵转电流。 图3.1为该伺服电机的结构图。图3.2是此伺服电机的性能曲线。 图3.1 伺服电机的结构图

图3.2 伺服电机的性能曲线 3.1.7 舵机介绍 舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。舵机的控制信号是PWM信号,利用占空比的变化改变舵机的位置。一般舵机的控制要求如图3.3所示。图3.4为舵机的控制线。

飞思卡尔杯智能车竞赛报告总结

1.1. 系统分析 智能车竞赛要求设计一辆以组委会提供车模为主体的可以自主寻线的模型车,最后成绩取决于单圈最快时间。因此智能车主要由三大系统组成:检测系统,控制系统,执行系统。其中检测系统用于检测道路信息及小车的运行状况。控制系统采用大赛组委会提供的16位单片机MC9S12XS128作为主控芯片,根据检测系统反馈的信息新局决定各控制量——速度与转角,执行系统根据单片机的命令控制舵机的转角和直流电机的转速。整体的流程如图1.1,检测系统采集路径信息,经过控制决策系统分析和判断,由执行系统控制直流电机给出合适的转速,同时控制舵机给出合适的转角,从而控制智能车稳定、快速地行驶。 图2.1 1.2. 系统设计 参赛小车将电感采集到的电压信号,经滤波,整流后输入到XS128单片机,用光电编码器获得实时车速,反馈到单片机,实现完全闭环控制。速度电机采用模糊控制,舵机采用PD控制,具体的参数由多次调试中获得。考滤到小车设计的综合性很强,涵盖了控制、传感、电子、电气、计算机和机械等多个学科领域,因此我们采用了模块化设计方法,小车的系统框图如图2.2。

第五届全国大学生智能汽车竞赛技术报告 图2.2 1.3. 整车外观 图2.3

1.4. 赛车的基本参数 智能车竞赛所使用的车模是东莞市博思公司生产的G768型车模,由大赛组委会统一提供,是一款带有摩擦式差速器后轮驱动的电动模型车。车模外观如图3.1。车模基本参数如表3.1。 图3.1 表3.1车模基本参数 1.5. 赛车前轮定位参数的选定

第五届全国大学生智能汽车竞赛技术报告 现代汽车在正常行驶过程中,为了使汽车直线行驶稳定,转向轻便,转向后能自动回正,减少轮胎和转向系零件的磨损等,在转向轮、转向节和前轴之间须形成一定的相对安装位置,叫车轮定位,其主要的参数有:主销后倾、主销内倾、车轮外倾和前束。模型车的前轮定位参数都允许作适当调整,故此我们将自身专业课所学的理论知识与实际调车中的赛车状况相结合,最终得出赛车匹配后的前轮参数[6]。 1.5.1. 主销后倾角 主销后倾角是指在纵向平面内主销轴线与地面垂直线之间的夹角γ,如图3-2。模型车的主销后倾角可以设置为0、 2°?3°、 4°?6°,可以通过改变上横臂轴上的黄色垫片来调整,一共有四个垫片,前二后二时为0°,前一后三为2°?3°,四个全装后面时为4°?6°。 由于主销后倾角过大时会引起转向沉重,又因为比赛所用舵机特性偏软,所以不宜采用大的主销后倾角,以接近0°为好,即垫片宜安装采用前二后二的方式,以便增加其转向的灵活性。如图3.3。 图3.2 图3.3 1.5. 2. 主销内倾角 主销内倾角是指在横向平面内主销轴线与地面垂直线之间的夹角β,如图3.4,它的作用也是使前轮自动回正。对于模型车,通过调整前桥的螺杆的长度可以改变主销内倾角的大小,由于前轴与主销近似垂直的关系,故主销内倾角

飞思卡尔 智能车舵机控制

智能车的制作中,看经验来说,舵机的控制是个关键.相比驱动电机的调速,舵机的控制对于智能车的整体速度来说要重要的多. PID算法是个经典的算法,一定要将舵机的PID调好,这样来说即使不进行驱动电机的调速(匀速),也能跑出一个很好的成绩. 机械方面: 从我们的测试上来看,舵机的力矩比较大,完全足以驱动前轮的转向.因此舵机的相应速度就成了关键.怎么增加舵机的响应速度呢?更改舵机的电路?不行,组委会不允许.一个非常有效的办法是更改舵机连接件的长度.我们来看看示意图: 从上图我们能看到,当舵机转动时,左右轮子就发生偏转.很明显,连接件长度增加,就会使舵机转动更小的转角而达到同样的效果.舵机的特点是转动一定的角度需要一定的时间.不如说(只是比喻,没有数据),舵机转动10度需要2ms,那么要使轮子转动同样的角度,增长连接件后就只需要转动5度,那么时间是1ms,就能反应更快了.据经验,这个舵机的连接件还有必要修改.大约增长0.5倍~2倍. 在今年中,有人使用了两个舵机分别控制两个轮子.想法很好.但今年不允许使用了.

接下来就是软件上面的问题了. 这里的软件问题不单单是软件上的问题,因为我们要牵涉到传感器的布局问题.其实,没有人说自己的传感器布局是最好的,但是肯定有最适合你的算法的.比如说,常规的传感器布局是如下图: 这里好像说到了传感器,我们只是略微的一提.上图只是个示意图,意思就是在中心的地方传感器比较的密集,在两边的地方传感器比较的稀疏.这样做是有好处的,大家看车辆在行驶到转弯处的情况: 相信看到这里,大家应该是一目了然了,在转弯的时候,车是偏离跑道的,所以两边比较稀疏还是比较科学的,关于这个,我们将在传感器中在仔细讨论。 在说到接下来的舵机的控制问题,方法比较的多,有人是根据传感器的状态,运用查表法差出舵机应该的转角,这个做法简单,而且具有较好的滤波"效果",能够将错误的传感器状态滤掉;还有人根据计算出来的传感器的中心点(比

飞思卡尔智能车竞赛光电组技术报告

第九届“飞思卡尔”杯全国大学生智能车竞赛光电组技术报告 学校:中北大学 伍名称:ARES 赛队员:贺彦兴 王志强 雷鸿 队教师:闫晓燕甄国涌

关于技术报告和研究论文使用授权的说明书本人完全了解第八届“飞思卡尔”杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。 参赛队员签名: 带队教师签名: 日期:2014-09-15日

摘要 本文介绍了第九届“飞思卡尔杯全国大学生智能车大赛光电组中北大学参赛队伍整个系统核心采用飞思卡尔单片机MC9S12XS128MAA ,利用TSL1401线性CCD 对赛道的行扫描采集信息来引导智能小车的前进方向。机械系统设计包括前轮定位、方向转角调整,重心设计器件布局设计等。硬件系统设计包括线性CCD传感器安装调整,电机驱动电路,电源管理等模块的设计。软件上以经典的PID算法为主,辅以小规Bang-Bang 算法来控制智能车的转向和速度。在智能车系统设计开发过程中使用Altium Designer设计制作pcb电路板,CodeWarriorIDE作为软件开发平台,Nokia5110屏用来显示各实时参数信息并利用蓝牙通信模块和串口模块辅 助调试。关键字:智能车摄像头控制器算法。

目录 1绪论 (1) 1.1 竞赛背景 (1) 1.2国内外智能车辆发展状况 (1) 1.3 智能车大赛简介 (2) 1.4 第九届比赛规则简介 (2) 2智能车系统设计总述 (2) 2.1机械系统概述 (3) 2.2硬件系统概述 (5) 2.3软件系统概述 (6) 3智能车机械系统设计 (7) 3.1智能车的整体结构 (7) 3.2前轮定位 (7) 3.3智能车后轮减速齿轮机构调整 (8) 3.4传感器的安装 (8) 4智能车硬件系统设计 (8) 4.1XS128芯片介绍 (8) 4.2传感器板设计 (8) 4.2.1电磁传感器方案选择 (8) 4.2.2电源管理模 (9) 4.2.3电机驱动模块 (10) 4.2.4编码器 (11) 5智能车软件系统设 (11) 5.1程序概述 (11) 5.2采集传感器信息及处理 (11) 5.3计算赛道信息 (13) 5.4转向控制策略 (17) 5.5速度控制策略 (19) 6总结 (19)

飞思卡尔大赛资料总结

(论坛网友分享,在此分享给广大参加比赛的同学,预祝取得好成绩) 机械调整主销内倾3度主销后倾0到1度前轮外倾1度前轮前束6mm 3.1 前轮的调整 现代汽车在正常行驶过程中,为了使汽车直线行驶稳定,转向轻便,转向后能自动 回正,并减少轮胎和转向系零件的磨损等,在转向轮、转向节和前轴之间须形成一定的 相对安装位置,叫做车轮定位,其主要定位参数包括:主销后倾、主销内倾、车轮外倾 和前束。对于模型车的前轮四项定位参数均可调。 1)如图3-1 所示,主销后倾角是指主销装在前轴,上端略向后倾斜的角度。它使车 辆转弯时产生的离心力所形成的力矩方向与车轮偏转方向相反,迫使车轮偏转后自动恢 复到原来的中间位置上。因此,主销后倾角越大,车速越高,

前轮稳定性也愈好。但是 过大的主销后倾角会使转向沉重,容易造成赛车转弯迟滞。我们希望赛车能够转向灵活, 故把主销后倾角设定为1~5°。 图3-1 主销后倾纠正车轮偏转原理图 2)主销内倾角是主销轴线与地面垂直线在汽车横向断面内的夹角,它也有使车轮自 动回整的作用。主销内倾还会使主销轴线延长线与路面的交点到车轮中心平面的距离减 少,同时转向时路面作用在转向轮上的阻力矩也会减少,使得转向更轻便灵活。所以为 了使得赛车转向更加灵活,我们将主销内倾角控制在0 度左右。 方法(1)垫片(2)偏心凸轮(3)长孔(4)球头旋转(5)支柱旋转(7)楔形垫片(6)调整轴承座(8)偏心螺栓(7) 偏心衬套(10)偏置球头 3)如图3-2,前轮外倾角对赛车的转弯性能有直接影响,它的作用是提高前轮的转 向安全性和转向操纵的轻便性。前轮外倾角俗称“外八字”,如果车轮垂直地面一旦满载 就易产生变形,可能引起车轮上部向内倾侧,导致车轮联接件损坏。所以事先将前轮外

飞思卡尔项目书

飞思卡尔智能车比赛项目 参赛时间:2011.7.16 — 2011.7.20 赛前准备时间:2010.7 ---2011.7 飞思卡尔智能车比赛简介: 为加强大学生实践、创新能力和团队精神的培养,促进高等教育教学改革,受教育部高等教育司委托(教高司函[2005]201号文,附件1),由教育部高等学校自动化专业教学指导分委员会(以下简称自动化分教指委)主办全国大学生智能汽车竞赛。该竞赛是以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。该竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件。 该竞赛由竞赛秘书处设计、规范标准硬软件技术平台,竞赛过程包括理论设计、实际制作、整车调试、现场比赛等环节,要求学生组成团队,协同工作,初步体会一个工程性的研究开发项目从设计到实现的全过程。该竞赛融科学性、趣味性和观赏性为一体,是以迅猛发展、前景广阔的汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科专业的创意性比赛。该竞赛规则透明,评价标准客观,坚持公开、公平、公正的原则,力求向健康、普及、持续的方向发展。 该竞赛以飞思卡尔半导体公司为协办方,得到了教育部相关领导、飞思卡尔公司领导与各高校师生的高度评价,已发展成全国30个省市自治区近300所高校广泛参与的全国大学生智能汽车竞赛。2008年起被教育部批准列入国家教学质量与教学改革工程资助项目中科技人文竞赛之一(教高函[2007]30号文)。 全国大学生智能汽车竞赛原则上由全国有自动化专业的高等学校(包括港、澳地区的高校)参赛。竞赛首先在各个分赛区进行报名、预赛,各分赛区的优胜队将参加全国总决赛。每届比赛根据参赛队伍和队员情况,分别设立光电组、摄像头组、电磁组、创意组等多个赛题组别。每个学校可以根据竞赛规则选报不同组别的参赛队伍。全国大学生智能汽车竞赛组织运行模式贯彻“政府倡导、专家主办、学生主体、社会参与”的16字方针,充分调动各方面参与的积极性。 全国大学生智能汽车竞赛一般在每年的10月份公布次年竞赛的题目和组织方式,并开始接受报名,次年的3月份进行相关技术培训,7月份进行分赛区竞赛,8月份进行全国总决赛。 飞思卡尔智能车比赛技术要求:

飞思卡尔智能车比赛个人经验总结

先静下心来看几篇技术报告,可以是几个人一起看,边看边讨论,大致了解智能车制作的过程及所要完成的任务。 看完报告之后,对智能车也有了大概的了解,其实总结起来,要完成的任务也很简单,即输入模块——控制——输出。 (1)输入模块:各种传感器(光电,电磁,摄像头),原理不同,但功能都一样,都是用来采集赛道的信息。这里面就包含各种传感器的原理,选用,传感器电路的连接,还有传感器的安装、传感器的抗干扰等等需要大家去解决的问题。 (2)控制模块:传感器得到了我们想要的信息,进行相应的AD转换后,就把它输入到单片机中,单片机负责对信息的处理,如除噪,筛选合适的点等等,然后对不同的赛道信息做出相应的控制,这也是智能车制作过程中最为艰难的过程,要想出一个可行而又高效的算法,确实不是一件容易的事。这里面就涉及到单片机的知识、C语言知识和一定的控制算法,有时为了更直观地动态控制,还得加入串口发送和接收程序等等。 (3)输出模块:好的算法,只有通过实验证明才能算是真正的好算法。经过分析控制,单片机做出了相应的判断,就得把控制信号输出给电机(控制速度)和舵机(控制方向),所以就得对电机和舵机模块进行学习和掌握,还有实现精确有效地控制,又得加入闭环控制,PID算法。 明确了任务后,也有了较为清晰的控制思路,接下来就着手弄懂每一个模块。虽然看似简单,但实现起来非常得不容易,这里面要求掌握电路的知识,基本的机械硬件结构知识和单片机、编程等计算机知识。最最困难的是,在做的过程中会遇到很多想得到以及想不到的事情发生,一定得细心地发现问题,并想办法解决这些问题。 兴趣是首要的,除此之外,一定要花充足的时间和精力在上面,毕竟,有付出就会有收获,最后要明确分工和规划好进度。

飞思卡尔智能车设计报告

飞思卡尔智能车设计报告

目录 1.摘要 (3) 2.关键字 (3) 3.系统整体功能模块 (3) 4.电源模块设计 (4) 5.驱动电路设计 (4) 6.干簧管设计 (5) 7.传感器模块设计 (6) 8.传感器布局 (6) 9.软件设计 (7) 9.1控制算法 (7) 9.2软件系统实现(流程图) (10) 10.总结 (11) 11.参考文献 (12)

1.摘要 “飞思卡尔”杯全国大学生智能汽车竞赛是由教育部高等自动化专业教学指导分委员会主办的一项以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。该竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件。该竞赛以汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科的科技创意性比赛。 本文介绍了飞思卡尔电磁组智能车系统。本智能车系统是以飞思卡尔32 位单片机K60为核心,用电感检测赛道导线激发的电磁信号, AD 采样获得当前传感器在赛道上的位置信息,通过控制舵机来改变车的转向,用增量式PID进行电机控制,用编码器来检测小车的速度,共同完成智能车的控制。 2.关键字 电磁、k60、AD、PID、电机、舵机 3.系统整体功能模块 系统整体功能结构图

4.电源模块设计 电源是一个系统正常工作的基础,电源模块为系统其他各个模块提供所需要的能源保证,因此电源模块的设计至关重要。模型车系统中接受供电的部分包括:传感器模块、单片机模块、电机驱动模块、伺服电机模块等。设计中,除了需要考虑电压范围和电流容量等基本参数外,还要在电源转换效率、噪声、干扰和电路简单等方面进行优化。可靠的电源方案是整个硬件电路稳定可靠运行的基础。 全部硬件电路的电源由7.2V,2A/h的可充电镍镉电池提供。由于电路中的不同电路模块所需要的工作电流容量各不相同,因此电源模块应该包含多个稳压电路,将充电电池电压转换成各个模块所需要的电压。 电源模块由若干相互独立的稳压电源电路组成。在本系统中,除了电机驱动模块的电源是直接取自电池外,其余各模块的工作电压都需要经电源管理芯片来实现。 由于智能车使用7.2V镍镉电池供电,在小车行进过程中电池电压会有所下降,故使用低压差电源管理芯片LM2940。LM2940是一款低压稳压芯片,能提供5V的固定电压输出。LM2940低压差稳压芯片克服了早期稳压芯片的缺点。与其它的稳压芯片一样,LM2940需要外接一个输出电容来保持输出的稳定性。出于稳定性考虑,需要在稳压输出端和地之间接一个47uF低等效电阻的电容器。 舵机的工作电压是6伏,采用的是LM7806。 K60单片机和5110液晶显示器需要3.3伏供电,采用的是LM1117。 5.驱动电路设计 驱动电路采用英飞凌的BTS7960,通态电阻只有16mΩ,驱动电流可达43A,具有过压、过流、过温保护功能,输入PWM频率可达到25KHz,电源电压5.5V--27.5V。BTS7960是半桥驱动,实际使用中要求电机可以正反转,故使用两片接成全桥驱动。如图下图所示。

飞思卡尔 freescale Kinetis KL25系列资料大全及实例汇总

Freescale Kinetis KL25系列社区资料大全及实例汇总 介绍: Freescale 公司Kinetis KL25 MCU向L系列内增加了带集成低压稳压器的全速USB 2.0 OTG控制器,采用32位ARM Cortex-M0内核,拥有48MHz内核频率,工作电压为1.71V~3.6V,。KL25系列作为低功耗、低价格、高性能的微控制器,给工程师们提供了一个合适的入门级32位方案。 本文精选了Kinetis K25教程、例程、设计案例,以及基于Kinetis KL25的流行开发板,集结了国内外官方资料和资深工程师的经验,是学习Kinetis KL25 MCU的必备宝典。 Kinetis KL25 MCU 的功能框图 Kinetis KL25 MCU 教程篇

Kinetis KL25 MCU官方参考手册 Kinetis KL25 MCU 官方数据手册 飞思卡尔Kinetis系列产品开发资源链接总汇 包含Kinetis系列产品的参考手册、数据手册、编译环境、调试工具的相关资源链接。 KL25中文用户手册 官方Kinetis L系列三大特性演示视频(附中文说明文档) 你在设计中往往会忽略掉Kinetis L系列的重要的特性。如果你只是简单的把Kinetis L系列当做一般的Cortex-M0的单片机来使用的话,我们的设计人员估计要郁闷了。闲话少说,赶紧来看看你可能忽略的特性吧 Cortex-M0+, 到底“+”了什么(有视频,有中文文档) 飞思卡尔Kinetis L系列采用的内核是Cortex-M0+,而不是Cortex-M0。这个小小的加号到底增加了什么呢?小小视频讲的一清二楚。 根据KL系列芯片上的缩略标志识别具体型号 大家在使用kinetis芯片的时候,可能会发现一些比较小的芯片上并没有刻出芯片的具体型号,而是刻了一个缩略型号名称,那么如何根据这个缩略名称来识别具体的型号呢? 文中罗列了Kinetis L系列所有的缩略型号对应的芯片具体型号名称,方便大家识别。 KL25 TSI基本原理介绍 TSI(Touch Sensing Interface)模块是飞思卡尔为简化硬件设计人员开发而嵌入到Kinetis架构的电容触摸感应模块,本篇主要介绍TSI模块的基本原理。 KL25 ADC模块详细介绍 文中包含了ADC的模块框图以及对每个模块的详细介绍。 开发篇 FRDM-KL25 cdc win 7 DRIVER 下载 超核KL25固件库BetaV0.5 版 更新的主要内容: - 完善了几乎所有模块的注释,大家使用起来更方便

飞思卡尔智能车竞赛策略和比赛方案综述

飞思卡尔智能车竞赛策略和比赛方案综述 一、竞赛简介 起源: “飞思卡尔杯”智能车大赛起源于韩国,是韩国汉阳大学汽车控制实验室在飞思卡尔半导体公司资助下举办的以HCSl2单片机为核心的大学生课外科技竞赛。组委会提供一个标准的汽车模型、直流电机和可充电式电池,参赛队伍要制作一个能够自主识别路径的智能车,在专门设计的跑道上自动识别道路行驶,谁最快跑完全程而没有冲出跑道并且技术报告评分较高,谁就是获胜者。其设计内容涵盖了控制、模式识别、传感技术、汽车电子、电气、计算机、机械、能源等多个学科的知识,对学生的知识融合和实践动手能力的培养,具有良好的推动作用。 全国大学生“飞思卡尔”杯智能汽车竞赛是在规定的模型汽车平台上,使用飞思卡尔半导体公司的8位、16位微控制器作为核心控制模块,通过增加道路传感器、电机驱动电路以及编写相应软件,制作一个能够自主识别道路的模型汽车,按照规定路线行进,以完成时间最短者为优胜。因而该竞赛是涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科的比赛。 该竞赛以飞思卡尔半导体公司为协办方,自2006年首届举办以来,成功举办了五届,得到了教育部吴启迪副部长、张尧学司长及理工处领导、飞思卡尔公司领导与各高校师生的高度评价,已发展成全国30个省市自治区200余所高校广泛参与的全国大学生智能汽车竞赛。2008年第三届被教育部批准列入国家教学质量与教学改革工程资助项目中9个科技人文竞赛之一(教高函[2007]30号文,附件2),2009年第四届被邀申请列入国家教学质量与教学改革工程资助项目。 分赛区、决赛区比赛规则 在分赛区、决赛区进行现场比赛规则相同,都分为初赛与决赛两个阶段。在计算比赛成绩时,分赛区只是通过比赛单圈最短时间进行评比。决赛区比赛时,还需结合技术报告分数综合评定。 1.初赛与决赛规则 1)初赛规则 比赛场中有两个相同的赛道。 参赛队通过抽签平均分为两组,并以抽签形式决定组内比赛次序。比赛分为两轮,两组同时在两个赛道上进行比赛,一轮比赛完毕后,两组交换场地,再进行第二轮比赛。在每轮比赛中,每辆赛车在赛道上连续跑两圈,以计时起始线为计时点,以用时短的一圈计单轮成绩;每辆赛车以在两个单轮成绩中的较好成绩为赛车成绩;计时由电子计时器完成并实时在屏幕显示。 从两组比赛队中,选取成绩最好的25支队晋级决赛。技术评判组将对全部晋级的赛车进行现场技术检查,如有违反器材限制规定的(指本规则之第一条)当时取消决赛资格,由后备首名晋级代替;由裁判组申报组委会执委会批准公布决赛名单。 初赛结束后,车模放置在规定区域,由组委会暂时保管。

(毕业设计)飞思卡尔智能车及机器视觉

图像处理在智能车路径识别中的应用 摘要 机器视觉技术在智能车中得到了广泛的应用,这项技术在智能车的路径识别、障碍物判断中起着重要作用。基于此,依据飞思卡尔小车的硬件架构,研究机器视觉技术应用于飞思卡尔小车。飞思卡尔智能车处理器采用了MC9S12XS128芯片,路况采集使用的是数字摄像头OV7620。 由于飞思卡尔智能车是是一款竞速小车,因此图像采集和处理要协调准确性和快速性,需要找到其中的最优控制。因此本设计主要需要完成的任务是:怎样用摄像头准确的采集每一场的图像,然后怎样进行二值化处理;以及怎样对图像进行去噪处理;最后也就是本设计的难点也是设计的核心,怎样对小车的轨迹进行补线。 本设计的先进性,在众多的图像处理技术中找到了适合飞思卡尔智能车的图像处理方法。充分发挥了摄像头的有点。经过小车的实际测试以及相关的MATLAB 仿真,最终相关设计内容都基本满足要求。小车的稳定性和快速性得到显著提高。 关键词:OV7620,视频采集,图像处理,二值化

The Application of Image Processing in the Recognition of Intelligent Vehicle Path ABSTRACT CameraMachine vision technology in the smart car in a wide range of applications, the technology identified in the path of the smart car, and plays an important role in the obstacles to judge. Based on this, based on the architecture of the Freescale car, machine vision technology used in the Freescale car. Freescale smart car the processor MC9S12XS128 chip traffic collected using a digital camera OV7620. Freescale's Smart car is a racing car, so the image acquisition and processing to coordinate the accuracy and fast, you need to find the optimal control. This design need to complete the task: how to use the camera to accurately capture every image, and then how to binarization processing; and how to image denoising; last is the difficulty of this design is the design of the core, how to fill line on the trajectory of the car. The advanced nature of the design found in many image processing techniques of image processing methods for Freescale Smart Car. Give full play to the camera a bit. The actual testing of the car and MATLAB simulation, the final design content can basically meet the requirements. The car's stability and fast to get improved significantly. KEY WORDS:OV7620,Video Capture,PictureProcessing,Binarization

飞思卡尔智能车程序

Main.c #include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12db128b" #include "define.h" #include "init.h" // variable used in video process volatile unsigned char image_data[ROW_MAX][LINE_MAX] ; // data array of picture unsigned char black_x[ROW_MAX] ; // 0ne-dimensional array unsigned char row ; // x-position of the array unsigned char line ; // y-position of the array unsigned int row_count ; // row counter unsigned char line_sample ; // used to counter in AD unsigned char row_image ; unsigned char line_temp ; // temperary variable used in data transfer unsigned char sample_data[LINE_MAX] ; // used to save one-dimension array got in interruption // variables below are used in speed measure Unsigned char pulse[5] ; // used to save data in PA process Unsigned char counter; // temporary counter in Speed detect Unsigned char cur_speed; // current speed short stand; short data; unsigned char curve ; // valve used to decide straight or turn short Bounds(short data); short FuzzyLogic(short stand); /*----------------------------------------------------------------------------*\ receive_sci \*----------------------------------------------------------------------------*/ unsigned char receive_sci(void) // receive data through sci { unsigned char sci_data; while(SCI0SR1_RDRF!=1); sci_data=SCI0DRL; return sci_data; } /*----------------------------------------------------------------------------*\ transmit_sci \*----------------------------------------------------------------------------*/ void transmit_sci(unsigned char transmit_data) // send data through sci { while(SCI0SR1_TC!=1); while(SCI0SR1_TDRE!=1);

飞思卡尔智能车竞赛摄像头组——技术报告 精品

"飞思卡尔"杯全国大学生智能汽车竞赛 技术报告

关于技术报告和研究论文使用授权的说明 本人完全了解第八届"飞思卡尔"杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。 参赛队员签名:孟泽民 章志诚 徐晋鸿 带队教师签名:陈朋 朱威 日期:2013.8.15

摘要 本文设计的智能车系统以MK60N512ZVLQ10微控制器为核心控制单元,通过Ov7620数字摄像头检测赛道信息,使用K60的DMA模块采集图像,采用动态阈值算法对图像进行二值化,提取黑色引导线,用于赛道识别;通过编码器检测模型车的实时速度,使用PID 控制算法调节驱动电机的转速和转向舵机的角度,实现了对模型车运动速度和运动方向的闭环控制。为了提高模型车的速度并让其更稳定,我们使用自主编写的Labview上位机、SD卡模块、无线模块等调试工具,进行了大量硬件与软件测试。实验结果表明,该系统设计方案可行。 关键词:MK60N512VMD100,Ov7620,DMA,PID,Labview,SD卡

Abstract In this paper we will design a smart car system based on MK60N512ZVLQ10 as the micro-controller unit. We use a Ov7620 digital image camera to obtain lane image information. The MCU gets the image by its DMA module. Then convert the original image into the binary image by using dynamic threshold algorithm in order to extract black guide line for track identification. An inferred sensor is used to measure the car`s moving speed. We use PID control method to adjust the rotate speed of driving electromotor and direction of steering electromotor,to achieve the closed-loop control for the speed and direction. To increase the speed of the car and make it more reliable,a great number of the hardware and software tests are carried on and the advantages and disadvantages of the different schemes are compared by using the Labview simulation platform designed by ourselves,the SD card module and the wireless module. The results indicate that our design scheme of the smart car system is feasible. Keywords: MK60N512VMD100,DMA,Ov7620,PID,Labview,SD card

相关文档
最新文档