求高手写飞思卡尔智能车程序(可追加一千分)

求高手写飞思卡尔智能车程序(可追加一千分),第1张

其实只有程序也没有用,要将程序和硬件接合起来才行。比如硬件里用PT0,程序里用PT1,当然不会达到预期目的。下在是上海交通大学的程序。

Mainc

#include <hidefh> / common defines and macros /

#include <mc9s12db128h> / derivative information /

#pragma LINK_INFO DERIVATIVE "mc9s12db128b"

#include "defineh"

#include "inith"

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

SCI0DRL=transmit_data;

}

/

/

/----------------------------------------------------------------------------\

abs_sub

\----------------------------------------------------------------------------/

unsigned char abs_sub(unsigned char num1, unsigned char num2)

{ unsigned char difference;

if(num1>=num2){

difference=num1-num2;

}else{

difference=num2-num1;

}

return difference;

}

void pwm_set(unsigned int dutycycle)

{

PWMDTY1=dutycycle&0x00FF;

PWMDTY0=dutycycle>>8;

}

void get_black_wire(void) // used to extract black wire

{ unsigned char i;

for(row=0;row<ROW_MAX;row++){

for(line=LINE_MIN;line<LINE_MAX-3;line++){

if(image_data[row][line]>image_data[row][line+3]+VALVE){

for(i=3;i<10;i++){

if(image_data[row][line+i]+VALVE<image_data[row][line+i+3]){

black_x[row]=line+i/2+2;

i=10;

}

}

line=LINE_MAX;

} else{

//black_x[row]=(black_x[row]/45)78;

}

}

}

}

/----------------------------------------------------------------------------\

speed_control

\----------------------------------------------------------------------------/

void speed_control(void)

{

unsigned int sum,average;

sum=0;

for(row=0;row<FIRST_FIVE;row++){

sum=sum+black_x[row];

}

average=sum/FIRST_FIVE;

curve=0;

for(row=0;row<FIRST_FIVE;row++)

{

curve=curve+abs_sub(black_x[row],average);

if(curve>CURVE_MAX){

curve_flag=0;

speed=low_speed;}

else{

curve_flag=1;

speed=hign_speed;

}

}

}

/----------------------------------------------------------------------------\

steer_control

\----------------------------------------------------------------------------/

void steer_control(void)

{ unsigned int dutycycle;

unsigned char video_center;

unsigned int coefficient;

int E,U; //current

static int e=0;

video_center=(LINE_MIN+LINE_MAX)/2;

stand=abs_sub(black_x[1]+ black_x[9],2black_x[5]);

E=video_center-black_x[8];

coefficient=30+1FuzzyLogic(stand);

U=coefficientE;

dutycycle=Bounds(center+U);

pwm_set(dutycycle);

}

// make sure it is within bounds

short Bounds(short data){

if(data>right_limit){

data = right_limit;

}

if(data<left_limit){

data = left_limit;

}

return data;

}

Void speed_get(void)

{

Unsigned char temp;

Counter++;

Temp=PACN1;

cur_speed=temp-pulse[counter-1];

pulse[counter-1]=temp;

if(counter==5)

{

counter=0;

}

}

Void set_speed(unsigned char desired_speed)

{

If(desired_speed<cur_speed)

{

PWMDTY2=low_speed;

}

Else

{

PWMDTY2=high_speed;

}

}

/

\

Main

\

/

void main(void) {

// main functiion

init_PORT() ;

// port initialization

init_PLL() ;

// setting of the PLL

init_ECT();

init_PWM() ;

// PWM INITIALIZATION

init_SPEED() ;

init_SCI() ;

for(;;) {

if(field_signal==0){ // even->odd

while(field_signal==0);

row_count=0;

row_image=0;

EnableInterrupts;

while(row_count<ROW_END){

get_black_wire();

speed_control();

steer_control();

}

DisableInterrupts;

}

else{ // odd->even

while(field_signal==1);

row_count=0;

row_image=0;

EnableInterrupts;

while(row_count<ROW_END){

get_black_wire();

speed_control();

steer_control();

}

DisableInterrupts;

}

/ transmit_sci('x');

for(row=0;row<ROW_MAX;row++){

transmit_sci(black_x[row]);

}

transmit_sci(curve);

/

}

}

