智能车制作
标题:
光电组的源代码--分享
[打印本页]
作者:
liuyong99
时间:
2010-1-21 16:49
标题:
光电组的源代码--分享
本帖最后由 chenrunshe_007 于 2010-1-23 14:07 编辑
#include <hidef.h>
#include <mc9s12dg128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
//=========================public variable=====================
//-----------------------turning variable------------------
unsigned char sam_g[15]; //道路检测值
unsigned int angle_data; //舵机转角
int car_positn; //赛车当前位置参数
int pre_positn;
unsigned int black_sensor_number; //检测到黑线的传感器个数
int positn_temp[10];
unsigned int t=0;
//---------------------speed variable---------------------
unsigned char dir_flag; //方向标志,为1表示检测到有效路径,可以给驱动力
unsigned char brake_flag; //刹车标志位 判断当前是否需要刹车
unsigned int car_driver; //驱动力控制
unsigned int pulse_count; //速度检测 统计脉冲个数
unsigned int ideal_speed; //车的理想速度
unsigned int times; //丢失黑线的次数
int speed_error; //理想与实际速度偏差值
int pre_error; //速度PID 前一次的速度误差值 ideal_speed- pulse_count
int pre_d_error; //速度PID 前一次的速度误差之差 d_error-pre_d_error
int pk; //速度PID值
//---------------------start_line variable-------------------
unsigned char start_line_acc; //统计检测起跑线次数
unsigned char finish_flag; //起跑线标志位,为1表示检测到起跑线3次
//----------------------dis_play variable--------------------
unsigned int start_flag,start_count;
//---------------------table-------------------------
unsigned char speed_table11[13]={270,260,250,240,200,180,180,180,170,140,140,100,90}; //15.0s
unsigned char speed_table21[13]= {25,24,23,20,19,17,17,17,15,12,11,10,9}; //15.0s
unsigned char speed_table12[13]= {29,28,27,26,25,20,20,20,19,17,15,10,9}; //15.0s
unsigned char speed_table22[13]= {27,26,25,24,20,18,18,18,17,14,14,10,9}; //15.0s
unsigned int circle; //控制赛车跑几圈停车
#define kp 2000//2000
#define ki 5//5
#define kd 10//10
#define Angle_Center 4344 //舵机中心位置
#define lose_limit 30000 //丢失黑线后 滑翔时间
void data_init(void);
void crg_init(void); // 锁相环初始化
void pwm_init(void); // PWM信号初始化
void ect_init(void); // ECT初始化
void sam_position(void); //读结果
void check_start(void); //起跑线检测函数
void car_position(void); //计算car_positn
void angle(void); //计算转角
void speed(void); //计算速度
void driver(void); //驱动
void pre_start(void);
void delay(void);
void found_start(void);
void stop(void);
void pid(void);
unsigned int absolute(int);
//========================main loop============================
void main(void)
{
data_init(); //设置基本数据
crg_init(); //锁向环初始化
ect_init(); //ECT
pwm_init(); //初始化PWM
pre_start();
EnableInterrupts;
for(;;)
{
sam_position(); //读采样值
check_start(); //检测起跑线
car_position(); //计算car_positn
angle(); //计算转角
speed(); //计算速度
driver(); //拐弯 驱动
}
}
//--------------------data_init--------------------
void data_init(void)
{
start_line_acc=0;
finish_flag=0;
DDRA=0X00;
DDRB=0X00;
times=0;
}
//-------------------pre_start------------------
void pre_start(void)
{
unsigned int i;
PWMDTY01=Angle_Center;
PWMDTY67=0;
for(i=0;i<10;i++) delay();
PWMDTY23=0;
}
//----------------------crg_init-------------------
void crg_init(void)
{
SYNR=0x02;
REFDV=0x01;
while((CRGFLG & 0x08)==0 );
CLKSEL =0x80;
}
//--------------------pwm_init------------------------
void pwm_init(void)
{
PWMCTL=0xB0; // 设置通道76、32、10级连
PWME=0x00; // 通道禁止输出;
PWMPRCLK=0x12;//预分频:A_CLK=busclk/2^2=6M B_CLK=BUSCLK/2^1=12M
PWMSCLA=0x01; //SA_CLK=A_CLK/(2*1)==3MHz
PWMSCLB=0X01; //SB_CLK=B_CLK/(2*1)==6MHz
PWMPOL=0x8A; //极性选择起始为高电平;
PWMCLK=0x8A; //PWM01 选择 SA_CLK PWM23 67选择SB_CLK
PWMCNT0=0x00;
PWMCNT1=0x00;
PWMCNT2=0x00;
PWMCNT3=0x00;
PWMCNT6=0x00;
PWMCNT7=0x00;
PWMPER01=60000; // 周期==(1/3M)*(60000)=20ms
PWMPER23=10000; // F=6M/10000==600Hz
PWMPER67=10000; // F=6M/10000==600Hz
PWMCAE=0x00; //左对齐方式
PWME=0x82; // 通道1,7输出使能;
}
//-----------------------ect_init-------------------------
void ect_init(void)
{
TCTL4=0x01; // Set the rising endge for PT0.
PACN10=0x0000;
PBCTL=0x40; //pt0 and pt1 级联成16位计数器
MCCNT=60000; //60000*24M/16=40ms
MCCTL=0xC7;
TSCR1=0x10;
}
void sam_position(void)
{
sam_g[1]= PORTA_PA4;
sam_g[2]= PORTA_PA3;
sam_g[3]= PORTA_PA2;
sam_g[4]= PORTA_PA1;
sam_g[5]= PORTA_PA0;
sam_g[6]= PORTB_PB0;
sam_g[7]= PORTB_PB1;
sam_g[8]= PORTB_PB2;
sam_g[9]= PORTB_PB3;
sam_g[10]= PORTB_PB4;
sam_g[11]= PORTB_PB5;
sam_g[12]= PORTB_PB6;
sam_g[13]= PORTB_PB7;
}
//----------------------check_start---------------------
void check_start(void)
{
unsigned char i,j=0;
start_flag=0;
for(i=1;i<14;i++)
if(sam_g^sam_g[i+1])
j++;
if(j>=4)
{
if(sam_g[5] &&((!sam_g[4])&&(!sam_g[6])) &&((!sam_g[3])&&(!sam_g[7]))&&(sam_g[1]&&sam_g[10])
) start_flag=1;
else if(sam_g[5]&&sam_g[6] &&((!sam_g[4])&&(!sam_g[7]))&&((!sam_g[3])&&(!sam_g[8])) &&(sam_g[1]&&sam_g[10])
) start_flag=1;
else if( sam_g[6] &&((!sam_g[5])&&(!sam_g[7])) &&((!sam_g[4])&&(!sam_g[8])) &&(sam_g[1]&&sam_g[11])
) start_flag=1;
else if( sam_g[6]&&sam_g[7] &&((!sam_g[5])&&(!sam_g[8])) &&((!sam_g[4])&&(!sam_g[9])) &&(sam_g[2]&&sam_g[11])
) start_flag=1;
else if( sam_g[7] &&((!sam_g[6])&&(!sam_g[8])) &&((!sam_g[5])&&(!sam_g[9])) &&(sam_g[2]&&sam_g[12])
) start_flag=1;
else if( sam_g[7]&&sam_g[8] &&((!sam_g[6])&&(!sam_g[9])) &&((!sam_g[5])&&(!sam_g[10])) &&(sam_g[3]&&sam_g[12])
) start_flag=1;
else if( sam_g[8] &&((!sam_g[7])&&(!sam_g[9])) &&((!sam_g[6])&&(!sam_g[10])) &&(sam_g[3]&&sam_g[13])
) start_flag=1;
else if( sam_g[8]&&sam_g[9]&&((!sam_g[7])&&(!sam_g[10])) &&((!sam_g[6])&&(!sam_g[11])) &&(sam_g[4]&&sam_g[13])
) start_flag=1;
else if( sam_g[9] &&((!sam_g[8])&&(!sam_g[10])) &&((!sam_g[7])&&(!sam_g[11])) &&(sam_g[4]&&sam_g[13])
) start_flag=1;
}
if(start_flag)
art_count++;
else
art_count=0;
if(start_count==2)
{
found_start();
start_count=0;
}
if(start_line_acc==2)
{
finish_flag=1;
}
}
//--------------------------car_position------------------------
复制代码
作者:
chenrunshe_007
时间:
2010-1-23 14:06
回复
1#
liuyong99
你用代码编辑工具写看起来就爽多了。
作者:
Cedar
时间:
2010-1-31 08:59
谢谢楼主了
作者:
donghong000
时间:
2010-2-17 20:45
谢谢lz
作者:
xiaoxiao1231
时间:
2010-2-26 10:45
我是新手,弱弱的问楼主一下,这个代码是直接烧进车里就能用的吗?和外部PCB电路设计有关系吗?
作者:
zhoulxm
时间:
2010-2-27 11:47
谢谢
作者:
abfgrab
时间:
2010-2-28 16:13
谢谢
作者:
abfgrab
时间:
2010-2-28 16:13
谢谢
作者:
abfgrab
时间:
2010-2-28 16:14
得到
作者:
abfgrab
时间:
2010-2-28 16:14
烦恼光鲜
作者:
abfgrab
时间:
2010-2-28 16:14
奉献
作者:
cooltom
时间:
2010-3-2 17:38
多谢了
作者:
一剑卡卡
时间:
2010-3-2 19:32
谢谢哈。
作者:
studywhr
时间:
2010-3-2 21:34
向楼主学习。
作者:
BPKN
时间:
2010-3-3 14:42
谢谢 分享
作者:
kmicheal
时间:
2010-3-3 15:20
不错
作者:
wht
时间:
2010-3-3 17:38
先收藏了,多多看代码
作者:
zhoulxm
时间:
2010-3-4 22:19
好好
作者:
ymp
时间:
2010-3-5 00:17
呵呵……除了起跑线检测外就没有其他的了
作者:
alex87
时间:
2010-3-5 10:53
谢谢楼主啦!
作者:
IORI_CC
时间:
2010-3-6 00:39
注释很清楚!谢谢楼主!
作者:
jiao19880804
时间:
2010-3-8 22:28
good
作者:
孟德
时间:
2010-3-9 10:56
谢谢了
作者:
新手大兵
时间:
2010-3-9 12:19
谢谢
作者:
kukuboy2007
时间:
2010-3-9 13:45
好
作者:
qiujunnb
时间:
2010-3-9 14:51
写写
作者:
Brucedeng
时间:
2010-3-9 22:45
你这是干嘛呀
作者:
qianjincheng
时间:
2010-3-10 17:44
谢谢
作者:
刚刚
时间:
2010-3-11 08:43
十分感谢
作者:
ws447889672
时间:
2010-3-11 14:15
谢谢楼主。。
作者:
yayaere
时间:
2010-3-17 10:55
烦恼光鲜
作者:
huangyr
时间:
2010-3-18 20:03
3q
作者:
lichuanming1986
时间:
2010-4-4 15:53
xiexie a
作者:
木兰
时间:
2010-4-4 16:12
作者:
blueskyice
时间:
2010-4-4 23:34
谢谢
作者:
lawlight
时间:
2010-4-5 18:10
谢谢分享,,,
作者:
he251125
时间:
2010-4-5 20:23
呵呵 参考
作者:
alexzhan
时间:
2010-4-5 20:26
感谢楼追
作者:
alexzhan
时间:
2010-4-5 20:27
感谢楼主了就
作者:
alexzhan
时间:
2010-4-5 20:27
感谢楼主了就
作者:
alexzhan
时间:
2010-4-5 20:27
感谢楼主了就
作者:
jession4
时间:
2010-4-5 22:59
感谢楼主
作者:
Zwelson
时间:
2010-4-6 09:09
回复
1#
liuyong99
帮助很大
作者:
mznch
时间:
2010-4-12 10:22
谢谢楼主~
作者:
xiaobo
时间:
2010-4-13 15:51
好
作者:
吉人天相
时间:
2010-4-18 13:57
谢谢
作者:
zczc003
时间:
2010-4-19 14:24
谢谢
作者:
望月2010
时间:
2010-4-20 17:01
谢谢!
作者:
wd_sea
时间:
2010-4-22 16:46
就想找这个,谢谢楼主了
作者:
wuxu
时间:
2010-4-24 20:39
很谢谢的了。
作者:
wuxu
时间:
2010-4-24 20:39
很谢谢的了。
作者:
594122469
时间:
2010-4-30 18:38
谢谢
作者:
fengnan
时间:
2010-4-30 19:14
谢谢 参考一下思路
作者:
forever8tf
时间:
2010-5-2 01:12
传感器的信号是用比较器输出的,没有用到AD模块。
作者:
shirley_06
时间:
2010-5-4 20:47
xiexie
作者:
shirley_06
时间:
2010-5-4 20:47
xiexie
作者:
断了的弦
时间:
2010-5-6 20:49
谢谢
作者:
feisikaer_2010
时间:
2010-5-7 00:26
e ......
作者:
dragon3040
时间:
2010-5-19 19:15
3q
作者:
dragon3040
时间:
2010-5-24 20:20
楼主可以把完整的代码发过来吗
作者:
gtrs86
时间:
2010-5-28 15:06
晕了 楼主后边的部分再发上来啊 怎么到起始检测就没了?????等待楼主把后边的发上来
作者:
motor
时间:
2010-5-28 17:32
谢谢
作者:
iczibm
时间:
2010-5-30 19:42
核心的也没有弄出来。。。
作者:
锦芫
时间:
2010-6-11 20:47
学习
作者:
aa8342771
时间:
2010-6-24 21:25
谢谢了
作者:
fzxy002763
时间:
2010-6-25 16:52
dddddd
作者:
gtrs86
时间:
2010-6-26 20:46
程序不全啊 希望楼主把全部的给我看看
672378724@QQ.COM
作者:
慧子
时间:
2010-6-28 10:16
好
作者:
慧子
时间:
2010-6-28 10:16
好
作者:
慧子
时间:
2010-6-28 10:16
好
作者:
小惠19999
时间:
2010-7-2 01:09
谢谢楼主!!!!!!!1
作者:
Bloodfeather
时间:
2010-7-5 09:26
代码不全~~~~~~
作者:
a19900226
时间:
2010-7-6 10:53
谢谢
作者:
安杰
时间:
2010-7-6 15:49
谢啦!楼主,顶
作者:
山99下
时间:
2010-7-14 22:28
谢谢楼主!!……
作者:
xuguopan
时间:
2010-8-12 22:56
多谢楼主分享,
作者:
424602394tclrw
时间:
2010-9-30 23:27
没PID部分
作者:
happydpc
时间:
2010-10-1 17:37
谢谢....这个只是框架吧
作者:
SDM
时间:
2010-10-12 23:13
顶
作者:
穿越连城
时间:
2010-10-13 16:06
正缺这东西,救急啊
作者:
幸福石头
时间:
2010-10-17 10:44
谢谢楼主
作者:
bingoiscoming
时间:
2010-10-24 14:33
楼主好人 啊
作者:
xiaoneilf
时间:
2010-11-2 01:09
#include <hidef.h>
#include <mc9s12dg128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
//=========================public variable=====================
//-----------------------turning variable------------------
unsigned char sam_g[15]; //道路检测值
unsigned int angle_data; //舵机转角
int car_positn; //赛车当前位置参数
int pre_positn;
unsigned int black_sensor_number; //检测到黑线的传感器个数
int positn_temp[10];
unsigned int t=0;
//---------------------speed variable---------------------
unsigned char dir_flag; //方向标志,为1表示检测到有效路径,可以给驱动力
unsigned char brake_flag; //刹车标志位 判断当前是否需要刹车
unsigned int car_driver; //驱动力控制
unsigned int pulse_count; //速度检测 统计脉冲个数
unsigned int ideal_speed; //车的理想速度
unsigned int times; //丢失黑线的次数
int speed_error; //理想与实际速度偏差值
int pre_error; //速度PID 前一次的速度误差值 ideal_speed- pulse_count
int pre_d_error; //速度PID 前一次的速度误差之差 d_error-pre_d_error
int pk; //速度PID值
//---------------------start_line variable-------------------
unsigned char start_line_acc; //统计检测起跑线次数
unsigned char finish_flag; //起跑线标志位,为1表示检测到起跑线3次
//----------------------dis_play variable--------------------
unsigned int start_flag,start_count;
//---------------------table-------------------------
unsigned char speed_table11[13]={270,260,250,240,200,180,180,180,170,140,140,100,90}; //15.0s
unsigned char speed_table21[13]= {25,24,23,20,19,17,17,17,15,12,11,10,9}; //15.0s
unsigned char speed_table12[13]= {29,28,27,26,25,20,20,20,19,17,15,10,9}; //15.0s
unsigned char speed_table22[13]= {27,26,25,24,20,18,18,18,17,14,14,10,9}; //15.0s
unsigned int circle; //控制赛车跑几圈停车
#define kp 2000//2000
#define ki 5//5
#define kd 10//10
#define Angle_Center 4344 //舵机中心位置
#define lose_limit 30000 //丢失黑线后 滑翔时间
void data_init(void);
void crg_init(void); // 锁相环初始化
void pwm_init(void); // PWM信号初始化
void ect_init(void); // ECT初始化
void sam_position(void); //读结果
void check_start(void); //起跑线检测函数
void car_position(void); //计算car_positn
void angle(void); //计算转角
void speed(void); //计算速度
void driver(void); //驱动
void pre_start(void);
void delay(void);
void found_start(void);
void stop(void);
void pid(void);
unsigned int absolute(int);
//========================main loop============================
void main(void)
{
data_init(); //设置基本数据
crg_init(); //锁向环初始化
ect_init(); //ECT
pwm_init(); //初始化PWM
pre_start();
EnableInterrupts;
for(;;)
{
sam_position(); //读采样值
check_start(); //检测起跑线
car_position(); //计算car_positn
angle(); //计算转角
speed(); //计算速度
driver(); //拐弯 驱动
}
}
//--------------------data_init--------------------
void data_init(void)
{
start_line_acc=0;
finish_flag=0;
DDRA=0X00;
DDRB=0X00;
times=0;
}
//-------------------pre_start------------------
void pre_start(void)
{
unsigned int i;
PWMDTY01=Angle_Center;
PWMDTY67=0;
for(i=0;i<10;i++) delay();
PWMDTY23=0;
}
//----------------------crg_init-------------------
void crg_init(void)
{
SYNR=0x02;
REFDV=0x01;
while((CRGFLG & 0x08)==0 );
CLKSEL =0x80;
}
//--------------------pwm_init------------------------
void pwm_init(void)
{
PWMCTL=0xB0; // 设置通道76、32、10级连
PWME=0x00; // 通道禁止输出;
PWMPRCLK=0x12;//预分频:A_CLK=busclk/2^2=6M B_CLK=BUSCLK/2^1=12M
PWMSCLA=0x01; //SA_CLK=A_CLK/(2*1)==3MHz
PWMSCLB=0X01; //SB_CLK=B_CLK/(2*1)==6MHz
PWMPOL=0x8A; //极性选择起始为高电平;
PWMCLK=0x8A; //PWM01 选择 SA_CLK PWM23 67选择SB_CLK
PWMCNT0=0x00;
PWMCNT1=0x00;
PWMCNT2=0x00;
PWMCNT3=0x00;
PWMCNT6=0x00;
PWMCNT7=0x00;
PWMPER01=60000; // 周期==(1/3M)*(60000)=20ms
PWMPER23=10000; // F=6M/10000==600Hz
PWMPER67=10000; // F=6M/10000==600Hz
PWMCAE=0x00; //左对齐方式
PWME=0x82; // 通道1,7输出使能;
}
//-----------------------ect_init-------------------------
void ect_init(void)
{
TCTL4=0x01; // Set the rising endge for PT0.
PACN10=0x0000;
PBCTL=0x40; //pt0 and pt1 级联成16位计数器
MCCNT=60000; //60000*24M/16=40ms
MCCTL=0xC7;
TSCR1=0x10;
}
void sam_position(void)
{
sam_g[1]= PORTA_PA4;
sam_g[2]= PORTA_PA3;
sam_g[3]= PORTA_PA2;
sam_g[4]= PORTA_PA1;
sam_g[5]= PORTA_PA0;
sam_g[6]= PORTB_PB0;
sam_g[7]= PORTB_PB1;
sam_g[8]= PORTB_PB2;
sam_g[9]= PORTB_PB3;
sam_g[10]= PORTB_PB4;
sam_g[11]= PORTB_PB5;
sam_g[12]= PORTB_PB6;
sam_g[13]= PORTB_PB7;
}
//----------------------check_start---------------------
void check_start(void)
{
unsigned char i,j=0;
start_flag=0;
for(i=1;i<14;i++)
if(sam_g^sam_g[i+1])
j++;
if(j>=4)
{
if(sam_g[5] &&((!sam_g[4])&&(!sam_g[6])) &&((!sam_g[3])&&(!sam_g[7]))&&(sam_g[1]&&sam_g[10])
) start_flag=1;
else if(sam_g[5]&&sam_g[6] &&((!sam_g[4])&&(!sam_g[7]))&&((!sam_g[3])&&(!sam_g[8])) &&(sam_g[1]&&sam_g[10])
) start_flag=1;
else if( sam_g[6] &&((!sam_g[5])&&(!sam_g[7])) &&((!sam_g[4])&&(!sam_g[8])) &&(sam_g[1]&&sam_g[11])
) start_flag=1;
else if( sam_g[6]&&sam_g[7] &&((!sam_g[5])&&(!sam_g[8])) &&((!sam_g[4])&&(!sam_g[9])) &&(sam_g[2]&&sam_g[11])
) start_flag=1;
else if( sam_g[7] &&((!sam_g[6])&&(!sam_g[8])) &&((!sam_g[5])&&(!sam_g[9])) &&(sam_g[2]&&sam_g[12])
) start_flag=1;
else if( sam_g[7]&&sam_g[8] &&((!sam_g[6])&&(!sam_g[9])) &&((!sam_g[5])&&(!sam_g[10])) &&(sam_g[3]&&sam_g[12])
) start_flag=1;
else if( sam_g[8] &&((!sam_g[7])&&(!sam_g[9])) &&((!sam_g[6])&&(!sam_g[10])) &&(sam_g[3]&&sam_g[13])
) start_flag=1;
else if( sam_g[8]&&sam_g[9]&&((!sam_g[7])&&(!sam_g[10])) &&((!sam_g[6])&&(!sam_g[11])) &&(sam_g[4]&&sam_g[13])
) start_flag=1;
else if( sam_g[9] &&((!sam_g[8])&&(!sam_g[10])) &&((!sam_g[7])&&(!sam_g[11])) &&(sam_g[4]&&sam_g[13])
) start_flag=1;
}
if(start_flag)
art_count++;
else
art_count=0;
if(start_count==2)
{
found_start();
start_count=0;
}
if(start_line_acc==2)
{
finish_flag=1;
}
}
//--------------------------car_position------------------------
作者:
chenkai5782212
时间:
2010-11-2 16:39
谢谢
作者:
husthjp
时间:
2010-11-2 18:52
谢了
作者:
silverly
时间:
2010-11-3 20:31
研究一下,谢谢了。
作者:
200802030103
时间:
2010-11-8 21:56
谢谢
作者:
chenkai5782212
时间:
2010-11-8 23:55
好东西,
作者:
wangkaiglr
时间:
2010-11-24 08:05
感谢楼主分享
作者:
华电小宁
时间:
2011-1-16 21:20
谢谢
作者:
Lermonto
时间:
2011-1-27 16:55
谢谢楼主分享,来学习学习!呵呵
作者:
aym
时间:
2011-2-13 11:30
你用代码编辑工具写看起来就爽多了。
作者:
aym
时间:
2011-2-13 11:30
你用代码编辑工具写看起来就爽多了。
作者:
aym
时间:
2011-2-13 11:30
你用代码编辑工具写看起来就爽多了。
作者:
aym
时间:
2011-2-13 11:30
你用代码编辑工具写看起来就爽多了。
作者:
a222
时间:
2011-2-16 14:17
#include <hidef.h> 这个hidef.h在哪里?
作者:
tju_speed
时间:
2011-2-22 12:55
多谢楼主分享
作者:
longforest
时间:
2011-3-13 22:50
道一声谢
作者:
科大野狼
时间:
2011-3-18 00:33
谢啦
作者:
wengyouzhi
时间:
2011-3-24 17:53
顶了再下
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2