电动车跷跷板制作与设计

更新时间:2024-04-24 16:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

电动车跷跷板制作与设计

摘要:本电动车跷跷板是以吕合金为车架,msp430单片机为控制核心,加以步进电机、红外光电传感器、光耦传感器、倾角传感器、LCD数码光和电源电路以及其他电路构成。系统由msp430通过IO口控制小车的前进后退停止平衡以及转向。寻迹由ST188型红外光电对管完成,平衡由倾角传感器完成,用L298N驱动步进电机,同时本系统用LCD数码管进行数字显示,以显示当前电动车的运动状态。

关键词:msp430 步进电机 L298N 红外光电传感器 倾角传感器 LED数码管

一. 模块方案比较与设计

根据题目要求,本系统主要由控制器模块、电源模块、寻迹传感器模块、平衡传感器模块、步进电机及其驱动模块、LCD数码管模块。本系统的方框图如下图所示:

为较好的实现各模块的功能,我们分别设计了几种方案并分别进行了论证。 1.1.1车架设计

方案1:购买玩具电动车。购买的玩具电动车具有组装完整的车架车轮、电机及其驱动电路。但是一般的说来,玩具电动车具有如下缺点:首先,这种玩具电动车由于装配紧凑,使得各种所需传感器的安装十分不方便。其次,玩具电动车的电机多为玩具直流电机,力矩小,空载转速快,负载性能差,不易调速。而且这种电动车一般都价格不扉。因此我们放弃了此方案。

方案2:自己制作电动车。经过反复考虑论证,我们制定了三轮电动车,后面两轮分别驱动转向。前面按一个万向轮。即左右轮分别用两个转速和力矩基本完全相同的步进电机进行驱动,前面装一个万向轮。这样,当两个步进电机转向相同但转速不同时就可以实现电动车的转弯,由此可以轻松的实现小车的左转和右转。

对于车架材料的选择,我们经过比较选择了铝合金。用铝合金做的车架比塑

料车架更加牢固,比铁制小车更轻便,美观。

综上所述,最后选择方案二。 1.1.2控制器模块

本次比赛是由TI公司赞助,因此我们直接选用该公司开发的msp430 16位单片机,它是16位控制器,具有体积小、驱动能力高、集成度高、易扩展、可靠性高、功耗低、结构简单、处理速度高、中断处理能力强等特点。

1.1.3电源模块

由于本系统需要电池供电,我们考虑了如下集中方案为系统供电。 方案1:采用9V蓄电池为系统供电。蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。但是蓄电池的体积过于庞大,在小型电动车上使用极为不方便。因此我们放弃了此方案。

方案2:采用2节4.2V可充电式锂电池串联共8.4V给直流电机供电,经过7805的电压变换后为单片机和传感器供电。经过实验验证,当电池为直流电机供电时,单片机、传感器的工作电压不够,性能不稳定。因此我们放弃了此方案。

方案3:采用2节4.2V可充电式锂电池为步进电机供电,用2节1.2V的锂电池为单片机和传感器供电。采用此种供电方式后,单片机和传感器工作稳定,步进电机工作不受影响,且电池的体积较小,能够满足系统的要求。

综上考虑,我们选择了方案3。 1.1.4寻迹传感器模块

ST188红外光电对管是由一个发光管和一个接收管组成,当被测物是黑线时,红外光电二极管U发射出的光线被反射回来时很弱,光敏三极管无法导通,所以跟随器输出给单片机的信号为低电平。相反的,当被测物是白线时,由于反射回的信号较强,致使三极管导通,单片机接收到高电平。用高低电平来控制电机的转向。此光电对管调理电路简单,工作性能稳定,体积小,结构紧凑。

1.1.5电机模块

本系统为电动车跷跷板,对于电动车来说,其驱动轮的驱动电机的选择就显得十分重要。由于本题要实现对路径的精确定位和平衡,我们综合考虑采用以下方案。

采用步进电机作为该系统的驱动和转向。由于步进电机的转速可以精确定位,可以实现小车前进路程和位置的精确定位。因此我们选用步进电机作为小车的驱动。直流电机速度不易控制,位置不易精确定位,虽然可以用来控制方向,但是力矩小,小车重量稍微重一点,转向就不是很灵敏,因此我们还是选用步进电机作为小车的转向,驱动前轮。

