当前位置:文档之家› 飞思卡尔详细代码

飞思卡尔详细代码

飞思卡尔详细代码
飞思卡尔详细代码

主程序

/*******************************************************************/ /* 飞思卡尔智能小车主函数

/*

/* 硬件平台: MC9S12XS128 晶振:12MHZ

/* 软件平台: CodeWarriorIDE

/* 描述:包括各个功能模块的调用

/* 公司: 九江学院

/* 作者日期注释 */

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/* 耕耘者 2012-10-16

/*******************************************************************/

#include

#include

#include "derivative.h"

#include"pwm.h"

#include"image.h"

#include"sci.h"

#include"KeyScan.h"

#include"nokia5110.h"

#include"picture.h"

#include"pid.h"

unsigned char StartDelay = 0;

unsigned char DelayEn = 0;

unsigned int Time2s = 0;

unsigned int CarTime = 0;

unsigned int CarTimeTemp = 0;

unsigned int CarPulse = 0;

unsigned int Speed;

unsigned char IsCountSpeed = 0;

unsigned char IsDisplayOn = 0;

unsigned char THRESHOLD = 0X7D;

unsigned int PIDFlag = 0;

unsigned char PIDOn = 0;

unsigned char keyflag = 1;

unsigned char StartLineFlag = 0;

/****************************************************************************** ** 函数名称: void PWMDuo_Duty(int duo_duty)

** 功能描述: 舵机控制子函数

******************************************************************************/ void PWMDuo_Duty(int duo_duty)

{

PWMDTY01 = duo_duty;

PWME_PWME1 = 1; // 使能PWM3

}

/***************************************************************************** ** 函数名称: void PWMdian_Duty(unsigned char motorValue)

** 功能描述: 控制PWMDTY23的值从而控制输出的占空比使得电机获得不同的速度正转

******************************************************************************/ void PWMdian_Duty(unsigned char motorValue)

{

PWMDTY23 = motorValue;

}

/****************************************************************************** ** 函数名称: void PWMdian_DutyStop(unsigned char motorValue)

** 功能描述: 控制PWMDTY45的值从而控制输出的占空比使得电机获得不同的速度反转

******************************************************************************/ void PWMdian_DutyStop(unsigned char motorValue)

{

PWMDTY45 = motorValue;

}

/****************************************************************************** ** 函数名称: unsigned char GetSpeed(unsigned int CurSpeed)

** 功能描述: 获得小车行驶时的速度大小从而反馈给PID实现PID控制

******************************************************************************/ unsigned char GetSpeed(unsigned int CurSpeed)

{

CurSpeed = CurSpeed/10;

if(CurSpeed>60&&CurSpeed<80)

{

Dianji_data = 45;

}

if(CurSpeed>=80&&CurSpeed<130)

{

Dianji_data = 50;

}

if(CurSpeed>=130&&CurSpeed<180)

{

Dianji_data = 55;

}

if(CurSpeed>=180&&CurSpeed<220)

{

Dianji_data = 60;

}

if(CurSpeed>=220&&CurSpeed<235)

{

Dianji_data = 65;

}

if(CurSpeed>=235&&CurSpeed<270)

{

Dianji_data = 70;

}

if(CurSpeed>=270&&CurSpeed<380)

{

Dianji_data = 40;

}

return Dianji_data;

}

/***************************************************************************** ** 函数名称: void main(void)

** 功能描述: 调用功能函数

******************************************************************************/ void main(void)