interrupt 6 void IRQ_ISR()

{

row_count++;

if((row_count>ROW_START)&&(row_count%INTERVAL==0)&&(row_image<ROW_MAX))

{

init_AD();

for(line_sample=0;line_sample<LINE_MAX;line_sample++){

while(!ATD0STAT1_CCF0); // WAIT FOR TRANSFORM TO END

sample_data[line_sample]=signal_in; // A/D transfer

}

ATD0CTL2=0x00;

row_image++;

}

if((row_count>ROW_START)&&(row_count%INTERVAL==2)&&(row_image<ROW_MAX+

1)){

for(line_temp=0;line_temp<LINE_MAX;line_temp++){

image_data[row_image-1][line_temp]=sample_data[line_temp];

}

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// THE END

//

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Defineh // all macros are define in this header file

/----------------------------------------------------------------------------\

macro need to be used in video sample

\----------------------------------------------------------------------------/

////////////////////////////

#define signal_in ATD0DR0L // signal from video: right aligned mode,

// only use low 8-bit in ATD Conversion Result

Registers

#define field_signal PTT_PTT2 // field signal is sent into PortT_bit2

#define LINE_MIN 12 // first effective pint in each row

#define LINE_MAX 78 // number of points sampled in each row

#define ROW_MAX 10 // number of rows needed to be sampled in each

picture

#define ROW_START 50 // begin to sample from line start

#define ROW_END 300 // end flag of sampling

#define INTERVAL 20 // interval between effective rows

#define VALVE 24 // valve to decide black track or white track

#define FIRST_FIVE 5

/----------------------------------------------------------------------------\

舵机控制变量

\----------------------------------------------------------------------------/

#define left_limit 7400 //

#define center 6400 //

#define right_limit 5400 //

//#define coefficient 30 // (LEFT-RIGHT)/(LINE_MAX-LINE_MIN)

/----------------------------------------------------------------------------\

速度控制变量

\----------------------------------------------------------------------------/

#define curve_flag PORTE_BIT2 // indicate straight line or not

#define speed PWMDTY2 // speed of the car

#define CURVE_MAX 24 // valve to decide straight track or not

#define hign_speed 120 // speed used on straight track

#define low_speed 100 // speed used on the turn

/----------------------------------------------------------------------------\

define jump wire; code switch; Led

\----------------------------------------------------------------------------/

#define JP4_1 PTT_PTT7 // JP4

#define JP4_2 PTT_PTT6

#define JP4_3 PTT_PTT5

#define JP4_4 PTT_PTT4

#define JP4_5 PTP_PTP4

#define JP4_6 PTP_PTP5

#define JP4_7 PTP_PTP6

// define code switch

#define RP1_1 PTM_PTM0

#define RP1_2 PTM_PTM1

#define RP1_3 PTM_PTM2

#define RP1_4 PTM_PTM3

#define RP1_5 PTM_PTM4

#define RP1_6 PTM_PTM5

#define RP1_7 PORTAD0_PTAD4

#define RP1_8 PORTAD0_PTAD3

// define Led

#define Led1 PORTA_BIT4

#define Led2 PORTA_BIT5

#define Led3 PORTA_BIT6

#define Led4 PORTA_BIT7

Initc // include initial function in this file

#include <hidefh> / common defines and macros /

#include <mc9s12db128h> / derivative information /

#include "defineh" / all macro included /

#include "inith" / all init function included /

#pragma LINK_INFO DERIVATIVE "mc9s12db128b"

/----------------------------------------------------------------------------\

init_PLL

\----------------------------------------------------------------------------/

void init_PLL(void)

// setting of the PLL

{

REFDV=3;

SYNR=7; // bus period=16Mhz(SYNR+1)/(REFDV+1)

while(0==CRGFLG_LOCK); // wait for VCO to stablize

CLKSEL=0x80;

// open PLL

}

Void init_ECT(void);

{

TIOS_IOS3=0; // set PT3 as input capture

TCTL4=0b11000000; // set pt3 as any edge triggered

ICPAR_PA1EN=1; // PA1 enabled

}

/----------------------------------------------------------------------------\

init_PORT

\----------------------------------------------------------------------------/

void init_PORT(void) // port initialization

{

DDRT_DDRT2=0;

// Port M1 function as even-odd field signal

input

DDRJ_DDRJ6=1;

// Port J6 enable 33886 0 enable

// Led port

DDRA_BIT4 =1;

DDRA_BIT5 =1;

DDRA_BIT6 =1;

DDRA_BIT7 =1;

INTCR_IRQE =1; // IRQ Select Edge Sensitive Only

INTCR_IRQEN=1; // External IRQ Enable

//输出指示 JP4_1 PTT_PTT0

DDRT_DDRT7=1;

DDRT_DDRT6=1;

DDRT_DDRT5=1;

DDRT_DDRT4=1;

DDRP_DDRP4=1; //PTP_PTP0

DDRP_DDRP5=1;

DDRP_DDRP7=1;

}

/----------------------------------------------------------------------------\

init_AD

\----------------------------------------------------------------------------/

void init_AD(void)

// initialize AD

{

ATD0CTL2=0xC0;

// open AD, quick clear, no wait mode, inhibit outer awake, inhibit interrupt

ATD0CTL3=0x08;

// one transform in one sequence, No FIFO, contine to transform under freeze mode

ATD0CTL4=0x81;

// 8-bit precision, two clocks, ATDClock=[BusClock05]/[PRS+1] ; PRS=1, divider=4 ;

BusClock=8MHZ

ATD0CTL5=0xA0; // right-algned unsigned,single channel,

channel 0

ATD0DIEN=0x00; // inhibit digital input

}

/----------------------------------------------------------------------------\

init_PWM

\----------------------------------------------------------------------------/

void init_PWM(void)

// PWM initialize

{

PTJ_PTJ6 = 0 ; // "0" enable 33886 motor, "1" disable it

PWME = 0x00 ; // PWW is disabled

PWMCTL_CON01 = 1 ; // combine PWM0,1

PWMPRCLK = 0x33 ; // A=B=32M/8=4M

PWMSCLA = 100 ; // SA=A/2/100=20k

PWMSCLB = 1 ; // SB=B/2/1 =2000k

PWMCLK = 0b00011100; // PWM0,1-A; PWM2,3-SB; PWM4-SA

PWMPOL = 0xff ; // Duty=High Time

PWMCAE = 0x00 ; // left-aligned

PWMPER0 = 0x4e ;

PWMPER1 = 0x20 ;

// 20000 = 0x4e20; Frequency=A/20000=200Hz

PWMDTY0 = 0x18 ;

PWMDTY1 = 0x6a ; // initialize PWM

PWME_PWME1 = 1 ; // enable steer

PWMDTY2 = 20 ; // Duty cycle

PWMPER2 = 200 ; // Frequency=SB/200=10K

PWME_PWME2 = 1 ; // enable motor

}

/----------------------------------------------------------------------------\

init_SPEED

\----------------------------------------------------------------------------/

void init_SPEED(void) {

DDRM_DDRM0 =0 ; //code switch 1 on RP1

DDRM_DDRM1 =0 ; //code switch 1 on RP1

DDRM_DDRM2 =0 ; //code switch 1 on RP1

DDRM_DDRM3 =0 ; //code switch 1 on RP1

DDRM_DDRM4 =0 ; //code switch 1 on RP1

DDRM_DDRM5 =0 ; //code switch 1 on RP1

ATD0DIEN_IEN4 = 1; //code switch 1 on RP1,Enable Digital Input PAD4

ATD0DIEN_IEN3 = 1; //code switch 1 on RP1,Enable Digital Input PAD3

if(RP1_1==1) {

speed= hign_speed +2(RP1_210+RP1_35+RP1_42+RP1_52+RP1_6+RP1_7+RP1_8);

}

else{

speed= hign_speed -2(RP1_210+RP1_35+RP1_42+RP1_52+RP1_6+RP1_7+RP1_8);

}

}

/

/

/----------------------------------------------------------------------------\

init_SCI

\----------------------------------------------------------------------------/

void init_SCI(void) // initialize SCI

{

SCI0BD = 104 ; // bode rate=32M/(16SCI0BD)=19200

SCI0CR1=0x00 ; //

SCI0CR2=0b00001100 ;

}

Inith

void init_PLL(void);

void init_AD(void);

void init_PWM(void);

void init_SPEED(void);

void init_SCI(void);

void init_PORT(void);

Void init_ECT(void);

Fuzzyasm // S12 fuzzy logic code

RAM: section

; Fuzzy Membership sets

; input membership variables

absentry fuzvar

fuzvar: dsb 5 ; inputs

Z: equ 0 ; indicate of straight line

VS: equ 1 ; turn slightly

S: equ 2 ; turn a little

BB: equ 3 ; a big turn

VB: equ 4 ; a very big turn

;output membership variables

absentry fuzout

fuzout: dsb 4 ; outputs

remain: equ 5 ; no change on kp

little: equ 6 ; little change on kp

big: equ 7 ; big change on Kp

very_big: equ 8 ; very big change on kp

EEPROM: section

; fuzzification

s_tab: dcb 0,35,0,8 ; indicate of straight line

dcb 0,69,8,8 ; turn slightly

dcb 35,104,8,8 ; turn a little

dcb 69,138,8,8 ; a big turn

dcb 104,255,8,0 ; a very big turn

rules: ;

constructing of rule

dcb Z, $FE,remain,$FE

dcb VS, $FE,little,$FE

dcb S, $FE,big,$FE

dcb BB, $FE,big,$FE

dcb VB, $FE,very_big,$FE

dcb $FF ;end of the rule

addsingleton:

dcb 0,1,2,3 ; setting of the weight

absentry FuzzyLogic

FuzzyLogic:

pshx

ldx #s_tab

ldy #fuzvar

mem ; number of mem indicates the number of input

mem

mem

mem

mem

ldab #4 ; number of output fuzzy membership sets

cloop:

clr 1,y+ ; clear output fuzzy variables

dbne b,cloop

ldx #rules

ldy #fuzvar

ldaa #$FF

rev

ldy #fuzout

ldx #addsingleton

ldab #4

wav

ediv ;

tfr y,d ; return dpower

pulx

rts

我这只有舵机,摄像头,和主程序,但是只是框架,要等调试。可以参考哈

#ifndef _WATCH_H_ //头文件保护

#define _WATCH_H_

#ifndef ULONG

#define ULONG unsigned long

#define UCHAR unsigned char

#define UINT unsigned int

#endif

#define ROAD_MAX 10

////////////////代设值

#define MP0 //捕捉象素引脚

#define HREF //捕捉行中断引脚

//////////////////

static unsigned char Colors[10][48]; //象素数组

static unsigned char JudgeMax; //最大象素

static unsigned char JudgeMin; //最小象素

unsigned char Over; //中断函数处理完成

//使用数组后要清零

struct ROADS

{

unsigned char LeftRight; //1 left, 0 right 2 表示没检测到黑线 4表示起始线

unsigned int road; //转向率,0表示直线或则没检测到黑线

}Roads[10]; //没检测到黑线一般为前方有大于90度的弯,

//行驶一会后数组会更新,不会因此丢掉跑道

unsigned long RoadLength; //mm单位

void GetRoads(); //取象素

void ProcessRoads(); //取转向率

void delay(UINT); //延时函数

void ColorToRoads(UINT); //2值化与赋值

#endif //_WATCH_H_

以下为实现文件:

//watchc

#include <hidefh> / common defines and macros /

#include <MC9S12XS128h> / derivative information /

#include "watchh"

#pragma CODE_SEG NON_BANKED

#pragma TRAP_PROC

void GetRoads() //场中断服务函数

{

UINT i;

UINT Href= 0;

delay(5);

while(HREF)

{

if(Href>= 270) //点读取完毕,退出循环

break;

if((270-Href)%21!= 0 || Href< 60) //取60-270行中平均间隔的行数,共30行

{

Href++;

while(HREF); //等待此行扫描结束

while(!HREF); //等待新行开始扫描

continue;

}

delay(); //根据调式结果具体设置

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

{

Colors[((270-Href)%21)][i]= MP0; //读取引脚数据,后来会根据串口还是并口读取做相应修改

if(MP0> judgeMax) //取最大最小值

JudgeMax= MP0;

if(MP0< JudgeMin)

JudgeMin= MP0;

delay(); //具体设置

}

Href++;

while(HREF);

while(!HREF); //等待行中断结束

}

Over= 1; //中断函数处理完成

}

#pragma CODE_SEG DEFAULT

void ColorToRoads(UINT Href)

{

UINT i;

UINT temp; //用于起始线判断

UINT temp2;

UINT temp3;

UCHAR Judge; //平均厥值

UINT j= 0;

UINT m_nCount= 0;

Judge= (JudgeMax+ JydgeMin)/2;

Roads[Href]road= 0;

Roads[Href]LeftRight= 0;

for(i= 0; i<48; i+= 3)

{

if(Colors[i]<= Judge||

Colors[i+ 1]<= Judge||

Colors[i+ 2]<= Judge)

{

Roads[Href]road&= (0x8000>> (UCHAR)j); //相应位赋值为1

m_nCount++;

}

j++;

}

if(Roads[Href]road== 0x00)

{

Roads[Href]LeftRight= 0x02; //没有捕捉到黑线设置2

}

if(m_nCount> 1) //若黑点数大于1,从左向右数出连续的点中的中间点

{

j= 0;

i= 0;

while(!(Roads[Href]road& (0x8000>>(UCHAR)i)))

{

i++;

}

j= i;

while((Roads[Href]road& (0x8000>>(UCHAR)i))

{

i++;

if(i> 15)

break;

}

if(i< 15) //起始线判断

{

temp= i;

while(!(Roads[Href]road& (0x8000>>(UCHAR)temp)))

{

temp++;

temp2= temp;

}

if(temp< 15)

{

while((Roads[Href]road& (0x8000>>(UCHAR)temp))

{

temp++;

temp3= temp;

if(temp> 15)

break;

}

if(temp< 15)

{

while(!(Roads[Href]road& (0x8000>>(UCHAR)temp)))

{

temp++;

}

if(temp< 15)

{

Roads[Href]LeftRight= 0x04;

Roads[Href]road&= 0x8000>>(UCHAR)((temp2+ temp3)/2);

return;

}

}

}

}

Roads[Href]road&= 0x8000>>(UCHAR)((i+j)/2);

}

}

void ProcessRoads() //路径处理函数,在主函数中调用

{

int i;

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

{

ColorToRoads(i);

}

}

void delay(UINT m) //延时函数根据调试结果相应做改动

{

UINT i;

UINT j;

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

{

for(j= 0; j< 200; j++)

}

}

再下面就是主函数实现文件:

#include <hidefh> / common defines and macros /

#include <MC9S12XS128h> / derivative information /

#pragma LINK_INFO DERIVATIVE "mc9s12xs128"

#include "watchh" //摄像头

#include "TurnAroundh" //舵机

//#include "" //直流电机

//#include "" //测速模块

#ifndef TRUE

#define TRUE 1

#define FLASE 0

#endif

#define ULONG unsigned long

#define UCHAR unsigned char

#define UINT unsigned int

#define LITTLE

#define LARGE

//////////////////////全局变量

UCHAR m_nCount; //圈数计算

UCHAR m_nCount2;

////////////////////////////////函数定义

void init(); //初始化函数 待修改

UCHAR CheckRoad(UCHAR,UCHAR); //第1参数返回第几个元素开始

//第2个参数返回第几个元素结束

//0 直线, 0x11有小弯道, 0x21大弯道, 0x31终点

void CarRun(UCHAR, UCHAR, UCHAR); //小车行驶函数

#pragma CODE_SEG NON_BANKED

#pragma TRAP_PROC

void Int_TimerOverFlow(void) //32MHz TCNT 50000--200ms

{

static int m= 0;

if(m== 15) //3秒

{

m_nCount2= 0;

TSCR1_TEN= 0; //关定时器

TFLG2_TOF = 1;

}

m++;

}

#pragma CODE_SEG DEFAULT

void TimerInit()

{

TIOS= 0x00;

TSCR2_PR= 7; //默认情况下是32MHz bus clock,所以分频后主时钟为 025MHz

TSCR2_TOI= 1; //OverFlow方式

TCNT= 65535- 50000;

TSCR1_TEN= 1; //开定时器

}

////////////////////////////////

void main() //主程序

{

UCHAR ret;

UCHAR number1= 0;

UCAHR number2= 0;

init();

while(1)

{

while(over); //等待扫描完毕

over= 0;

IRQCR_IRQEN= 0; //关外部中断IRQ

ProcessRoads(); //interface of watchh

ret= CheckRoad(&number1, &number2); //检测路径

if(ret== 0x31)

break;

CarRun(number1, number2, ret);

}

PWME_PWME1= 0; //关闭PWM

while(1);

}

void init()

{

IRQCR_IRQE= 1; //下降沿触发IRQ

PE1= 1;

EnableInterrupts; //开总中断

INTCR_IRQEN= 1;

PWMInit(); //舵机初始化

Speed(MAX);

}

UCHAR CheckRoad(UCHAR number1, UCHAR number2)

{

int i;

int sub= 0;

int psub= 0;

int temp;

bool flag;

UCHAR ret;

i= 0;

m_nCount2++;

while(!Roads[i]road)

{

i++;

}

number1= i;

if(Roads[i]road>= Roads[i+ 1]road)

{

flag= TRUE;

psub= Roads[0]road- Roads[1]road;

}

else

{

flag= FALSE;

psub= Roads[1]road- Roads[0]road;

}

for(; i< 9; i++)

{

if(Roads[i]LeftRight== 0x04)

{

if(m_nCount2== 0)

{

m_nCount2= 1;

m_nCount++;

TimerInit();

}

}

if(m_nCount== 3)

{

Speed(0);

ret= 0x31;

goto _RET;

}

if(Roads[i+ 1]road== 0)

{

break;

}

if(flag)

{

sub= Roads[i]road- Roads[i+ 1]road;

}

else

{

sub= Roads[i+ 1]road- Roads[i]road;

}

sub>>= (UCHAR)i;

if(sub>= psub) //取差值

temp= sub- psub;

else

temp= psub- sub;

if(temp> LARGE) //大弯道

{

ret= 0x21;

while(Roads[i]road!= 0)

{

i++;

number2= i;

if(i> 9)

break;

}

goto _RET;

}

if(temp> LITTLE) //小弯道

{

ret= 0x11;

while(Roads[i]road!= 0)

{

i++;

number2= i;

if(i> 9)

break;

}

goto _RET;

}

number2= i;

psub= sub;

}

_RET:

return ret;

}

void CarRun(UCHAR number1, UCHAR number2, UCHAR ret)

{

int end= Roads[number2]road;

Turn(number2- number1, end- 0x100, Roads[number2]LeftRight, ret); //舵机函数

IRQCR_IRQEN= 1; //开IRQ

}

下面为舵机头文件:

//TurnAroundh

#ifndef _TURNAROUND_H_ //头文件保护

#define _TURNAROUND_H_

void Turn(unsigned char, unsigned int, unsigned char, unsigned char); //转角函数

void PWMInit(); //优先初始化

#endif

再以下为实现文件:(表内容待实验后求得)

//TurnAroundc

#include <hidefh> / common defines and macros /

#include <MC9S12XS128h> / derivative information /

#pragma LINK_INFO DERIVATIVE "mc9s12xs128"

#include "TurnAroundh"

#include "" //直流电机

#ifndef ULONG

#define ULONG unsigned long

#define UCHAR unsigned char

#define UINT unsigned int

#endif

/////////////////////////转角定义

#define RIGHT60 1083

#define RIGHT45 1000

#define RIGHT30 917

#define RIGHT15 833

#define RIGHT5 778

#define MIDDLE 750

#define LEFT5 722

#define LEFT15 667

#define LEFT30 583

#define LEFT45 500

#define LEFT60 417

/////////////////////////速度定义

#define SPEED0 //直线速度

#define SPEED5

#define SPEED15

#define SPEED30

#define SPEED45

#define SPEED60

//PWM查询表 7102

static UINT PWMTable[]=

{

//Left

LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,

LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,

LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,

LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,

LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,

LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,

LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60, LEFT60,

//Right

RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,

RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,

RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,

RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,

RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,

RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60,

RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60, RIGHT60

};

//延时查询表 66

static UNIT DelayTable[]=

{

0,0,0,0,0,0,

0,0,0,0,0,0,

0,0,0,0,0,0,

0,0,0,0,0,0,

0,0,0,0,0,0,

0,0,0,0,0,0

}

void PWMInit() //32HHz

{

PWMCTL_CON01= 1; //0, 1合为16bit

PWMCAE_CAE1= 1; //Center mode

PWMCLK_PLCK1= 0; //Clock A

PWMPRCLK_PCKA= 5; //Clock A= 32MHz/32= 1MHz

PWMPOL_PPOL1= 0; //开始为低电压

PWMPER0,1= 10000; //50Hz PWM输出

PWMDTY0,1= MIDDLE; //(10000- 750) 100%= 92。5%占空比,15ms高电压时间

PWME_PWME1= 1; //enable

}

static void delay(int ms)

{

int ii,jj;

if (ms<1) ms=1;

for(ii=0;ii<ms;ii++)

for(jj=0;jj<2770;jj++); //32MHz--1ms

}

static void SetPWM(UINT m_nPWM) //PWM设置

{

PWMDTY0,1= m_nPWM;

}

//number 9种情况,sub 7种情况,LeftRight 2中情况

//共128种情况,采用模糊控制暂时归纳为11种情况

//11种情况将填入表中提供查询,11中情况分别为:

//左右5, 15, 30, 45, 60度

//和正中间0度

static UINT GetPWM(UCHAR number, UINT sub, UCHAR LeftRight)

{

switch(sub) //通过sub算出索引值

{

case 0x8000- 0x0100:

case 0x0100- 0x0001;

case 0x0100- 0x0002;

sub= 0;

break;

case 0x4000- 0x0100:

case 0x0100- 0x0004:

sub= 1;

break;

case 0x2000- 0x0100:

case 0x0100- 0x0008:

sub= 2;

break;

case 0x1000- 0x0100:

case 0x0100- 0x0010:

sub= 3;

break;

case 0x0800- 0x0100:

case 0x0100- 0x0020:

sub= 4;

break;

case 0x0400- 0x0100:

case 0x0100- 0x0040:

sub= 5;

break;

case 0x0200- 0x0100:

case 0x0100- 0x0100:

case 0x0100- 0x0080:

sub= 6;

break;

}

return PWMTable[number+ sub 10+ LeftRight 70];

}

//通过m_nPWM来改变速度,并返回改变的值

static UINT ChangeSpeed(UINT m_nPWM)

{

UINT m_nSpeed;

switch(m_nPWM) //根据m_nPWM 调节速度

{

case LEFT60:

Speed(SPEED60);

m_nSpeed= SPEED60;

break;

case LEFT45:

Speed(SPEED45);

m_nSpeed= SPEED45;

break;

case LEFT30:

Speed(SPEED30);

m_nSpeed= SPEED30;

break;

case LEFT15:

Speed(SPEED15);

m_nSpeed= SPEED15;

break;

case LEFT5:

Speed(SPEED5);

m_nSpeed= SPEED5;

break;

case MIDDLE:

Speed(SPEED0);

m_nSpeed= SPEED0;

break;

case RIGHT60:

Speed(SPEED60);

m_nSpeed= SPEED60;

break;

case RIGHT45:

Speed(SPEED45);

m_nSpeed= SPEED45;

break;

case RIGHT30:

Speed(SPEED30);

m_nSpeed= SPEED30;

break;

case RIGHT15:

Speed(SPEED15);

m_nSpeed= SPEED15;

break;

case RIGHT5:

Speed(SPEED5);

m_nSpeed= SPEED5;

break;

}

return m_nSpeed;

}

//获得查表时的索引值

UINT GetIndex(UINT m_nSpeed)

{

if(m_nSpeed<= SPEED60)

{

m_nSpeed= 0;

}

else if(m_nSpeed<= SPEED45)

{

m_nSpeed= 1;

}

else if(m_nSpeed<= SPEED30)

{

m_nSpeed= 2;

}

else if(m_nSpeed<= SPEED15)

{

m_nSpeed= 3;

}

else if(m_nSpeed<= SPEED5)

{

m_nSpeed= 4;

}

else

{

m_nSpeed= 5;

}

return m_nSpeed;

}

//m_nSpeed2为欲设值

//m_nSpeed为当前速度

UINT GetDelay(UINT m_nSpeed, UINT m_nSpeed2)

{

m_nSpeed= GetIndex(m_nSpeed);

m_nSpeed2= GetIndex(m_nSpeed2);

return DelayTable[m_nSpeed 6+ m_nSpeed2];

}

void Turn(UCHAR number, UINT sub, UCHAR LeftRight, UCHAR ret)//ret not be used now

{

UINT m_nPWM;

UINT m_nSpeed;

UINT m_nSpeed2;

UINT m_nDelay; //延时参数

m_nPWM= GetPWM(number, sub, LeftRight);

m_nSpeed= GetSpeed() //测速模块

m_nSpeed2= ChangeSpeed(m_nPWM);

if(m_nSpeed2> m_nSpeed)

m_nSpeed= m_nSpeed2- m_nSpeed;

else

m_nSpeed= m_nSpeed- m_nSpeed2;

SetPWM(m_nPWM); //转角

m_nDelay= GetDelay(m_nSpeed, m_nSpeed2);

delay(m_nDelay); //根据速度和角度延时

SetPWM(MIDDLE); //舵机摆正

}

最后说哈,程序只差调试就可以,筐架就是这。我是湖北赛区的,7月就要比赛了,他们车还没做好啊。

以上就是关于求高手写飞思卡尔智能车程序(可追加一千分)全部的内容,包括:求高手写飞思卡尔智能车程序(可追加一千分)、飞思卡尔程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9863565.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存