1.1.6电机驱动模块

采用专用芯片L298N作为电机驱动芯片。L298N是一个具有高电压大电流的全桥驱动芯片,它响应频率高,功耗大。因此我们选用L298N作为步进电机的驱动,而且还带有控制使能端。用该芯片作为电机驱动,操作方便,稳定性好,性能优良。

1.1.7平衡模块

方案一:采用水银开关探测跷跷板平衡度,其原理是跷板左偏水银开关电路导通,右偏水银开关断开电路不通,这样控制电动车在平衡点小角度来回摆动来使跷跷板动态平衡,此方案测量灵敏、安装简单而且成本很低。

方案二:采用专用的平衡传感器倾角传感器。倾角传感器经常用于系统的水平测量,从工作原理上可分为“固体摆”式、“液体摆”式、“气体摆”三种倾

角传感器,倾角传感器是通过测量静态重力加速度的变化,转换成倾角变化。测量输出传感器相对于水平面的倾角和俯仰角度,角度响应速度最快5次/秒。具有5阶滤波。精度高响应速度快。

综上所述,虽然两种方案都可行,最后选择方案二。 1.1.8显示台显示模块

用数码管进行显示。数码管由于显示速度快,使用简单,显示效果简洁明了而得到了广泛应用。我们计划在显示台显示小车路程以及用高低电平显示当前小车的方向和小车的平衡度。 1.2系统方案总体设计

对于本系统来说,要实现的目的是能够在跷跷板上在规定的时间内完成规定的行程并能在跷跷板的中心平衡,最后能够在规定的时间内返回启动区。由于跷跷板是用黑线作为小车的路线,而我们的红外光电对管可以顺利的实现寻迹,倾角传感器可以实现平衡。控制电机的速度和转向既可以帮助小车在规定的时间内完成行程也可以帮助它在中心点平衡。L298N驱动步进电机的前进和转向。

二.硬件实现及单元电路设计

TI公司的msp430是16位的单片机。不用烧写器而只用串口或者并口就可以往单片机中下载程序。

2.1寻迹光电对管的设计

在寻迹传感器的设计中,我们在车体底盘的后端装有两个传感器,用来起到寻迹的作用。两边的始终要检测到白线,当检测到黑线时小车马上转向寻找黑线,这样既可以防止小车冲出场地,也可以节约时间。

红外光敏对管电路的设计与制作:

图中,R1起限流电阻的作用,当有光反射回来时,光电对管中的三极管导通,R2的上端变为高电平,此时VT1饱和导通,三极管集电极输出低电平。

当没有光反射回来时,光电对管中的三极管不导通,VT1截至,其集电极输出高电平。

本设计将两个光电传感器分别安装在车底的后部左右两侧,当电动车往右偏出轨道时,左边的光电传感器被黑色纸带遮蔽,输出为低电平,单片机收到该信号,控制右边电机加速,使小车往左偏回轨道,传感器回到白纸区输出为高电平,右边电机停止加速,小车直线前进。小车左偏离轨道状态的调整方法与右偏状态相反。为了使小车行驶到B端立刻停止,我们在跷跷板的B端贴了一条黑线,并在超出小车的左前轮1cm处也安装了一个红外光敏传感器,当传感器检测到黑线时就停止。倒计时5s,然后先是倒退1s并立即停止,原地旋转180°并立即向前行驶之起点。

2.2电机驱动电路的设计

我们采用电机驱动芯片L298N作为电机驱动。 驱动电路的设计如图16所示:

L298N的5、7、10、12四个引脚接到单片机上,步进电机有4根线接L298的2 3 13 14,还有两根线接地,通过对单片机的编程就可以控制电机的转速。

2.3显示台显示模块

用数码管显示时间。为了减小小车的空间和重量,我们采用4个连体的数码管。在不同的状态数码管显示不同的时间。

图形如下:

A B C D E F G为段选信号,H1 H2 H3 H4为位选信号。分别接到单片机上。

2.4平衡模块

我们采用的是SC100T固定式传感器,通过不断的检验和测试跷跷板在平衡时的数值为0到2047,通过单片机的设定当传感器达到所设定的数值范围时小车停止5s并通过数码管显示时间。