{

unsigned char clearFlag = 1;

unsigned int PWM_Value;

PLL_Init(); // 时钟初始化锁相环

TIM_Init(); //定时器初始化

IO_Init(); //IO端口初始化

SCI_Init(); //串口初始化

Init_pwm(); //pwm初始化

PIT_Init();

LCD_Init(); //nokia5110初始化

LCD_clear(); //nokia5110清屏

EnableInterrupts; //中断使能

LCD_draw_bmp_pixel(0,0,picture,84,48);

for(;;)

{

if(IsScanKeyTime == 1)

{

IsScanKeyTime = 0;

KeyPro();

KeyFunction();

}

if(PWMFlag!=0)

{

DelayEn = 1;

if(StartDelay == 1)

{

StartDelay = 0;

PWME_PWME3 = 1;

}

}

else

{

PWME_PWME3 = 0;

Time2s = 0; //保证在按按键之前time2s的值一直为0 }

if(IsCountSpeed == 1)

{

IsCountSpeed = 0;

CarPulse = PulseNum;

Speed = CarPulse*157/10; //每圈100个脉冲转轮周长157cm

PulseNum = 0;

}

if(IsSetMode == 0)

{

IsSetMode = 1;

LCD_clear_half();

Display_Gray(36,3,3);

Display_GUI(0,4,14);

}

Display_Speed(36,5,4);

//窜口发送(注意开了窜口发送会很占用系统资源)

Traver_UartValue();

PWM_Value = IncPIDCalc(GetSpeed(Speed)); //pid调节语句

Dianji_data += PWM_Value;

Get_SideLine();

Car_Cotrol();

PWMDuo_Duty(Duoji_data);

PWMdian_Duty(Dianji_data);

}

}

/***************************************************************************** ** 函数名称: void interrupt 66 PIT0(void)

** 功能描述: 中断服务函数产出时间片

******************************************************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 66 PIT0(void)

{

static unsigned char PIDData = 0;

PITTF_PTF0=1;

++CarTimeTemp;

++PIDFlag;

if(flag%10 == 0)

{

IsScanKeyTime = 1;

}

if(CarTimeTemp == 20) //100ms进行一次速度计算并清除计数值

{

IsCountSpeed = 1;

CarTimeTemp = 0;

}

if(flag%30 == 0)

{

IsDisplayOn = 1;

}

if(++flag == 6500)

{

flag = 0;

StartLineFlag = 1;

}

if(PIDFlag == 2000)

{

PIDFlag = 0;

PIDOn = 1;

}

if(DelayEn==1)

{

Time2s++;

if(Time2s==800) //5s定时

{

Time2s = 0;

DelayEn=0;

StartDelay = 1;

}

}

}

图像处理#include "image.h"

#include

#include "sci.h"

#include "pid.h"

#include "KeyScan.h"

#define ROW 40

#define COLUMN 120

#define ROW_START 10

#define ROW_MAX 200

//#define THRESHOLD 0x7D

extern unsigned char THRESHOLD;

unsigned char SampleFlag=0; //奇偶场标记

unsigned int m=0;

unsigned int Line;

unsigned int hang;

unsigned char a_Temp=0,b_Temp=0;

unsigned char Dianji_data = 50;

unsigned int Duoji_data;

unsigned char Buffer[ROW][COLUMN]={0};

unsigned char image_center[40]={0};

unsigned int zuo_danxian=1,you_danxian=1;

unsigned long WholeRoad = 0;

unsigned long Road = 0;

unsigned char smallSFlage = 0;

unsigned int effectLine = 0;

unsigned char flagg;

//定每场采哪几行。根据像素决定。上面下面采到0了说明超出像素了

unsigned int get_n[]=

{

17,19,21,23,25,28,31,34,37,40,43,46,49,53,57, 61,

65,69,73,77,81,85,89,94,99,105,111,117,123,129,

135,141,147,153,159,166,173,180,187,194,201,208,

215,222,229,236

};

unsigned char SumSave = 0;

unsigned char IsCarStright = 1;

unsigned int PulseNum = 0;

unsigned char JumpDot = 0;

unsigned char IsStartLine = 0;

/****************************************************************************

** 函数名称: void delays(long m)

** 功能描述: 延时函数

******************************************************************************/ void delays(long m)

{

while(m--);

}

/***************************************************************************** ** 函数名称: void GetStartLine(void)

** 功能描述: 扫描跑道上的去跑线

******************************************************************************/ void GetStartLine(void)

{

unsigned char i;

JumpDot = 0;

//扫描第29、30、31、32行的40列到80列如果扫到黑点JumpDot加1

for(i=80;i>40;i--)

if(Buffer[32][i]==0||Buffer[31][i]==0||Buffer[30][i] == 0||Buffer[29][i]==0) JumpDot=JumpDot+1;

//如果JumpDot的值大于12则说明扫描到了起跑线

if(JumpDot>=12)

{

IsStartLine = 1;

}

if(IsStartLine == 1)

{

IsStartLine = 0;

PORTB_PB5 = 0; //灭灯指示

PWME_PWME3 = 0; //关PWM使能

PWMFlag = 0;

}

else

PORTB_PB5 = 1; //亮灯指示

}

/***************************************************************************** ** 函数名称: void TIM_Init(void)

** 功能描述: 行场中断初始化函数

******************************************************************************/ void TIM_Init(void)

{

TIOS=0x00; //外部输入捕捉0,1,2通道

TCTL4=0x29; //通道0 上升沿触发,通道1下降沿触发,通道2上升沿触发

TSCR1=0x80; //使能

TIE=0x07; //通道 0,1,2 中断使能

TFLG1=0xFF; //清中断标志位

}

/***************************************************************************

** 函数名称: void Get_SideLine(void)

** 功能描述: 从j=60开始向两边扫描跑道两边的黑线内边缘,记下两边缘的位置然后中线** 值从而确定跑道中心位置

** * *

** * *

** * *

** (a)* <----- 60 ------->*(b)

** * *

** * *

******************************************************************************/ void Get_SideLine(void)

{

unsigned char i,j,a = 0,b = 0;

for(i=ROW-2;i>0;i--) //屏蔽前两行

{

for(j=60;j>0;j--)

{

if(Buffer[i][j]==0){a=j;break;} //当缓冲区里数据值小于阈值时即检测到黑线,并把j赋给a

}

for(j=60;j<120;j++)

{

if(Buffer[i][j]==0){b=j;break;} //当缓冲区里数据值小于阈值时即检测到黑线,并把j赋给b

}

if(i==30) //从Row-2行开始到Row-10行扫描8行进行一次双线判断

{

if(a==0) zuo_danxian=0; //zuo_danxian为0为白线

else zuo_danxian=1; //zuo_danxian为1为黑线

if(b==0) you_danxian=0;

else you_danxian=1;

}

image_center[i+1]=(a+b)/2; //每进行一次扫描记录一次图像中值

a=b=0; //将a,b清0

}

}

/****************************************************************************** ** 函数名称: void interrupt 66 PIT0(void)

** 功能描述: 把摄像头所拍到的信息发送出来0、1

******************************************************************************/ void Traver_UartValue(void)

{

unsigned char i,j;

for(i=0;i

{

for(j=0;j

{

SCI_Write(Buffer[i][j]+48);

}

SCI_Write(0x0D); //回车

SCI_Write(0X0A); //换行

}

}

/***************************************************************************** ** 函数名称: void Stop_Car(void)

** 功能描述: 电机反向制动即刹车

******************************************************************************/ void Stop_Car(void)

{

PWME_PWME3 = 0; //关正向PWM使能

PWME_PWME5 = 1; //开反向PWM使能

delays(1200); //刹车时间,看情况定

PWME_PWME3 = 1; //刹完车后恢复原来的使能

PWME_PWME5 = 0;

}

/***************************************************************************** ** 函数名称: void Through_Small_S(void)

** 功能描述: 使小车在通过小S弯道时以跑直线的速度通过

*****************************************************************************/ void Through_Small_S(void)

{

unsigned char i,n=0,j = 0;

//判断第10到30的中线值

for(i = 10;i < 30;i++)

{

if(image_center[i]>40&&image_center[i]<80)

{

if(n++ >= 2)

{

effectLine = effectLine + image_center[i];

j++;

}

}

}

if(j<4)

{

flagg=1;

}

else

flagg=0;

n = 0;

effectLine = effectLine / j;

j = 0;

}

/***************************************************************************** ** 函数名称: void Car_Cotrol(void)

** 功能描述: 控制小车直走、左转还是右转

******************************************************************************/ void Car_Cotrol(void)

{

unsigned int sum,j;

Through_Small_S();

if(you_danxian==1&&zuo_danxian==1) //看到两黑线微调

{

if(flagg==1)

{

sum=image_center[31];

}

else

{

sum = effectLine;

effectLine = 0;

}

SumSave = sum;

if(Speed<2000)

Duoji_data=1540+(sum-60)*19;

else

Duoji_data=1540+(sum-60)*5;

PID_Init(StraightSpeed); //左偏向右修正

if(Duoji_data>1900) Duoji_data=1900;

if(Duoji_data<1100) Duoji_data=1100;

//定时一段时间使StartLineFlag置1从而减小系统开销

if(StartLineFlag == 1)

{

// GetStartLine();

}

}

///////////////////max最大转角/////////////////////////////////

if (zuo_danxian==1&&you_danxian==0)

{

if(Speed > 1300) //转弯速度大于1300则刹车避免冲出跑道

{

Stop_Car();

}

for(j=60;j>0;j--)

{

//当缓冲区里数据值小于阈值时即检测到黑线,并把j赋给a if(Buffer[30][j]==0){a_Temp=j;break;}

}

Duoji_data=1540+(a_Temp+20)*12;

PID_Init(TurnSpeed); //PID调节转弯速度

}

//避免电机速度过快

if(Duoji_data>1960) Duoji_data=1960;

if(Duoji_data<1100) Duoji_data=1100;

if(zuo_danxian==0&&you_danxian==1)

{

if(Speed > 1300)

{

Stop_Car();

}

for(j=60;j<120;j++)

{

//当缓冲区里数据值小于阈值时即检测到黑线,并把j赋给b if(Buffer[30][j]==0){b_Temp=j;break;}

}

Duoji_data=1540+(b_Temp-120)*12;

PID_Init(TurnSpeed);

if(Duoji_data>1900) Duoji_data=1900;

if(Duoji_data<1100) Duoji_data=1100;

}

//过十字路口

if (zuo_danxian==0&&you_danxian==0)

{

if(SumSave>65||SumSave<55)

IsCarStright = 0;

else

IsCarStright = 1;

if(IsCarStright == 0)

Duoji_data=1540-(SumSave-60)*9;

else

Duoji_data=1540;

if(Duoji_data>1900) Duoji_data=1900;

if(Duoji_data<1100) Duoji_data=1100;

PID_Init(CrossSpeed); //找不到黑线直走(方便调试)

}

}

/***************************************************************************** ** 函数名称: void Image_binaryzation(unsigned int row)

** 功能描述: 二值化

******************************************************************************/ void Image_binaryzation(unsigned int row)

{

unsigned char i;

for(i=0;i<120;i++)

{

if(Buffer[row][i] < THRESHOLD)//THRESHOLD为溢值

Buffer[row][i] = 0; //小于溢值为0

else

Buffer[row][i] = 1; //大于溢值为1

}

}

/**************************************************************************** ** 函数名称: void interrupt 8 PT0_Interrupt(void)

** 功能描述: 行中断处理函数

******************************************************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 8 PT0_Interrupt(void)

{

TFLG1_C0F=1;

Line++;

if ( SampleFlag == 0 || LineROW_MAX )

{

}

if( Line==get_n[hang])

{

delays(8);

Buffer[m][0]=PORTA;_asm();Buffer[m][1]=PORTA;_asm();Buffer[m][2]=PORTA;_asm();B uffer[m][3]=PORTA;_asm();Buffer[m][4]=PORTA;_asm();

Buffer[m][5]=PORTA;_asm();Buffer[m][6]=PORTA;_asm();Buffer[m][7]=PORTA;_asm();B uffer[m][8]=PORTA;_asm();Buffer[m][9]=PORTA;_asm();

Buffer[m][10]=PORTA;_asm();Buffer[m][11]=PORTA;_asm();Buffer[m][12]=PORTA;_asm( );Buffer[m][13]=PORTA;_asm();Buffer[m][14]=PORTA;_asm();

Buffer[m][15]=PORTA;_asm();Buffer[m][16]=PORTA;_asm();Buffer[m][17]=PORTA;_asm( );Buffer[m][18]=PORTA;_asm();Buffer[m][19]=PORTA;_asm();

Buffer[m][20]=PORTA;_asm();Buffer[m][21]=PORTA;_asm();Buffer[m][22]=PORTA;_asm( );Buffer[m][23]=PORTA;_asm();Buffer[m][24]=PORTA;_asm();

Buffer[m][25]=PORTA;_asm();Buffer[m][26]=PORTA;_asm();Buffer[m][27]=PORTA;_asm( );Buffer[m][28]=PORTA;_asm();Buffer[m][29]=PORTA;_asm();

Buffer[m][30]=PORTA;_asm();Buffer[m][31]=PORTA;_asm();Buffer[m][32]=PORTA;_asm( );Buffer[m][33]=PORTA;_asm();Buffer[m][34]=PORTA;_asm();

Buffer[m][35]=PORTA;_asm();Buffer[m][36]=PORTA;_asm();Buffer[m][37]=PORTA;_asm( );Buffer[m][38]=PORTA;_asm();Buffer[m][39]=PORTA;_asm();

Buffer[m][40]=PORTA;_asm();Buffer[m][41]=PORTA;_asm();Buffer[m][42]=PORTA;_asm( );Buffer[m][43]=PORTA;_asm();Buffer[m][44]=PORTA;_asm();

Buffer[m][45]=PORTA;_asm();Buffer[m][46]=PORTA;_asm();Buffer[m][47]=PORTA;_asm( );Buffer[m][48]=PORTA;_asm();Buffer[m][49]=PORTA;_asm();

Buffer[m][50]=PORTA;_asm();Buffer[m][51]=PORTA;_asm();Buffer[m][52]=PORTA;_asm( );Buffer[m][53]=PORTA;_asm();Buffer[m][54]=PORTA;_asm();

Buffer[m][55]=PORTA;_asm();Buffer[m][56]=PORTA;_asm();Buffer[m][57]=PORTA;_asm( );Buffer[m][58]=PORTA;_asm();Buffer[m][59]=PORTA;_asm();

Buffer[m][60]=PORTA;_asm();Buffer[m][61]=PORTA;_asm();Buffer[m][62]=PORTA;_asm( );Buffer[m][63]=PORTA;_asm();Buffer[m][64]=PORTA;_asm();

Buffer[m][65]=PORTA;_asm();Buffer[m][66]=PORTA;_asm();Buffer[m][67]=PORTA;_asm( );Buffer[m][68]=PORTA;_asm();Buffer[m][69]=PORTA;_asm();

Buffer[m][70]=PORTA;_asm();Buffer[m][71]=PORTA;_asm();Buffer[m][72]=PORTA;_asm( );Buffer[m][73]=PORTA;_asm();Buffer[m][74]=PORTA;_asm();

Buffer[m][75]=PORTA;_asm();Buffer[m][76]=PORTA;_asm();Buffer[m][77]=PORTA;_asm( );Buffer[m][78]=PORTA;_asm();Buffer[m][79]=PORTA;_asm();

Buffer[m][80]=PORTA;_asm();Buffer[m][81]=PORTA;_asm();Buffer[m][82]=PORTA;_asm( );Buffer[m][83]=PORTA;_asm();Buffer[m][84]=PORTA;_asm();

Buffer[m][85]=PORTA;_asm();Buffer[m][86]=PORTA;_asm();Buffer[m][87]=PORTA;_asm( );Buffer[m][88]=PORTA;_asm();Buffer[m][89]=PORTA;_asm();

Buffer[m][90]=PORTA;_asm();Buffer[m][91]=PORTA;_asm();Buffer[m][92]=PORTA;_asm( );Buffer[m][93]=PORTA;_asm();Buffer[m][94]=PORTA;_asm();

Buffer[m][95]=PORTA;_asm();Buffer[m][96]=PORTA;_asm();Buffer[m][97]=PORTA;_asm( );Buffer[m][98]=PORTA;_asm();Buffer[m][99]=PORTA;_asm();

Buffer[m][100]=PORTA;_asm();Buffer[m][101]=PORTA;_asm();Buffer[m][102]=PORTA;_a sm();Buffer[m][103]=PORTA;_asm();Buffer[m][104]=PORTA;_asm();

Buffer[m][105]=PORTA;_asm();Buffer[m][106]=PORTA;_asm();Buffer[m][107]=PORTA;_a

sm();Buffer[m][108]=PORTA;_asm();Buffer[m][109]=PORTA;_asm();

Buffer[m][110]=PORTA;_asm();Buffer[m][111]=PORTA;_asm();Buffer[m][112]=PORTA;_a sm();Buffer[m][113]=PORTA;_asm();Buffer[m][114]=PORTA;_asm();

Buffer[m][115]=PORTA;_asm();Buffer[m][116]=PORTA;_asm();Buffer[m][117]=PORTA;_a sm();Buffer[m][118]=PORTA;_asm();Buffer[m][119]=PORTA;_asm();

Buffer[m][120]=PORTA;

Image_binaryzation(m); //二值化

hang++;

m++;

}

}

/*************************************************************************

** 函数名称: void interrupt 9 PT1_Interrupt(void)

** 功能描述: 场中断处理函数奇偶场同步信号中断采集

*****************************************************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 9 PT1_Interrupt(void)

{

TFLG1_C1F=1; //清除中断状态标志位 0通道

TFLG1_C0F=1; //清除中断状态标志位 1通道

m=0;

Line=0;

hang=0;

SampleFlag=~SampleFlag;

if(SampleFlag==0)

{

PTM=0x0e;

TIE=0x06;

}

else

{

PTM=0x07;

TIE=0x07;

}

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 10 PT2_Interrupt()

{

TFLG1_C2F=1; //清除中断状态标志位2通道

++WholeRoad;

++PulseNum;

}

按键

#include"KeyScan.h"

#include

#include "Nokia5110.h"

extern unsigned char THRESHOLD;

unsigned int flag = 0;

unsigned char IsScanKeyTime = 0;

unsigned char KeyPressed = 0,KeyPressing = 0,KeyCode = 0; unsigned char IsKeyPressed = 0;

unsigned char PWMFlag = 0;

unsigned char KeyMode = 0;

unsigned char SetMode = 0;

unsigned char StraightSpeed = 70;

unsigned char TurnSpeed = 60;

unsigned char CrossSpeed = 50;

unsigned char SpeedStep = 0;

unsigned char IsSetMode = 0;

char *cc = "M";

飞思卡尔单片机编程

关于Codewarrior 中的 .prm 文件 网上广泛流传的一篇文章讲述的是8位飞思卡尔单片机的内存映射,这几天,研究了一下Codewarrior 5.0 prm文件,基于16位单片机MC9S12XS128,一点心得,和大家分享。有什么错误请指正。 正文: 关于Codewarrior 中的.prm 文件 要讨论单片机的地址映射,就必须要接触.prm文件,本篇的讨论基于Codewarrior 5.0 编译器,单片机采用MC9S12XS128。 通过项目模板建立的新项目中都有一个名字为“project.prm”的文件,位于Project Settings->Linker Files文件夹下。一个标准的基于XS128的.prm文件起始内容如下: .prm文件范例: NAMES END SEGMENTS RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;

READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF; ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF; //OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF; EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF; EEPROM_01 = READ_ONLY DATA_FAR IBCC_FAR 0x010800 TO 0x010BFF; EEPROM_02 = READ_ONLY DATA_FAR IBCC_FAR 0x020800 TO 0x020BFF; EEPROM_03 = READ_ONLY DATA_FAR IBCC_FAR 0x030800 TO 0x030BFF; EEPROM_04 = READ_ONLY DATA_FAR IBCC_FAR 0x040800 TO 0x040BFF; EEPROM_05 = READ_ONLY DATA_FAR IBCC_FAR 0x050800 TO 0x050BFF; EEPROM_06 = READ_ONLY DATA_FAR IBCC_FAR 0x060800 TO 0x060BFF; EEPROM_07 = READ_ONLY DATA_FAR IBCC_FAR 0x070800 TO 0x070BFF; PAGE_F8 = READ_ONLY DATA_FAR IBCC_FAR 0xF88000 TO 0xF8BFFF;

飞思卡尔智能车电机资料上课讲义

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为舵机的控制线。 图3.3 舵机控制要求

飞思卡尔K60 DMA 中文手册

/*----------------------------------------------------------------------------------------------------------------------------- 桂林电子科技大学 物联网工程 Editor:JaceLin Date:2014.2.5 -------------------------------------------------------------------------------------------------------------------------------- 一、DMA特性 1)k60有16个DMA通道 二、寄存器 1)控制寄存器:DMA_CR 31-18 reserved 17 CX 取消转移,0正常操作,1取消剩下数据转移 16 ECX 错误取消转移,0正常操作,1取消转移 15-8 reserved 14 EMLM 使能副循环映射 0 禁止,TCDn.word2 为32位 1 使能,TCDn.word被重新定义 6 CLM 持续连接模式,0当副循环结束后,再次激活DMA要通过裁决,1不用裁决 5 HALT 停止DMA操作,0正常模式,1停止DMA操作 4 HOE 错误时停止,0正常操作,1当有错误时HALT=1,也就是DMA停止 3 reserved 2 ERCA 使能循环通道裁决, 1 EDBG 使能调试,写0,调试也用DMA,写1,调试时DMA不可用 0 reserved 2)错误状态寄存器DMA_ES 31 VLD 所有错误状态位逻辑或,0没有错误,1表示至少有1个错误没有清除 30-17 保留 16 ECX 转移被取消0没有被取消的转移,1最后一次记录是被取消的转移 15 保留 14 CPE 通道优先错误,0没有通道优先错误,1有 13-12 保留 11-8 ERRXHN 错误通道位/被取消的位(最多16位) 7 SAE 源地址错误,0没有源地址配置错误,1有错误 6 SOE 源偏移错误,0没有源偏移配置错误,1有偏移配置错误 5 DAE 目标地址错误,0没有错,1有错误 4 DOE 目标偏移错误,0没有错误,1有 3 NCE NBYTES/CITER配置错误,0没有,1有 2 SGE Scatter/Gather配置错误,0没有,1有 1 SBE 源总线错误,0没有错误,1有

飞思卡尔MC9S12XS128技术手册翻译AD

飞思卡尔MC9S12XS128技术手册(AD转换部分) 英文资料:飞思卡尔MC9S12XS256RMV1官方技术手册 1.1 XS12系列单片机的特点 XS12系列单片机特点如下: ·16位S12CPU —向上支持S12模糊指令集并去除了其中的MEM, WAV, WAVR, REV, REVW 五条指令; —模块映射地址机制(MMC); —背景调试模块(BDM); ·CRG时钟和复位发生器 —COP看门狗; —实时中断; ·标准定时器模块 —8个16位输入捕捉或输出比较通道;; —16位计数器,8位精密与分频功能; —1个16位脉冲累加器; ·周期中断定时器PIT —4具有独立溢出定时的定时器; —溢出定时可选范围在1到2^24总线时钟; —溢出中断和外部触发器; ·多达8个的8位或4个16位PWM通道 —每个通道的周期和占空比有程序决定; —输出方式可以选择左对齐或中心对其; —可编程时钟选择逻辑,且可选频率范围很宽; ·SPI通信模块 —可选择8位或16位数据宽度;

—全双工或半双工通信方式; —收发双向缓冲; —主机或从机模式; —可选择最高有效为先输出或者最低有效位先输出; ·两个SCI串行通信接口 —全双工或半双工模式 ·输入输出端口 —多达91个通用I/O引脚,根据封装方式,有些引脚未被引出; —两个单输入引脚; ·封装形式 —112引脚薄型四边引线扁平封装(LQFP); —80引脚扁平封装(QFP); —64引脚LQFP封装; ·工作条件 —全功率模式下单电源供电范围3.15V到5V; —CPU总线频率最大为40MHz —工作温度范围–40 C到125 C 第十章模拟—数字转换 10.1 介绍 ADC12B16C是一个16通道,12位,复用方式输入逐次逼近模拟—数字转换器。 ATD的精度由电器规格决定。 10.1.1 特点 ·可设置8位、10位、12位精度 ·在停止模式下,ATD转换使用内部时钟 ·转换序列结束后自动进入低耗电模式 ·可编程采样时间 ·转化结果可选择左对齐或右对齐

freescale MC9S12P128中文手册

1 Chapter1 Device Overview MC9S12P-Family 1.1介绍 The MC9S12P 系列单片机是经过优化后有着低成本、高性能、低引脚数的汽车专业级单片机产品,该产品倾向于弥补高端16位单片及产品如MC9S12XS和低端8位单片机产品之间的空缺。MC9S12P 主要针对于要求使用CAN 或者LIN/J2602通讯接口的汽车应用产品,典型的应用案例包括车身控制器、乘坐人员检测、车门控制、座椅控制、遥控车门开关信号接收器、智能执行器、车灯模块、智能接线器。 The MC9S12P 系列单片机使用了很多MC9S12XS系列单片机相同的功能,包括片内闪存错误纠正代码(ECC)、一个专为数据诊断或者数据存储的单独的数据闪存模块、高速AD转换器和高频调制锁相环(IPLL)有效改善电磁兼容性能。MC9S12P系列单片机提供的所有16为单片机优点和微处理器效率,同时保持飞思卡尔用户熟悉的8位及16位单片机,低成本,功耗,EMC和高效的代码80针QFP、64针LQFP、40针QFN封装产品,最大限度的与MC9S12尺寸的优点,如同MC9S12XS一样可以无需等待外围设备和内存的状态既可以运行16为带款的寻址,MC9S12P系列单片机主要有XS引脚兼容. I/O口在各种模式下都可以使用,同时具有中断功能的I/O口还可以在停止或等待模式下唤醒。 1.2 芯片特性 表一:提供了MC9S12P家庭成员特征摘要, 1.P或D寄存器擦除或者编程需要最低总线频率为1MHZ

1.2.2 芯片功能 ? S12 CPU 内核 ? 高达128 KB具有ECC功能的片上闪存 ? 4 Kbyte带ECC功能的数据闪存 ? 高达6 Kb片上静态存储器(SRAM) ? 具有内部滤波器的锁相环倍频器(IPLL) ? 4–16 MHz 皮尔斯振荡器 ? 1 MHz内部RC振荡器 ? 定时器(TIM) 具有16位输入捕捉、输出比较、计数器脉冲累加器功能 ? 具有8位6通道的脉冲调制模块(PWM) ? 10通道12位分辨率的逐次逼近AD转换器 ? 1个串行通信外部接口(SPI) ? 1个支持局域网通讯串行通信(SCI) 模块 ?一个多可扩展控制器区域网络(MSCAN) 模块(支持CAN 协议2.0A/B) ?片上电压调节器(VREG) 可对内部供电及内部电压整流 ? 自主周期中断(API) 1.3 模块特征 1.3.1 CPU S12 CPU 是一个高速的16位处理单元: ?全16-bit数据通道提供有效的数学运算和高速的数学执行 ? 包含很多单字节指令,可以有效的利用ROM空间 ? 宽域变址寻址功能: —采用堆栈指针作为所有变址操作的变址寄存器 —除了在自增或自减模式下都可以利用程序计数器作为变址寄存器 —使用A\B\D累加器做累加器偏移 —自动变址,前递增(++a)、前递减(--a)、后递减(a--)、后递增(a++)(by –8 to +8) 1.3.2 带ECC功能的片内闪存 ? 高达128 Kb程序闪存空间 — 32 位数据加7 位ECC (纠错码) 允许单字节纠错和双字节纠错 — 512字节擦出扇区空间 —自动编程和擦除算法 —用户设置读写页面边界 —具有可以防止偶然编程或者擦除的保护结构 ? 4 Kb 数据闪存空间 — 16 位数据加6位纠错码允许单字节和双字节纠错功能 — 256 字节的擦出扇区空间 —自动编程和擦除算法 —用户设置读写页面边界 1.3.3 片内静态存储器

飞思卡尔单片机LED控制例程详解

我的第一个LED程序 准备工作: 硬件:Freescale MC9S08JM60型单片机一块; 软件:集成开发环境codewarrior IDE; 开发板上有两个LED灯,如下图所示: 实验步骤: 1.首先,确保单片机集成开发环境及USBDM驱动正确安装。其中USBDM的安装步骤如下:?假设之前安装过单片机的集成开发环境6.3版本:CW_MCU_V6_3_SE; ?运行USBDM_4_7_0i_Win,这个程序会在c盘的程序文件夹下增加一个目录C:\Program Files\pgo\USBDM 4.7.0,在这个目录下: 1〉C:\ProgramFiles\pgo\USBDM 4.7.0\FlashImages\JMxx下的文件 USBDM_JMxxCLD_V4.sx是下载器的固件文件; 2〉C:\Program Files\pgo\USBDM 4.7.0\USBDM_Drivers\Drivers下有下载器的usb 驱动 所以在插入usb下载器,电脑提示发现新的usb硬件的时候,选择手动指定驱动 安装位置到以上目录即可。 ?运行USBDM_4_7_0i_Win之后,还会在目录: C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.3\prog\gdi 下增加一些文件,从修改时间上来看,增加了6个文件,这些文件是为了在codewarrior 集成开发环境下对usb下载器的调试、下载的支持。

2.新建一个工程,工程建立过程如下: ?运行单片机集成开发环境codewarrior IDE ?出现如下界面 ●Create New Project :创建一个新项目工程 ●Load Example Project :加载一个示例工程 ●Load Previous Project :加载以前创建过的工程 ●Run Getting started Tutorial:运行CodeWarrior软件帮助文档 ●Start Using CodeWarrior:立刻使用CodeWarrior ?点击Create New project按钮,以创建一个新的工程,出现选择CPU的界面 如下,请选择HCS08/HCS08JM Family/MC9S08JM60,在右边的Connection窗口

2011飞思卡尔问题官方回答汇总(1)

所属赛区: 华南赛区 提问时间: 2010年11月16日 18:22:33 问题标题: A 车模问题 问题内容: 如老师所言,A 车模在承轴等一些小方面做了改动,那以前买的A 车模能不能用于参加第六届的比赛? 回 答: 可以。秘书处 队伍名称: 风之子 所属赛区: 华北赛区 提问时间: 2010年11月24日 20:38:55 问题标题: 去年车模 问题内容: 请问去年的B 型车模能参赛吗?能的话,能参加哪个组别的? 回 答: 去年B 型车模由于质量不稳定,今年已经取消该车莫,所以今年 不能参加比赛了。而规定使用新型的B 型车模。 队伍名称: 光电一队 所属赛区: 华东赛区 提问时间: 2010年12月03日 16:56:39 问题标题: 禁止使用D C -D C 升压电路直接为驱动电机以及舵机提供动力 问题内容: 规则的这句话是什么意思,舵机可不可以用开关稳压芯片供电? 谢谢。 回 答: 规定禁止使用D C -D C 升压电路为点电机和舵机供电指的是电机和 舵机的供电电压不得高于电池的电压(7.2V )。 舵机可以使用开 关降压稳压电路供电。 队伍名称: 追风队 所属赛区: 西部赛区 提问时间: 2010年12月03日 22:21:53 问题标题: C 车模 问题内容: 请问C 车模的电机的电压,电流等参数是多少啊?我们好准备。 谢谢! 回 答: C 型车模的电机(马达)参数如下: 额定工作电压:7.2V ,最大工作电压 9.6V 最大效率点: 电流:0.679A ,转速:13050p r m 最大功率点: 电流1.537A ,转速:8044 堵转电流:2.916A C 型车模马达到后轮的传动比为7.46

第二届全国大学生“飞思卡尔杯”智能汽车竞赛背景介绍概要

第二届全国大学生“飞思卡尔杯”智能汽车竞赛 背景介绍 全国大学生智能汽车竞赛于2005年11月正式启动,去年的第一届“飞思卡尔杯”全国大学生智能汽车邀请赛共有来自全国59所大学的112支队伍参加。今年,第二届全国大学生“飞思卡尔杯”智能汽车竞赛将规模扩大到全国超过100所院校,参赛队将近240支,并在全国分成五个赛区进行预赛,各区按照参赛队数量根据一定比例选拔出共76支队参加8月底在上海交通大学进行的全国总决赛。比赛将决出特等奖、一等奖和二等奖等奖项若干名。 该项竞赛是教育部为了加强大学生实践、创新能力和团队精神的培养而设立的。旨在进一步深化高等工程教育改革,培养本科生获取知识、应用知识的能力及创新意识;培养硕士生从事科学和技术研究能力,知识和技术创新能力。 全国大学生智能汽车竞赛与已在全国举办的数学建模、电子设计、机械设计、结构设计等专业竞赛不同,是以迅猛发展的汽车电子为背景,涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科交叉的科技创意性比赛。教育部委托高等学校自动化专业教学指导分委员会主办每年一度的全国大学生智能汽车竞赛;高等学校自动专业教学指导分委员会决定飞思卡尔半导体公司为协办单位,赛事冠名为“飞思卡尔杯”。第二届“飞思卡尔杯”全国大学生智能汽车竞赛分赛区和决赛的承办院校从自愿报名的院校中竞争选拔产生。 竞赛组委会成员 “飞思卡尔杯”全国大学生智能汽车竞赛组织委员会由高等学校自动化专业教学指导分委员会主任委员吴澄院士任主任委员,教育部高等教育司张尧学司长、飞思卡尔高级副总裁兼汽车与标准产品部总经理Paul Grimme先生、飞思卡尔高级副总裁兼亚太区主席姚天丛先生、清华大学副校长汪劲松教授、高等学校自动化专业教学指导分委员会副主任委员申功璋教授任副主任委员。 参赛队组成

飞思卡尔KE02系列简介

1Kinetis E series Kinetis E series provide the highly scalable portfolio of ARM ? Cortex ?-M0+ MCUs in the industry. With 2.7–5.5 V supply and focus on exceptional EMC/ESD robustness,Kinetis E series devices are well suited to a wide range of applications in electrical harsh environments, and is optimized for cost-sensitive applications offering low pin-count option.The Kinetis E series offers a broad range of memory,peripherals, and package options. They share common peripherals and pin counts allowing developers to migrate easily within an MCU family or among the MCU families to take advantage of more memory or feature integration. This scalability allows developers to standardize on the Kinetis E series for their end product platforms, maximising hardware and software reuse and reducing time-to-market. Following are the general features of the Kinetis E series MCUs. ?32-bit ARM Cortex-M0+ core ?Scalable memory footprints from 8 KB flash / 1 KB SRAM to 128 KB flash / 16 KB SRAM ?Precision mixed-signal capability with on chip analog comparator and 12-bit ADC ?Powerful timers for a broad range of applications including motor control ?Serial communication interfaces such as UART, SPI,I 2C, and others. ?High security and safety with internal watchdog and programmable CRC module Product Brief Rev 3, 07/2013 KE02 Product Brief Supports all KE02 devices ? 2013 Freescale Semiconductor, Inc. Contents 1Kinetis E series..........................................................12KE02 sub-family introduction..................................23Block diagram...........................................................34Features.....................................................................45Power modes.. (136) Revision history (14)

飞思卡尔汽车芯片

飞思卡尔推出业界最强大的汽车动力总成系统微 控制器 2011-10-14 18:05:18 来源:与非网 关键字:飞思卡尔Qorivva MCU 动力总成控制系统 2011年10月12日-德国巴登(2011汽车电子系统展览会)–汽车厂商继续通过新的汽车设计将业界标准提升至新高度,通过交付具有更高燃油经济性和更低排放的汽车满足消费者的期望和政府的法规要求。高性能微控制器(MCU)在环保汽车设计领域扮演着重要角色,飞思卡尔半导体(NYSE:FSL)日前宣布推出强大的多核心汽车MCU系列中的第一款产品,帮助汽车设计者更加轻松地提高引擎效率并降低排放污染。 飞思卡尔新推出的多核心Qorivva 32位MPC5676R MCU在Power Architecture?技术的基础上构建,与上一代单核心MPC5566 MCU相比,性能提高了四倍、内存空间提高了一倍、并提供了更多功能。MPC5676R的多种优势允许全球汽车厂商在单一控制器中融合多种尖端技术,例如直喷、涡轮增压和有线系统全驱动。 飞思卡尔负责汽车MCU业务副总裁Ray Cornyn表示,“飞思卡尔充分了解帮助汽车厂商生产更加环保、燃油效率更高的汽车所需的关键技术及其重要性,长期以来我们一直与汽车行业合作,共同开发可以满足其最新一代设计需求的解决方案。在动力总成领域,我们的目标是生产最强大、最灵活的MCU,它可以同时管理最新引擎的所有复杂控制任务,为设计者提供了降低系统复杂性所需的工具和软件平台。” 90纳米双核心MPC5676R MCU配备了: ? 6 MB片上闪存 ?384 KB片上RAM ?三个高性能增强型时序处理器单元(eTPU)

飞思卡尔单片机知识点

1、单片机组成:1> CPU 2> 存储器3>I/O ; 2、存储器包括2大类:ROM , RAM 3、标准ASCII码使用(1)个字节表示字符; 4、BCD码是用()进制表示的()的数据; 5、HCS08QG8的最小系统包括(电源电路,复位电路,下载口,(内部时钟)); 6、QG8管脚数量(16)、只能输入的是(PTA5)、只能输出的是(PTA4)、程序下载的是、接外部时钟的是; 7、QG8的管脚可以作为数字输入输出、也可以作为模拟输入,可以作为模拟输入的有(); 8、QG8管脚复用优先级最低的功能是(I/O); 9、QG8存储器配置中,不同资源的分界线……; 10、CPU寄存器有(A, HX, PC, CCR, SP); 11、可以执行位操作的地址范围(0X0000~0X005F); 12、有地址的寄存器分成了(3)块(0页,高页,非易失); 13、如何在C语言中定义常数(数据类型变量名;),如何指定变量的地址(数据类型变量名@ 地址;); 14、堆栈的管理者是寄存器(SP); 15、SP的复位缺省值是(0X00FF); 16、堆栈对数据的操作特点是(向上生长型:先压后涨、先减后弹); 17、堆栈一般在RAM的高地址区域还是低地址区域?高地址区 18、内部时钟源包括哪4大部分? 19、外部时钟分哪2大类;振荡器,整形外部时钟 20、内部时钟中FLL固定倍频(512倍频); 21、ICS的7种工作模式(FEI, FEE, FBI, FBILP, FBE, FBELP, stop); 22、ICS的内部参考时钟是可以校准、微调的,调整的寄存器名(ICSTRM);该寄存器的数值越大,输出时钟频率越(低); 23、FLASH是按页管理的,页大小(512)字节,每页分(8)行; 24、高页寄存器位于FLASH的最后一页的(第六行/0xFFB0~0xFFBF)位置; 25、FLASH的最后一页最后一行是(中断向量); 26、FLASH块保护寄存器(FPROT);块加密寄存器(FOPT);对应的非易失寄存器分别是(NVOPT, NVPROT); 27、FLASH操作的一般过程是(); 28、FLASH操作的有效命令有(空检查,字节编程,突发模式编程,页擦除,全部ROM 擦除); 29、记录程序运行状态的CPU寄存器是(CCR); 30、指令系统包括6大类指令,分别是(算术运算指令、数据传送指令、数据和位操作、逻辑运算、程序控制、堆栈处理); 31、寻址方式是指(CPU访问操作数和数据的方法); 32、寻址方式包括7大类16种,分别是: INH IMM DTR EXT IX,IX1,IX2,SP1,SP2,IX+,IX1+ REL IMD, DD,IX+D,DIX+ 33、8指令模板和6指令模板分别是(); 34、QG8是高电平复位还是低电平复位?低电平 35、QG8数据存储器RAM的大小为(512)字节; 36、上电复位期间将管脚(A4)设置为(低)电平可以进入调试模式 37、QG8的存储器结构为冯·诺伊曼还是哈佛结构?冯诺依曼

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

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

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

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

第四届全国大学生“飞思卡尔”杯智能汽车竞赛

比赛规则与赛场纪律 参赛选手须使用竞赛秘书处统一指定并负责采购竞赛车模套件,采用飞思卡尔半导体公司的8位、16位微控制器作为核心控制单元,自主构思控制方案进行系统设计,包括传感器信号采集处理、动力电机驱动、转向舵机控制以及控制算法软件开发等,完成智能车工程制作及调试,于指定日期与地点参加各分赛区的场地比赛,在获得决赛资格后,参加全国决赛区的场地比赛。参赛队伍之名次(成绩)由赛车现场成功完成赛道比赛时间为主,技术报告、制作工程质量评分为辅来决定。大赛分为光电与摄像头两个赛题组,在车模中使用透镜成像进行道路检测方法属于摄像头赛题组,除此之外则属于光电赛题组。 竞赛秘书处制定如下比赛规则适用于各分赛区预赛以及全国总决赛。在实际可操作性基础上力求公正与公平参与。秘书处将邀请独立公证人监督现场赛事及评判过程。 一、器材限制规定 1. 须采用统一指定的车模,细节及改动限制见附件一; 2. 须采用飞思卡尔半导体公司的 8 位、 16 位处理器 ( 单核 ) 作为唯一的微控制器,推荐使用 9S12XS128 , 9S08AW60 微控制器。有关细节及其它电子器件使用的限制见附件二; 3. 参加光电赛题组中不允许传感器获取道路图像信息进行路径检测,参加摄像头赛题组可以使用光电管作为辅助检测手段. 其他事项 ?如果损毁车模中禁止改动的部件,需要使用相同型号的部件替换; ?车模改装完毕后,尺寸不能超过:250mm 宽和400mm长。 二、有关赛场的规定 1. 赛道基本参数(不包括拐弯点数、位置以及整体布局)见附件三; 2. 比赛赛道实际布局将在比赛当日揭示,在赛场内将安排采用制作实际赛道的材料所做的测试赛道供参赛队进行现场调试; 三、裁判及技术评判 竞赛分为分赛区和全国总决赛两个阶段。其中全国总决赛阶段是在竞赛组委会和秘书处指导下,由决赛承办学校成立竞赛执行委员会,下辖技术租、裁判组和仲裁委员会,统一处理竞赛过程中遇到的各类问题。 所有竞赛组织委员会工作人员,包括技术评判组及现场裁判组人员均不得参与任何针对个别参赛队的指导或辅导工作(提供微控制器培训除外),不得泄

飞思卡尔智能车程序

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);

飞思卡尔错误Symbol _FMUL--1822解决方法

这是飞思卡尔 XS128平台比较常见的LINK错误。 但是要解决起来也比较头疼。 很多人也许有这样的经历,整个工程目录是在别人做过的所有文件拷贝过来然后修改代码符合自己项目要求而产生的。这就发生了一个问题, 当初新建工程时的很多配置,比如预处理器配置,就会出现不适用当前项目。比如,本文所要提到的链接错误。 这个错误发生于: 原工程在新建的时候在某一步有与float相关的三个选项,如图: 如果你选择了none,那么不幸的是,如果在代码中加入关于float的四则运算等代码,就会出现该链接错误。 然而,新建一个带float的工程然后把代码文件都添加进去是不是就能解决该链接错误呢?答案是不一定的。 笔者做了一个测试,发现在Make的时候会死机,整个IDE就卡在这儿了。 当然,也不一定会出现这种情况,原因还是在原先的工程配置你并不清楚什么样的,或者其它原因也说不定.

那么,该如何解决LINK错误并通过编译呢? 先看下飞思卡尔官方的解释: Basically for HC12 you have to remove the option -D__NO_FLOAT__ from compile r command line and add floating point format option (if needed) then replace ansi libr ary file. To retrieve the appropriate ansi library file check the file readme.txt from {Install}\lib \hc12c. 按照提示,第一步 将编译器命令进行修改: 按第二个按钮进入标准设置。 然后在命令行参数设置框里将-D__NO_FLOAT__命令删除:

飞思卡尔i.MX6平台DRAM接口高阶应用指导-DDR3篇

飞思卡尔i.MX6平台DRAM接口高阶应用指导-DDR3篇 本文意于介绍基于i.MX6平台如何使用官方工具调试DDR3. 以下内容会在本文中涉及:原理图及PCB版图设计规则,DDR3初始化代码生成工具,DDR3自校准和压力测试工具。Contents 1DRAM Design Consideration (2) 2DDR3 initialization Script Generation Aid (3) 3DDR Stress Test Tool (10) 4Further Reading (19)

1 设计DRAM 的注意事项 飞思卡尔的硬件应用团队总结了一个名为 “HW Design Checking List for i.Mx6” 的文档来分享i.MX6硬件设计经验。 请通过以下链接来获得该文档: https://https://www.doczj.com/doc/2213218387.html,/docs/DOC-93819 1.1 原理图和布线设计规则 下表中的内容摘自“HW Design Checking List for i.Mx6”。使用i.MX6平台进行设计时务必遵循里面的规则。设计者应当逐条予以确认。如有任何疑问或不确定之处,请寻求飞思卡尔的技术支持本们的帮助。 原理图检查清单 1 i.Mx6和DDR 芯片的ZQ 管脚需要分别外加一个1%精度的240欧姆电阻到地 2 提供一路低噪声并且等于50%NVCC_DRAM 电压值的电源给DRAM_VREF 管脚(更多细节请参考原文档) 3 DRAM_RESET 管脚需要外接一个10 K 欧姆的电阻到地(更多细节请参考原文档) 4 差分时钟端接设计规则(更多细节请参考原文档) 5 如果DDR3颗粒的数量少于等于四颗-PCB 顶面两颗底面两颗,建议使用T 拓扑结构。如果 PCB 单面需要部多于两颗DDR3颗粒,建议使用Fly-by 拓扑结构。 布线检查清单 1 DQS 和CLK 信号线需要差分100欧姆阻抗控制,数据,地址和控制信号线需要阻抗控制为 单端50欧姆 2 差分信号线长度差小于5 mils 3 所有信号线要保证有至少一个连续的地作层为参考平面(更多细节请参考原文档) 4 DQS 和CLK 走线与其他信号线之间至少保持3倍线宽间距(边到边) 5 信号线走线长度规则(更多细节请参考原文档) 如下图所示,文档 “HW Design Checking List for i.Mx6”中的“MX6 DRAM Bus Length Check”页提供给设计者一个自行检查的工具。输入当前设计的线长参数到粉色框内的格中后,如果违反规则同一列内最底下的格子会变成红色。

飞思卡尔智能车简介

智能车制作 F R E E S C A L E 学院:信息工程学院 班级:电气工程及其自动化132 学号:6101113078 姓名:李瑞欣 目录: 1. 整体概述 2.单片机介绍 3.C语言 4.智能车队的三个组 5.我对这门课的建议

一、整体概述 智能车的制作过程包括理论设计、实际制作、整车调试、现场比赛等环节,要求学生组成团队,协同工作。内容涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科多专业。 下面是一个智能车的模块分布: 总的来说智能车有六大模块:信号输入模块、控制输出模块、数据处理模块、信息显示模块、信息发送模块、异常处理模块。 1、信号输入模块: 智能车通过传感器获知赛道上的路况信息(直道,弯道,山坡,障碍物等),同时也通过传感器获取智能车自身的信息(车速,电磁电量等)。这些数据构成了智能车软件系统(大脑)的信息来源,软件系统依靠这些数据,改变智能车的运行状态,保证其在最短的时间内按照规定跑完整个赛道。 2、控制输出模块: 智能车在赛道上依靠转向机构(舵机)和动力机构(电机)来控制运行状态,这也是智能车最主要的模块,这个模块的好坏直接决定了你的比赛成绩。 电机和舵机都是通过PWM控制的,因此我们的软件系统需要根据已有的信息进行分析计算得到一个合适的输出数据(占空比)来控制电机和舵机。 3数据处理模块: 主要是对电感、编码器、干簧管的数据处理。信号输入模块得到的数据非常原始,有杂波。基本上是不能直接用来计算的。因此需要有信号处理模块对采集的数据进行处理,得到可用的数据。 4信息显示模块: 智能车调试过程中,用显示器来显示智能车的部分信息,判断智能车是否正常运行。正式比赛过程中可关闭。主流的显示器有:Nokia 5110 ,OLED模块等,需要进行驱动移植。

相关主题
文本预览
相关文档 最新文档