飞思卡尔智能车电磁组 程序
#include
#include "derivative.h" /* derivative-specific definitions */
#include
#include
#pragma LINK_INFO DERIVATIVE "MC9S12XS128"
#define border 15 //电感采集信号的边界值
#define border_back 160 //背后两个电感的边界值
float caiji_ad[9];//存储七路AD采集量,caiji_ad[0] caiji_ad[8]恒等于零
int a,b,c;
unsigned char
table[16]={0x3F,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5 e,0x79,0x71};
int angle_data,angle_pre; //舵机角度
unsigned int caiji_flag; //采集标志
char out;
char flag_pulse;
char outjudge_flag;
int check_stop;
int upp;
unsigned char cha;
unsigned int position_flag;
float position_q=0,position_qp=0,position_qd=0;
float position_h=0,position_hp=0,position_hd=0;
float position_jian;
float position_jia;
float position;
float position_cha,position_zhong;
float pwm1_p;
float pwm1_diff;
unsigned int jishi_flag;
float diff_q,diff_h;
float Speed_tar,Speed_cur,speed_p;
float pwmtemp,pre_pwmtemp;
float PID_P=200;
float PID_I=300;
float PID_D=0.1;
float error=0;
float error_min=-0.1;
float last_error=0;
float pre_error=0;
float banjing ;
void data_init()
{
unsigned int i;
for(i=1;i<7;i++)
{
caiji_ad[i]=0;
}
position_flag=0;
angle_data=2600;
position=0;
angle_pre=0;
diff_q=0;
diff_h=0;
out=0;
outjudge_flag=0;
pwm1_p=2600;
pwm1_diff=0;
jishi_flag=0;
DDRA=0xff;
DDRB=0x0f;
upp=0;
}
void SET_PLL()
{
CLKSEL=0X00;
PLLCTL=0Xe1;
SYNR=4; //设置总线频率为(SYNR+1)*8MHz
REFDV=1;
PLLCTL=0x60;//怎么设置?
asm NOP; ;//空操作,进行简单的延时,等待锁相环的响应
asm NOP;
asm NOP;
while ((CRGFLG&0x08)==0); //时钟校正同步无执行语句?
CLKSEL=0x80;//使用PLLCLK oscclk是啥?
}
void initPIT()//定时中断初始化函数 5MS定时中断设置
{
PITCFLMT_PITE=0; //PIT功能关
PITCE_PCE0=1;//定时器通道0使能
PITMUX_PMUX0=0; //通道0
PITMTLD0=200;//200分频,在40MHzBusClock下,为200kHz。即
//1/200ms=0.005ms
PITLD0=1000;//16位定时器初值设定。PITTIME*0.005MS =5ms //注意!!!可能影响舵机响应时间
PITINTE_PINTE0=1;//定时器中断通道0中断使能
PITCFLMT_PITE=1;//PIT功能开
}
void AD_Init()
{
ATD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:ch
ATD0CTL2=0x40; //AFFC=1,对结果寄存器的访问将自动清除转换完成标志位
ATD0CTL3=0x80; //右对齐无符号,4个ad通道采样, No FIFO, Freeze模式下继续转
ATD0CTL4=0x01; //765:采样时间为4个AD时钟周
期,ATDClock=[BusClock*0.5]/[PRS+1]
ATD0CTL5=0x30; //6:0特殊通道禁止,5:1连续转换 ,4:1多通道轮流采样
ATD0DIEN=0x00; //禁止数字输入
}
void IOC_Init()
{
PACTL=0X50;//PT7 PIN,PACN32 16BIT,ALLing edge,NOT INTERRUPT
TCTL3=0xc0;//c-输入捕捉7任何沿有效,
TIE =0x00;//每一位对应相应通道中断允许,0表示禁止中断
TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较
}
void pwm_init()
{
PWMPOL=0x02; //对应通道的极性,及联通到首先输出高电平
PWMCLK=0xff; //clock sa、SB做时钟源、
PWMPRCLK=0x00; //令时钟A为总线频
PWMCAE=0x00; //左对齐输出模式
PWMCTL=0x70; //01,23,45级联
PWMSCLA=10; //clockSA=ClockA/(2*PWMSCLA)
PWMSCLB=10; //clockSB=ClockB/(2*PWMSCLB)
PWMPER01=40000; //设定周期 ,周期是:时钟源周期*(PWMPER) 72hz
PWMPER23=200;
PWMPER45=200;
}
void SCI_Init(void)
{
SCI1BDH=0x01;
SCI1BDL=0x04; //SCI0BDL=busclk/(16*BT) 采用PLLCLK时
钟,BUSCLK=PLLCLK/2=16Mhz
//BUSCLK=16MHz,(19200bps,SCI0BDL=0x34);(9600bps,SCI0BDL=0x68);
SCI1CR1=0x00;
SCI1CR2=0x2C; //接收和发送使能,允许接收中断
}
void SCI_SendByte(unsigned char ch)
{
while(!(SCI1SR1&0x80)); //等待 SCI0SR1.7=1 表示上一次发送完毕 SCI1DRL=ch;
}
unsigned int read_ad(unsigned int ch)
{
unsigned int ad=0;
while(!ATD0STAT0_SCF);
switch(ch) {
default:break;
case 1:
ad=ATD0DR8L;
break;
case 2:
ad=ATD0DR7L;
break;
case 3:
ad=ATD0DR6L;
break;
case 4:
ad=ATD0DR5L;
break;
case 5:
ad=ATD0DR4L;
break;
case 6:
ad=ATD0DR3L;
break;
case 7:
ad=ATD0DR2L;
break;
case 8:
ad=ATD0DR1L;
break;
case 9:
ad=ATD0DR0L;
break;
}
return ad;
}
void delay(unsigned int ms)
{
int i;
for(;ms>0;ms--) for(i=5000;i>0;i--);
}
void delay2(unsigned char us)
{
int i;
for(;us>0;us--) for(i=5;i>0;i--);
}
/**************显示子程序*****************/ int L1,L2,L3,L4;
void display(int num1)
{
int x;
L1=(num1%100)%10;
L2=(num1%100)/10;
L3=num1/100;
/*L5=(num2%100)%10;
L6=(num2%100)/10;
L7=num2/100; */
x=PORTB&0xf0;
x|=0x0e;
PORTB=x;//显示L1位
PORTA=table[L1];
delay2(30);
PORTB=x-1;
PORTA=table[L2];
delay2(30);
PORTB=x-3;
PORTA=table[L3];
delay2(30);
/*PORTB=0xef;//显示L5位
PORTA=table[L5];
delay2(50);
PORTB=0xdf;
PORTA=table[L6];
delay2(50);
PORTB=0xbf;
PORTA=table[L7];
delay2(50); */
}
void lvbo_init()
{
while(!ATD0STAT0_SCF);
if(read_ad(9)>(caiji_ad[1]+1)||read_ad(9)<(caiji_ad[1]-1))
caiji_ad[1]=read_ad(9);
if(read_ad(8)>(caiji_ad[2]+1)||read_ad(8)<(caiji_ad[2]-1))
caiji_ad[2]=read_ad(8);
if(read_ad(7)>(caiji_ad[3]+1)||read_ad(7)<(caiji_ad[3]-1))
caiji_ad[3]=read_ad(7);
if(read_ad(6)>(caiji_ad[4]+1)||read_ad(6)<(caiji_ad[4]-1))
caiji_ad[4]=read_ad(6);
if(read_ad(5)>(caiji_ad[5]+1)||read_ad(5)<(caiji_ad[5]-1))
caiji_ad[5]=read_ad(5);
if(read_ad(4)>(caiji_ad[6]+1)||read_ad(4)<(caiji_ad[6]-1))
caiji_ad[6]=read_ad(4);
if(read_ad(3)>(caiji_ad[7]+1)||read_ad(3)<(caiji_ad[7]-1))
caiji_ad[7]=read_ad(3);
if(read_ad(2)>(caiji_ad[8]+1)||read_ad(2)<(caiji_ad[8]-1))
caiji_ad[8]=read_ad(2);
}
void car_position_h()
{
int i,max;
max=1;
for(i=2;i<4;i++) //找出最强的传感器
{
if(caiji_ad[max] max=i; } if(caiji_ad[1]<50&&caiji_ad[2]<50&&caiji_ad[3]<50) position_h=position_hp; else { if(max==1||(max==2&&(caiji_ad[1]>caiji_ad[3]))) { diff_h=(1/caiji_ad[1]-1/caiji_ad[2])*10000; if(diff_h<-200) diff_h=-200; position_flag=12; if(diff_h<=66) position_h=18.91*sin(0.003646*diff_h+0.04781)-5; //else position=-4; } if(max==3||(max==2&&(caiji_ad[1] { diff_h=(1/caiji_ad[2]-1/caiji_ad[3])*10000; if(diff_h>250) diff_h=250; position_flag=23; if(diff_h>=-86) position_h=13.53*sin(0.00483*diff_h-0.05077)+5; } } if(position_h>12) position_h=12; if(position_h<-12) position_h=-12; position_hd=position_h-position_hp; if(position_hd>10||position_hd<-10) position_h=position_hp; else position_hp=position_h; } void car_position_q() { int i,max; max=4; for(i=5;i<7;i++) //找出最强的传感器 { if(caiji_ad[max] max=i; } if(caiji_ad[4]<50&&caiji_ad[5]<50&&caiji_ad[6]<50) position_q=position_qp; else { if(max==4||(max==5&&(caiji_ad[4]>caiji_ad[6]))) { diff_q=(1/caiji_ad[4]-1/caiji_ad[5])*10000; if(diff_q<-360) diff_q=-360; if(diff_q<=66) position_q=25.97*sin(0.002766*diff_q+0.0162)-5; //else position=-4; } if(max==6||(max==5&&(caiji_ad[4] { diff_q=(1/caiji_ad[5]-1/caiji_ad[6])*10000; if(diff_q>250) diff_q=250; if(diff_q>=-70) position_q=12.58*sin(0.005532*diff_q-0.02258)+5; } } if(position_q>12) position_q=12; if(position_q<-12) position_q=-12; position_qd=position_q-position_qp; if(position_qd>10||position_qd<-10) position_q=position_qp; else position_qp=position_q; } void drive() { if(position_jian>=-1&&position_jian<=1) //直道 { if(position_q>=-5&&position_q<=5) { a=1; angle_data=2500; if((PORTB&0xf0)==0x60) Speed_tar=0.45; if((PORTB&0xf0)==0x70) Speed_tar=0.5; if((PORTB&0xf0)==0x80) Speed_tar=0.6; if((PORTB&0xf0)==0x90) Speed_tar=0.7; if((PORTB&0xf0)==0xa0) Speed_tar=0.8; if((PORTB&0xf0)==0xb0) Speed_tar=0.9; if((PORTB&0xf0)==0xc0) Speed_tar=1.0; } else { a=2; angle_data=2600+35*position_q; //大角度回转 if((PORTB&0xf0)==0x60) Speed_tar=0.45; if((PORTB&0xf0)==0x70) Speed_tar=0.5; if((PORTB&0xf0)==0x80) Speed_tar=0.6; if((PORTB&0xf0)==0x90) Speed_tar=0.7; if((PORTB&0xf0)==0xa0) Speed_tar=0.8; if((PORTB&0xf0)==0xb0) Speed_tar=0.9; if((PORTB&0xf0)==0xc0) Speed_tar=1.0; } } if(position_jian<-1||position_jian>1) { if((position_q>0&&position_h<0)||(position_q<0&&position_h>0)) //一正一负 { a=3; //angle_data=2600+banjing;if((PORTB&0xf0)==0x60) Speed_tar=5; if((PORTB&0xf0)==0x60) Speed_tar=0.4; if((PORTB&0xf0)==0x70) Speed_tar=0.45; if((PORTB&0xf0)==0x90) Speed_tar=0.4; if((PORTB&0xf0)==0xa0) Speed_tar=0.5; if((PORTB&0xf0)==0xb0) Speed_tar=0.55; if((PORTB&0xf0)==0xc0) Speed_tar=0.6; } if(position_q>0&&position_h>=0) //都在右侧 { if(position_q>position_h) //外道 { a=4; Speed_tar=0.3; if((PORTB&0xf0)==0x80) Speed_tar=0.45; if((PORTB&0xf0)==0x90) Speed_tar=0.45; if((PORTB&0xf0)==0xa0) Speed_tar=0.45; if((PORTB&0xf0)==0xb0) Speed_tar=0.45; if((PORTB&0xf0)==0xc0) Speed_tar=0.55; } else //内道加速 { a=5; if((PORTB&0xf0)==0x60) Speed_tar=0.35; if((PORTB&0xf0)==0x70) Speed_tar=0.45; if((PORTB&0xf0)==0x80) Speed_tar=0.45; if((PORTB&0xf0)==0x90) Speed_tar=0.5; if((PORTB&0xf0)==0xa0) Speed_tar=0.5; if((PORTB&0xf0)==0xb0) Speed_tar=0.5; if((PORTB&0xf0)==0xc0) Speed_tar=0.6; } } if(position_q<=0&&position_h<0) //都在左侧 { if(position_q>position_h) //内道 { a=6; if((PORTB&0xf0)==0x60) Speed_tar=0.35; if((PORTB&0xf0)==0x70) Speed_tar=0.45; if((PORTB&0xf0)==0x80) Speed_tar=0.45; if((PORTB&0xf0)==0x90) Speed_tar=0.5; if((PORTB&0xf0)==0xa0) Speed_tar=0.5; if((PORTB&0xf0)==0xb0) Speed_tar=0.5; if((PORTB&0xf0)==0xc0) Speed_tar=0.6; } else //外道 { a=7; Speed_tar=0.3; if((PORTB&0xf0)==0x90) Speed_tar=0.45; if((PORTB&0xf0)==0xa0) Speed_tar=0.45; if((PORTB&0xf0)==0xb0) Speed_tar=0.45; if((PORTB&0xf0)==0xc0) Speed_tar=0.55; } } angle_data=2600+banjing; if(position_q>=-12&&position_q<=-7) angle_data=2200; if(position_q>=7&&position_q<=12) angle_data=3000; } if(angle_data>3000) angle_data=3000; if(angle_data<2200) angle_data=2200; angle_pre=angle_data; } void PID_init(void) //增量式PID正常处理部分 { error=Speed_tar-Speed_cur/100.0; pwmtemp+=(PID_P*(error-last_error)+PID_I*error+PID_D*(error+pre_error-2*last_error)); if(pwmtemp>200) pwmtemp=199; if(pwmtemp<0) pwmtemp=0; if(error>=0) { PWMDTY23=0; PWMDTY45=pwmtemp; } if(error<0&&error>=error_min) { PWMDTY23=0; PWMDTY45=pwmtemp-50*error_min; } if(error { PWMDTY23=pwmtemp; PWMDTY45=0; } if(error<-0.2&&error>=-2.5) { PWMDTY23=150; PWMDTY45=0; } if(error<-2.5) { PWMDTY23=199; PWMDTY45=0; } pre_error=last_error; last_error=error; } void main() { char d; DisableInterrupts; data_init(); SET_PLL(); AD_Init(); initPIT(); IOC_Init(); pwm_init(); SCI_Init(); PWME=0x3f; PWMDTY01=2600;//2600为中间位置,左极限2200,右极限3000 PWMDTY23=0; PWMDTY45=0; pwmtemp=0; Speed_tar=0; PUCR_PUPBE=1; //使用拉电阻 //delay(2000); DDRT=0X00; EnableInterrupts; while(1) { while((PORTB&0xf0)==0x00) { display(caiji_ad[1]); lvbo_init(); } while((PORTB&0xf0)==0x10) { display(caiji_ad[2]); lvbo_init(); } while((PORTB&0xf0)==0x20) { display(caiji_ad[3]); lvbo_init(); } while((PORTB&0xf0)==0x30) { display(caiji_ad[4]); lvbo_init(); } while((PORTB&0xf0)==0x40) { display(caiji_ad[5]); lvbo_init(); } while((PORTB&0xf0)==0x50) { display(caiji_ad[6]); lvbo_init(); } lvbo_init(); car_position_q(); car_position_h(); position_jian=position_q-position_h+0.27; position_jia=position_q+position_h; position_cha=position_jian/2; //gai guo position_zhong=position_jian-position_cha; //gai guo if((PORTB&0xf0)==0x60) banjing=(8200*position_zhong)/(position_zhong*position_zhong+100); if((PORTB&0xf0)==0x70) banjing=(8200*position_zhong)/(position_zhong*position_zhong+100); if((PORTB&0xf0)==0x80) banjing=(8200*position_zhong)/(position_zhong*position_zhong+100); if((PORTB&0xf0)==0x90) banjing=(8200*position_zhong)/(position_zhong*position_zhong+100); if((PORTB&0xf0)==0xa0) banjing=(8200*position_zhong)/(position_zhong*position_zhong+100); if((PORTB&0xf0)==0xb0) banjing=(8200*position_zhong)/(position_zhong*position_zhong+100); if((PORTB&0xf0)==0xc0) banjing=(9000*position_zhong)/(position_zhong*position_zhong+100); position=position_q; drive(); PWMDTY01=angle_data; if(flag_pulse==2) { flag_pulse=0; PID_init(); } if(upp>=1000) //检测停止 check_stop=1; while(PTT_PTT0==0&&check_stop==1) { while(1) { Speed_tar=0; PWMDTY01=2600; PID_init(); } } } } #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 66 PIT0(void) { PACTL_PAEN=0;//16b计数禁止 caiji_flag=1; flag_pulse++; upp++; jishi_flag++; Speed_cur=PACNT; //SCI_SendByte(PACNTL); PACNT = 0X0000; PACTL_PAEN=1;//16b计数允许 PITTF_PTF0=1;//清中断标志位 } RT,留下一点不算成功的经验吧。 先说说个人认为要取得好成绩的两个最重要的先决条件。 1. 人,这个是大前提,对于一个好的队伍,判别标准其实很简单,就是队员3个人是玩伴关系还是领导和下属关系。前者,大家都是来玩这个智能车的,自然主观能动性就会很高,能自主学习。不会总是“等着所谓队长分配任务”。这样效率就会很高。成绩自然不会低,后者,如果“队长”个人能力很强的话,就会出现到最后只有“队长”一个人在干。其他的队员就会因为自己技术不行,渐渐退出。而不会因为自己不会而去主动的学习。如果“队长”能力一般,再没有一些强力指导老师的情况下,这样的队伍一般会悲剧掉。所以,新人在参加这个智能车比赛的时就要明确动机。参加智能车确实是来学习知识的,但不会有人真正的来教你。一切都靠自己。 2.跑道,这个是客观条件中最重要的,一条污浊、破损、不符合规则的跑道,是不可能出成绩的。我们学校的赛道就是因为当初制作和后期保养不到位,导致赛道诸多永久性污浊、破损。一开始车刚能爬的时候,问题还不明显,后来在测试让车能平滑过S弯时问题就来了,由于赛道污浊,远处的跑道在CCD看了是错误,导致S弯和普通弯看起来一样,致使S弯策略根本没有启用,当时一直到修改S弯策略,到后来调出图像来看才发现是采集的问题。至于赛道污浊破损带来的干扰要不要处理,答案是肯定的,因为就算是比赛用的跑道也会有擦不掉,补不了的地方。但处理这些问题,应该是放在车辆原先行驶策略都调试正确的情况下,再人为的加入这些干扰。这样修改程序起来就有的放矢。 下面再以个人的观点介绍一下3个组别的特点,给新人选择做一个参考。 摄像头:有点像开卷考试,能得到的东西很多,但是如何把这些东西用好就是一个学问。摄像头的关键就是如何从采集回来的图像所包含的诸多信息中,选出一些高效方便的信息来控制车辆。至于控制策略,个人觉得一个能根据不同赛道类型而变化比例系数的比例控制器就能很好的满足控制需要。 光电组:想象起来很容易,其实很累的一个组,原理最简单,但是为了能有30CM以上的前瞻,和比较连续的偏差变化,就要下大功夫,先不说别的,让你装15个激光管,而且要保证不焊烧并要把光点打在一条线上,就是很繁琐的事情。总得来说,光电组拼的就是电路和传感器结构。不过对于看客来说,光电组是最好“看”的组,一排壮观的激光加上摆头的机械~ 电磁组:听起来有点复杂,其实比前两个组都轻松的组,电磁组又可分为数字和模拟两个类别。数字传感器就是和光电一样弄一排的传感器,看看哪个传感器接收到的信号最强以判断中线位置。模拟的就是比较两个传感器之间信号强度的差值来判断。电磁组好处就是不容易受到干扰,比赛上也见的,电磁车跑完的成功率是很高的,而且很容易判别起跑线。基本不用懂脑筋。而且如果选用是模拟传感器的话,能得到比较平滑的控制。 先说这些,想到再继续 关于摇头激光车的一点个人理解:为什么光电的车,要多花一个舵机去让传感器摇头呢?因为。为了能获得赛道上一个比较宽范围的信息,就必须把传感器做的很长。这样的后果 就是重量。折中的办法就是摇头,通过摇头,可以使一个小尺寸的传感器检测到大范围 DEMOK工作室淘宝小店 ?пㄖ ???? ??? ? ??? ?? ? ? 1? ? ??? ? 哖 世?? ???? ??? ??? ??? ? ??? ㄎ? ?? ??????仁??20kHz??????⌒ ???仁?VLF? ??⌒???仁仁?? ? 仁 ?仁??⌒????3kHz?30kHz?⌒?? 100km?10km? ?? 3.1?? ??? ? ? ?? ? ? ?а ? ?????? ??? ? ? ? ? ?? ??オ???? ??? ??? ? ? ??? ? ? ???о? ??? ??? ??? ? ? ? ? ?? ? ??? й ?????? ? ? ?? ? ???? ?н ????? ? ? на???? ??? ? ? ?? ? ? ?? а ? ???? ?? ??? ?? ? ??? ? ? ?? ?? ??? ??? ?? ??仁? ??? ?? ???? ??? ?? ?? ????? ?? ? ?? ?????? ↓ ? ?? ?? ↓ ? ?? ?? ??? ???? ? ??? ?? ? ? ?? ? ↓ ?? ?? ? ? ? ? ?? っ ?? ???/& ????? ??? ? ? ??/&? ?? ? ? ?йㄐ ???? ?? ?LC? ?? ? ? ?? ?? ? ?? ??????? ??? ??AD???? 享 ?? 儈?↓? фн?? ?? ???AD? ???? ? ?? ?? 3.3 ?? ?? ???????? ?? 傼 ??н ??? ? ? н ? ?? ?? ?н ? н? ? ? ??? ? ?? ?нっ ???? ?????? ? ф? 儈? ? ? 第五届全国大学生智能汽车竞赛 20KHz 电源参考设计方案 (竞赛秘书处技术组版本1.0) 第五届全国大学“飞思卡尔杯”智能汽车竞赛新增加了“电磁组”。根据比赛技术要求,电磁组竞赛,需要选手设计的智能车能够检测到道路中心线下电线中20KHz交表电流产生的磁场来导引小车沿着道路行驶。在平时调试和比赛过程中需要能够满足比赛技术要求的20KHz的交流电源驱动赛道中心线下的线圈。本文档给出了电源设计参考方案,参赛队伍可以根据这些参考设计方案自行设计制作所使用电源。 一、 电源技术指标要求: 根据《竞赛比赛细则》附件三关于电磁组赛道说明,20KHz电源技术要求如下: 1、驱动赛道中心线下铺设的0.1-0.3mm直径的漆包线; 2、频率范围:20K±2K; 3、电流范围:50-150mA; 下图是赛道起跑区示意图,在中心线铺设有漆包线。 图1 竞赛跑道起跑区示意图 首先分析赛道铺设铜线的电抗,从而得到电源输出的电压范围。 我们按照普通的练习赛道总长度50,使用直径为0.2mm漆包线。在30摄氏度下,铜线的电阻率大约为 0.0185欧姆平方毫米/米。计算可以得到中心线的电阻大约为29.4欧姆。 按照导线电感量计算机公式: 4 2ln0.75() l L l nH d ?? =×? ?? ?? 。其中l, d的单位 均为cm。可以计算出直径为0.2mm,长度50米的铜线电感量为131微亨。对应20KHz下,感抗约为16.5欧姆。 可以看出,线圈的电感量小于其电阻值。由于导线的电感量与铺设的形状有关系,上述计算所得到的电感量不是准确数值。另外,我们可以在输出时串接电容来抵消电感的感抗。所以估算电源电压输出范围的时候,我们不再特别考虑线圈的电感对于电流的影响。 为了方便设计,我们设计电源输出电压波形为对称方波。由于线圈电感的影响,线圈中的电流为上升、下降沿缓变的方波波形。如下图所示 图2 线圈驱动电压与电流示意图 对于电阻为29.4欧姆的赛道导线,流过100mA的电流,电压峰值应该大于3V。考虑到赛道长度有可能进一步增加、漆包线的直径减少等原因,设计电源输出电压的峰值为6V。在输出电流为150mA的时候,电源输出功率大约为0.9W。 二、 电源组成 电源电路包括振荡电路、功率输出电路、恒流控制电路以及电源等组成。 如下图所示: 摘 1.1 专业课程设计题目 现在我们借助电磁组用的20KHZ的信号发生器看看能学到些什么。 信号发生器分三个部分组成,20K信号发生器、功率输出部分(功率输出可以采用多种方式,我们在这里只讨论用分立元件组成的H桥)、恒流源部分。20K信号的发生有多种方式,可以使用单片机也可以使用555还可以使用其他的振荡电路(教材上有详细的介绍)。下面我们主要讨论一下H桥和恒流控制。 这是一个H桥功率输出+恒流电路,现在我们把它拆分成两部分来看。首先是H桥的主体如下图所示。 这是上臂由PNP三极管和下臂由NPN三极管构成的H桥。其原理是在三极管工作在关闭和饱和两种状态的基础下,当控制Q1和Q4导通并且另外两只三极管截至的情况下电流会从负载(RL)的左侧流向右侧(红线方向);同理当Q2和Q3导通Q1和Q4截至的时候电流会从负载的右侧流向左侧(绿线方向)。 让NPN三极管工作在饱和的状态(当开关使)只要使其基极电流足够大就可以了(不可太大会烧坏管子的),当Vbe大于导通电压时集电极和发射极导通。一般NPN三极管当开关使的电路如下图所示。 与NPN三极管不同的是PNP三极管的Vbe为负压时(电流从发射极流向基极)发射极和集电极导通。一般PNP三极管当开关使的电路如下图所示。 通过观察这两个开关电路可以发现NPN三极管开关电路的负载比三极管更靠近电源正极,而PNP三极管开关电路的负载比三极管更靠近地。为什么要这么做呢,如果放反了会怎么样呢,以NPN三极管为例。 我们都知道NPN三极管正常工作时发射极电位是小于基极电位的,所以上图电路中的三极管是工作在放大状态下的。这个电路的好处在于基极电流很小(输入阻抗很大),基极电流近似等于(基极电压-导通电压)/负载电阻/β。在共集放大电路(在学习共集放大电路的时候不妨也顺便看看共基放大电路)和推挽电路中会看到它的身影。这个电路稍微改造一下就变成了一个最简单的(之一吧)恒流源。 流过负载电阻RL的电流近似恒定为(Vref-导通电压)/Rfb。那么这个电路是如何恒流的呢,反馈电阻Rfb(在这里就不叫负载电阻了)是关键。我们都知道在RL在一定范围内变化时(这点很重要,RL如果太大下文就不成立了)三极管的集电极电流=基极电流*β,集电极电流与RL无关,但是β会随着三极管工作产生的热量变化,所以β值的变化是恒流最大的敌人。好在这里有Rfb,当β增大时集电极电流增大即流过Rfb的电流就会增大所以导致三极管发射极电压升高,进而导致基极电流变小使集电极电流稳定下来。这就是所谓的负反馈。可以把这个电路抽象成一个串接在主回路上的可调电阻器。 extern int left,w,top,h; extern HDC m_hdc; CBrush brush3(RGB(0,255,0)); CBrush brush4(RGB(255,0,0)); CBrush brush5(RGB(255,255,0)); #else #include 飞思卡尔智能车电磁组程序员成长之路 1.飞思卡尔智能车小车入门 智能汽车电磁组简介: 第五届全国大学“飞思卡尔杯”智能汽车竞赛新增加了“电磁组”。根据比赛技术 要求,电磁组竞赛,需要选手设计的智能车能够检测到道路中心线下电线中20KHz 交 变电流产生的磁场来导引小车沿着道路行驶。在平时调试和比赛过程中需要能够满足比 赛技术要求的 20KHz 的交流电源驱动赛道中心线下的线圈。同时参赛选手需要自行设 计合适的电磁传感器来检测赛道信息完成智能寻迹功能。 智能车制作是一个涵盖电子、电气、机械、控制等多个领域和学科的科技创新活动。简单点来说可以将其分为硬件电路(包括电源、MUC 控制部分、电机驱动、传感器)、机械、算法三方面的设计。电磁组在机械方面可以参照光电组的设计方案,这里不再赘述。本设计指导只讲述20KHZ 电源、电磁传感器设计方案以及部分算法。 智能车对单片机模块需求: 飞思卡尔单片机资源: 智能车涉及到IO模块,中断模块,PWM模块,DMA模块,AD模块等。在车模调试中还有必须的模块。如SCI模块、定时器模块,SPI模块等。其中还涉及到一些算法和数据的存储和搬移。一个好程序框架对智能车的制作过程中会达到事半功倍的效果。但是就智能车这样系统来说,如果完全专门移植一个操作系统或者写一个程序的bootload,感觉有一些本末倒置,如果有成熟的,可以借用的,那样会比较好。 2.电磁传感器的使用 20KHz电源参考设计方案: 电源技术指标要求: 根据官网关于电磁组赛道说明,20KHz 电源技术要求如下: 1.驱动赛道中心线下铺设的 0.1-0.3mm 直径的漆包线; 2.频率围:20K±2K; 3.电流围:50-150mA; 图 2.1 是赛道起跑区示意图,在中心 线铺设有漆包线。 首先分析赛道铺设铜线的电抗,从而得 到电源输出的电压围。我们按照普通的练习 赛道总长度 50m,使用直径 0.2mm 漆包线。在30 摄氏度下,铜线的电阻率大约为 0.0185 欧姆平方毫米/米。计算可以得到中心线的电阻大约为 29.4 欧姆。 按照导线电感量计算机公式: 其中 l, d 的单位均为 cm。可以计算出直径为 0.2mm,长度 50 米的铜线电感量为131 微亨。对应 20KHz 下,感抗约为 16.5 欧姆。 飞思卡尔智能车比赛电磁组路径检测设计方案电磁组竞赛车模 路径检测设计参考方案 (竞赛秘书处 2010-1,版本 1.0) 一、前言 第五届全国大学生智能汽车竞赛新增加了电磁组比赛。竞赛车模需要能够通 过自动识别赛道中心线位置处由通有 100mA 交变电流的导线所产生的电磁场进行路径检测。除此之外在赛道的起跑线处还有永磁铁标志起跑线的位置。具体要求请参阅《第五届智能汽车竞赛细则》技术文档。 本文给出了一种简便的交变磁场的检测方案,目的是使得部分初次参加比赛 的队伍能够尽快有一个设计方案,开始制作和调试自己的车模。本方案通过微型车模实际运行,证明了它的可行性。微型车模运行录像参见竞赛网站上视频文件。 二、设计原理 1、导线周围的电磁场 根据麦克斯韦电磁场理论,交变电流会在周围产生交变的电磁场。智能汽车 竞赛使用路径导航的交流电流频率为 20kHz,产生的电磁波属于甚低频(VLF) 电磁波。甚低频频率范围处于工频和低频电磁破中间,为 3kHz,30kHz,波长为 100km,10km。如下图所示: 图 1:电流周围的电磁场示意图 导线周围的电场和磁场,按照一定规律分布。通过检测相应的电磁场的强度 和方向可以反过来获得距离导线的空间位置,这正是我们进行电磁导航的目的。 由于赛道导航电线和小车尺寸 l 远远小于电磁波的波长,,电磁场辐射能量很小(如果天线的长度 l 远小于电磁波长,在施加交变电压后,电磁波辐射功率正比于天线长度的四次方),所以能够感应到电磁波的能量非常小。为此,我们将导线周围变化的磁场近似缓变的磁场,按照检测静态磁场的方法获取导线周围的磁场分布,从而进行位置检测。 由毕奥-萨伐尔定律知:通有稳恒电流 I 长度为 L 的直导线周围会产生磁场,距离导线距离为 r 处 P 点的磁感应强度为: 图 2 sin直线电流的磁场 , d, ,(0 , 4 10, 7 TmA 1 ) B , ,, cos,1 2 ,。 (1) ,1 4 r 由此得: B , cos, 4 r 4 r 飞思卡尔智能车设计报告 目录 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是半桥驱动,实际使用中要求电机可以正反转,故使用两片接成全桥驱动。如图下图所示。 void main(void) { while(1) { AD_GetValue(); //获得传感器AD值Cal_PostitionA(); //获得? if(SenA!=50) { Delayms(500); break; } Delayms(50); SenA=50; } #include 智能车制作 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模块等,需要进行驱动移植。 #include 第十届“飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 学校:常熟理工学院 队伍名称:物电电磁二队 参赛队员:梅亚军、沈锦杰、黄志鹏、张峰 带队老师:徐健、顾涵 关于技术报告和研究论文使用授权的说明 本人完全了解第十届“飞思卡尔”杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。 参赛队员签名: 带队教师签名: 日期: 摘要 本文介绍了常熟理工学院物电电磁二队电磁车的成果。智能车的硬件平台采用带MK60DN256Vll10处理器,软件平台为IAR Embedded Workbench开发环境,车模采用大赛组委会统一提供的两辆B型车模。 文中介绍了智能车机械结构调整,传感器电路设计,舵机、电机控制算法以及起跑线的检测等。车模以MK60DN256Vll10单片机为控制核心,以安装在车体前的工字电感作为循迹传感器,采用干簧管检测起跑线,以欧姆龙编码器检测速度信息。车模系统的简单工作原理是MK60DN256Vll10单片机通过AD口采集电感检测的拟量,并通过算法处理,然后返回值用于舵机控制,根据编码器返回值进行电机的闭环控制。通过串口,借用蓝牙等工具进行舵机PD参数,电机PID的调节,以及整定传感器参数的整合处理,再通过数字红外进行两车之间联系,保持车距。 关键字:机械结构、电磁寻线、舵机PD控制、电机PID控制 目录 第一章总体方案设计------------------------------------------------------------------------------------------- 6 第二章智能车机械结构调整与优化 ------------------------------------------------------------------------ 9 2.1 主销内倾 ---------------------------------------------------------------------------------------------- 9 2.2 主销后倾 -------------------------------------------------------------------------------------------- 10 2.3 外倾角 ------------------------------------------------------------------------------------------------ 11 2.4车轮安装示意图如下:---------------------------------------------- 12 2.5 舵机的安装----------------------------------------------------------------------------------------- 12 2.6 舵机安装示意图如下: ------------------------------------------------------------------------- 13 2.7 小结 --------------------------------------------------------------------------------------------------- 13 第三章电路设计说明 --------------------------------------------------------------------------------------- 14 3.1 电源模块--------------------------------------------------------------------------------------------- 14 3.2 传感器模块------------------------------------------------------------------------------------------ 15 3.3 电机模块--------------------------------------------------------------------------------------------- 15 3.4 舵机模块--------------------------------------------------------------------------------------------- 16 3.5 最小系统板设计 ----------------------------------------------------------------------------------- 16 3.6 系统主板设计 -------------------------------------------------------------------------------------- 17 3.7 小结 --------------------------------------------------------------------------------------------------- 18 第四章智能车控制软件设计说明 ------------------------------------------------------------------------- 19 4.1 软件设计总体框架 -------------------------------------------------------------------------------- 19 4.2 电机PID控制 -------------------------------------------------------------------------------------- 20 4.3 舵机的控制----------------------------------------------------------------------------------------- 24 4.4 传感器数据的处理 -------------------------------------------------------------------------------- 24 4.5 小结 --------------------------------------------------------------------------------------------------- 24 第五章开发工具、制作、安装、调试过程说明 ------------------------------------------------------ 25 5.1 软件编译环境 -------------------------------------------------------------------------------------- 25 5.2 显示模块 -------------------------------------------------------------------------------------------- 25 5.3 蓝牙调试模块-------------------------------------------------------------------------------------- 26 5.4 上位机调试----------------------------------------------------------------------------------------- 26 5.5 本章小结 -------------------------------------------------------------------------------------------- 27 模型车的主要技术参数说明 --------------------------------------------------------------------------------- 28 结论 ---------------------------------------------------------------------------------------------------------------- 29 参考文献 ---------------------------------------------------------------------------------------------------------- 31 附录A:程序源代码 ------------------------------------------------------------------------------------------ 32 基准电压总结 通常AD/DA芯片都有两个电压输入端,一个是Vcc,一个是Vref,上图所示的芯片是DAC0832,Vcc是芯片的工作电压,Vref是DA转换的基准电压,AD/DA芯片对Vcc 的要求不是很高,但对基准电压Vref的要求就比较高。 S12的VRH引脚就是AD转换的基准电压输入端,在最小系统板上通过0Ω电阻和Vcc连在了一起。 一、什么叫基准电压 我们知道,AD/DA转换时需要一个电压参考值,而且要求这个参考值要稳定,这个稳定的电压参考值就叫做基准电压。比如AD(8位)转换时,假设参考电压时5V,输入量是2V,则转换后得到的数字量就是(2/5)*255=102。 二、智能车制作过程中遇到的问题 最开始我们组是利用LM2940稳压芯片输出的5V电压作为S12芯片内部AD转换的电压参考值,但采集回来的电磁信号AD值时常出现跳变,为什么?经过排除其他原因后,我们发现原因就在于基准电压不稳定,夸张地举个例子(8位AD),假设参考电压是5V,采集到的电磁模拟信号是2V,那么得到的数字量是102,但是由于某种原因参考电压突然变为4V,那么得到的数字量就突变为127,转换不准确,使得S12单片机产生误动作,要是时常发生这类突变,后果可想而知,车子根本跑不了!!! 三、LM2940与MC1403芯片 通过上面举的例子,我想说的是,LM2940输出的5V电压并非稳定,因为LM2940属于功率型稳压芯片,就是说其输出的电压会受流过LM2940的电流的影响,电流短时间发生较大变化时,其输出电 压也会相应发生变化(1V以内,典型值是0.5V),由于挂在LM2940上的负载较多,电流值变化较大,也就是说输出电压也会变化,而AD转换需要的却是一个稳定的参考电压,显然LM2940无法满足这个条件,因此AD值跳变是肯定的; 那么用哪个芯片作为基准电压更为恰当呢,答案肯定是有很多的,我们后来采用的芯片是MC1403,其输出电压很稳定,输出电压值为2.5V,关键在于即使输入电压变化较大,MC1403的输出误差也在1%以内,显然这可以满足我们AD转换所需基准电压的要求。下图是MC1403芯片的一个简介。 但是,2.5V作为基准电压显然是太低啦,因此我们需要对其进行升压,利用运算放大器的放大功能,采用的运算放大器是LMV358,电路图如下: #include 飞思卡尔智能车经验
飞思卡尔智能车电磁组信号采集
智能车电磁环境制作
基于嵌入式STM32的飞思卡尔智能车设计
要
飞思卡尔智能车大赛是面向全国大学生举办的应用型比赛, 旨在培养创新精 神、协作精神,提高工程实践能力的科技活动。大赛主要是要求小车自主循迹并 在最短时间内走完整个赛道。针对小车所安装传感器的不同,大赛分为光电组、 电磁组和摄像头组。 本文介绍了本院自动化系第一届大学生智能汽车竟赛的智能车系统。 包括总 体方案设计、机械结构设计、硬件电路设计、软件设计以及系统的调试与分析。 机械结构设计部分主要介绍了对车模的改进,以及舵机随动系统的机械结构。硬 件电路设计部分主要介绍了智能车系统的硬件电路设计, 包括原理图和 PCB 设计 智能车系统的软、 硬件结构及其开发流程。该智能车车模采用学校统一提供的飞 思卡尔车模,系统以 STM32F103C8T6 作为整个系统信息处理和控制命令的核心, 使用激光传感器检测道路信息使小车实现自主循迹的功能
关键字:飞思卡尔智能车STM32F103C8T6
激光传感器
第一章 概述
基于嵌入式 STM32 的飞思卡尔智能车设计
1.2 专业课程设计的目的与内容
1.2.1 目的 让学生运用所学的计算机、传感器、电子电路、自动控制等知识,在老师的 指导下,结合飞思卡尔智能车的设计独立地开展自动化专业的综合设计与实验, 锻炼学生对实际问题的分析和解决能力,提高工程意识,为以后的毕业设计和今 后从事相关工作打下一定的基础。 1.2.2 内容 本次智能车大赛分为光电组和创新做,我们选择光电组小车完成循迹功能。 该智能车车模采用学校统一提供的飞思卡尔车模, 系统以 STM32F103C8T6 作为整 个系统信息处理和控制命令的核心,我们对系统进行了创造性的优化: 其一, 硬件上采用激光传感器的方案, 软件上采用 keil 开发环境进行调试、 算法、弯道预判。 其二,传感器可以随动跟线,提高了检测范围。 其三,独立设计了控制电路板,充分利用 STM32 单片机现有模块进行编程, 同时拨码开关、状态指示灯等方便了算法调试。
1.3 方案的研讨与制定
1.3.1传感器选择方案 方案一:选用红外管作为赛道信息采集传感器。 由于识别赛道主要是识别黑白两种不同的颜色, 而红外对管恰好就能实现区 分黑白的功能,当红外光照在白色KT板上时,由于赛道的漫反射作用,使得一部 分红外光能反射回来, 让接收管接的输出引脚的电压发生变化,通过采集这个电 压的变化情况来区分红外光点的位置情况,以达到区分赛道与底板的作用。 红外管的优点在于价格便宜,耐用;缺点却用很多:1、红外光线在自然环 境中,无论是室内还是室外均比较常见,就使得其抗干扰能力不强,容易受环境 变化的影响。2、调试不方面,由于红外光是不可见光,调试的时候需要采用比 较麻烦的方法来判断光电的位置。3、由于红外管光线的直线性不好,就使得红 外传感器所能准确的判断的最远距离比较小,也就是通常所说的前瞻不够远。电磁组智能车恒磁式20KHZ信号源设计导图
飞思卡尔智能车摄像头组freescale程序代码
飞思卡尔智能车电磁组程序员成长之路(未完待续)
飞思卡尔智能车比赛电磁组路径检测设计方案
飞思卡尔智能车设计报告
电磁组智能车全国一等奖代码
飞思卡尔智能车简介
智能车电磁组完整程序
飞思卡尔 电磁组
AD转换基准电压总结(飞思卡尔电磁组)
电磁组程序