三、软件设计

1、我们所设计的软件主程序流程图如下所示:

2.小车寻迹转向模块;

四、系统功能测试

4.1测试仪器及设备 仪器名称 型号 用途 数量 数字万用表 MASTECH my-65 测量各电路工作1 情况 秒表 记录时间 1 4.2测量结果 不同状态下电动车行驶和停留时间测量数据 A点到达中点 第一次 第二次 第三次 时间(秒) 26 27 27 寻找平衡 时间(秒) 第一次 45 第一次 5 第一次 24 第一次 50 第二次 40 第二次 5 第二次 25 第二次 51 第三次 47 第三次 5 第三次 24 第三次 48 中点平衡 时间(秒) 中点到B点 时间(秒) 退回原地 时间(秒) 电动车从起始端A出发,在30秒钟内行驶到中心点C附近;60秒钟之内,电动车在中心点C附近使跷跷板处于平衡状态,保持平衡5秒钟,并给出明显的平衡指示;电动车从平衡点出发,30秒钟内行驶到跷跷板末端B处(车头距跷跷板末端B不大于50mm);电动车在B点停止5秒后,1分钟内倒退回起始端A,完成整个行程;在整个行驶过程中,电动车始终在跷跷板上,并分阶段实时显示电动车行驶所用的时间。

五、总结

本系统不仅完成了题目要求的基本功能而且还完成了扩张部分。通过数码管LED的显示,能够直观、形象的显示小车的状态。我们的跷跷板电动车能够从地面不通过任何东西的引领自动跑上跷跷板。并通过红外光敏检测方向始终保持匀速前进,在规定的时间内完成规定的路程,并在翘翘板的中央使跷跷板保持平衡五秒。然后继续前进到重点,并从终点换回到起点。

六、参考文献

1. 李正军。计算机控制系统。北京:机械工业出版社,2005 2. Ramon Pallas-Areny,John G. Webster(美)。传感器和信号调节,第2版。张伦译。北京:清华大学出版社,2003

附录:

1. 总体电路图;

2. 软件程序;

#include \#include \

#define uchar unsigned char #define uint unsigned int #define rightMotor_dir P3DIR #define rightMotor_out P3OUT #define leftMotor_dir P4DIR #define leftMotor_out P4OUT #define hongwai_dir P2DIR #define hongwai_IN P2IN

void Motorset(uint mode,uchar dir,uchar speed); void Motorset_1(uint mode,uchar dir,uchar speed); void car_direction_forward(void); void delay(uint q); void qj_int(void); void run_1(void); void run_2(uint q); void run_ring(void);

uint count,count_1;

uchar Motor_table[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; uchar

Motor_f_table[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};

uchar run_dir=0,run_dir_1=0; uint bu_count=0,bu_count_1=0; uint m=0,n=0; uchar A_C_dir=0;

uint speed_set,speed_set_1; uchar step;

int main( void ) {

WDTCTL=WDTPW+WDTHOLD; // rightMotor_dir|=0x0f; leftMotor_dir|=0x0f; qj_int();

hongwai_dir&=~(BIT0+BIT1+BIT2); // hongwai_dir|=BIT3;

BCSCTL1 =CALBC1_1MHZ; // DCOCTL =CALBC1_1MHZ;

TACTL=TASSEL1+TACLR; //并清TAR

CCTL0 |=CCIE; //CCR0 CCR0 =500; //期

TACTL |=MC0; //模式

P2OUT=0X08; delay(150); P2OUT=0X00;

// _EINT(); // run_1(); /*while(1) {

if((hongwai_IN&BIT2)==BIT2) {

//car_direction_forward(); Motorset_1(200,0,3); Motorset(200,0,3); } else break; }*/

关看门狗 红外2个的输入端; 设定DCO为1MHZ 定时器A时钟源为SMCLK,中断使能

计数值为50000个SMCLK周启动定时器A为连续计数 run_2(1100);

//****************************平衡点 待5******************************** while(1) {

number=AYFilter();

if((number>=628)&&(number<=642)) {

Motorset_1(0,0,1); Motorset(0,0,1); P2OUT=0X08; delay(200); break; }

if(number<628) //超过平衡点了,向后倒点。 {

Motorset_1(3,1,1); Motorset(3,1,1); delay(100); }

if(number>642) {

Motorset_1(3,0,1); Motorset(3,0,1); delay(100); } }

//**********************************奔向B********************************** // run_2(400); P2OUT=0X00; run_2(1127); /* _EINT(); while(1) {

if((hongwai_IN&BIT2)!=BIT2) //还没到B点;秒点

{

break; }

//car_direction_forward(); Motorset_1(200,0,3); Motorset(200,0,3); } */

// Motorset_1(0,0,1); //Motorset(0,0,1); P2OUT=0X08; delay(80); P2OUT=0X00; run_1(); // delay(80); run_ring(); run_2(1822); P2OUT=0X08; /* while(1) {

if((hongwai_IN&BIT2)==BIT2) {

//car_direction_forward(); Motorset_1(200,0,3); Motorset(200,0,3); } else break; } */ }

void run_1(void) {

uint m,n;

for(m=500;m>0;m--) {

rightMotor_out&=0xf0;

rightMotor_out|= Motor_table[m%8]; leftMotor_out&=0xf0;

leftMotor_out|=Motor_f_table[m%8]; for(n=1500;n>0;n--); } }

void run_2(uint q) {

uint m,n; for(m=q;m>0;m--) {

rightMotor_out&=0xf0;

rightMotor_out|= Motor_f_table[m%8]; leftMotor_out&=0xf0;

leftMotor_out|=Motor_table[m%8]; for(n=1500;n>0;n--); } }

void run_ring(void) {

uint m,n;

for(m=415;m>0;m--) {

rightMotor_out&=0xf0;

rightMotor_out|= Motor_f_table[m%8]; leftMotor_out&=0xf0;

leftMotor_out|=Motor_f_table[m%8]; for(n=2000;n>0;n--); } }

void qj_int(void) {

// P3DIR =0xff; //P3口接数码管 P1DIR =0xf7; //P1口低4位接传感器 //P4DIR =0Xff; //P4选通 }

void Motorset(uint mode,uchar dir,uchar speed) {

bu_count=mode;

if(dir==0) //这个方向,只是小车此时此刻,及将来片刻的运动

方向;

run_dir=0; if(dir==1)

run_dir=1;

switch(speed) {

case 1: speed_set=30;break; //慢 case 2: speed_set=20;break; //中 case 3: speed_set=10;break; //快 } }

void Motorset_1(uint mode,uchar dir,uchar speed) {

bu_count_1=mode;

if(dir==0) //这个方向,只是小车此时此刻,及将来片刻的运动方向;

run_dir_1=1; if(dir==1)

run_dir_1=0;

switch(speed) {

case 1: speed_set_1=30;break; //慢 case 2: speed_set_1=20;break; //中 case 3: speed_set_1=10;break; //快 } }

void car_direction_forward(void) {

if(((hongwai_IN&BIT0)!=BIT0)||((hongwai_IN&BIT1)!=BIT1)) //偏离位置 {

if((hongwai_IN&BIT0)==BIT0) //左前方传感器接P3.2 {

Motorset_1(200,0,2); Motorset(200,0,1); }

if((hongwai_IN&BIT1)==BIT1) //右前方传感器接P3.3

{

Motorset_1(200,0,1); //右边的快点; Motorset(200,0,2); } }

else //未偏离位置 {

Motorset_1(200,0,2); Motorset(200,0,2); } }

void delay(uint q) {

uint i,j;

for(i=10000;i>0;i--) for(j=q;j>0;j--); }

#pragma vector = TIMERA0_VECTOR //ccr0中断服务 __interrupt void ta0_isr(void) {

count++; count_1++;

if(count_1==speed_set_1) {

count_1=0;

if(bu_count_1) //连续模式,走bu_count这么多步; {

bu_count_1--; if(run_dir_1==0) n++; else n--;

leftMotor_out&=0xf0;

leftMotor_out|=Motor_table[n%8]; } else { ; } }

if(count==speed_set) {

count=0;

if(bu_count) //连续模式,走bu_count这么多步; {

bu_count--; if(run_dir==0) m++; else m--;

rightMotor_out&=0xf0;

rightMotor_out|=Motor_table[m%8]; } else { ; } } }

本文来源:https://www.bwwdw.com/article/btpp.html

Top