电动车跷跷板设计以凌阳16位单片机SPCE061A为控制核心.docx
《电动车跷跷板设计以凌阳16位单片机SPCE061A为控制核心.docx》由会员分享,可在线阅读,更多相关《电动车跷跷板设计以凌阳16位单片机SPCE061A为控制核心.docx(14页珍藏版)》请在冰豆网上搜索。
![电动车跷跷板设计以凌阳16位单片机SPCE061A为控制核心.docx](https://file1.bdocx.com/fileroot1/2023-1/10/bd0ad5bb-fd88-4681-9a74-eddced05900a/bd0ad5bb-fd88-4681-9a74-eddced05900a1.gif)
电动车跷跷板设计以凌阳16位单片机SPCE061A为控制核心
摘要:
本系统以凌阳16位单片机SPCE061A为控制核心,包括电机驱动模块,寻迹模块,角度测量模块,时间显示模块和无线通信模块五部分。
铝合金自制车体采用L298驱动直流减速电机实现行进,光电传感器结合寻迹算法完成电动车寻线功能。
利用角度传感器的测量量作为被控量,实现电动车的闭环反馈控制,根据模糊PID控制算法找到平衡点,这是本系统的核心部分。
同时PC显示模块和无线通信模块实现了良好的人机交互界面。
关键词:
角度传感器;光电传感器;无线通信
ABSTRCT:
Thisintelligentelectriccarisbasedon16bitssinglechip–SPCE061A.Thebodyisiscapableofboardingtheseesawandfindingthebalancepointusingtheanglesensorandreturning,andshowtime.Thesystemalsoprovidescommunicationchannelsbetweentwosingle-chipsbythewirelessmoduleandbetweensingle-chipandPCbyUART,withdynamicinterfaceonPCshowingthestateofcar.
Keywords:
Anglesensor;PhotoSensor;Wirelesstransmission
一、系统方案
1.1、实现方法
我们设计并制作了一个智能电动小车。
可以寻迹上翘翘板和沿板行使,并找到跷跷板的水平位置。
当跷跷板一端放有配重时,小车能自动行驶到与之相对的平衡位置,并随配重的移动中心调解重心。
1.2、方案论证
为了较好实现在小车的功能,我们设计了几种方案并分别进行了论证。
1.2.1、主控制器选择
方案1:
采用可编程器件CPLD作为控制器。
CPLD可以实现各种复杂的逻辑功能、规模大、密度小、体积小、稳定性高、IO资源丰富,易于进行功能扩展。
采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。
方案2:
采用凌阳公司的16位单片机,它是16位控制器,具有体积小、驱动能力高、易扩展、可靠性高、功耗低、结构简单、终端处理能力强等特点。
我们最终选用方案2。
1.2.2、驱动模块
方案1:
采用步进电机作为该系统的驱动电机。
由于其转过的角度可以精确的定位,可以实现小车前进路程和位置的精确定位。
虽然采用步进电机有诸多优点,步进电机的输出力矩较低,随转速的升高而下降,且在较高转速时会急剧下降,其转速较低,不适用于小车等有一定速度要求的系统。
方案2:
采用直流减速电机。
直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便。
由于其内部由高速电动机提供原始动力,带动变速(减速)齿轮组,可以产生大扭力。
能够较好的满足系统的要求。
我们最终选用方案2。
1.2.3、微调模块
方案1:
采用直流减速电机驱动小车,同时在小车上安装一位置可调重物,然后由一舵机来控制其运动,调节小车一侧的力矩。
可以在小车静止时微调平衡,提高了效率。
但是,可调重物的质量有一定限制,使用舵机调解,使小车重心改变不大,限制了停车点。
方案2:
采用直流减速电机驱动小车,同时在小车上使用步进电机带动齿带前后移动,使小车重心改变。
我们最终选用方案2。
1.2.4、寻迹模块
用红外发射管和接收管自己制作光电对管寻迹传感器。
红外发射管发出红外线,当发出的红外线照射到白色的平面后反射,若红外接收管能接收到反射回的光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电平。
1.2.5、车载显示模块
用8位数码管显示小车行驶时间。
数码管显示亮度高,远程观测也比较醒目。
数码管的驱动是用CH451实现的。
CH451内置RC振荡电路,可以动态驱动8位数码管或者64位LED,具有BCD译码、闪烁、移位等功能。
CH451可以通过级联的串行接口与单片机交换数据,因此占用单片机的IO口较少。
1.2.6、平衡提示模块
我们采用HYDA蜂鸣器,在小车达到平衡时蜂鸣进行平衡提示。
1.2.7、语音播报模块
我们使用凌阳精简板开发板61B板,实现语音播报功能。
1.3、系统设计
为实现题目要求和扩展功能,我们设计的系统如下:
[1]采用直流减速电机作为小车的驱动电机;
[2]用步进电机细分驱动的微调找到在跷跷板上的平衡位置;
[3]采用红外对管进行反射式探测实现小车的寻迹功能;
[4]运用角度传感器的反馈信号寻找平衡位置;
[5]用数码管显示小车行驶时间;
[6]采用无线收发模块进行单片机之间的通信;
[7]使用电平转换接口,在上位机上动态显示小车的状态。
1.4、结构框图
图1系统框图
二、理论分析与计算
2.1、测量与控制方法
小车在翘翘板上寻找平衡点的过程是一个二阶欠阻尼震荡过程,所以我们采用增量数字的算法(PID算法)。
为了满足小车能够找到平衡点,我们设计用了变速积分的思想,通过改变积分项的累加速度,使其与偏差大小相对应,偏差越大,积分越慢,反之则越快.为此我们设计了变速积分系数,它是偏差绝对值(|err|)函数.当偏差越大,变速积分系数越小,当偏差越小,变速积分系数越大,从而达到题目要求。
2.2、理论计算
设配重质量为Mpkg,重心距离转轴Spm,距板面hpm;小车重为M1kg,重心距板面h1m;微调物为Mmkg,重心距板面hmm,旋转半径为Rm。
小车的最终理论平衡点距转轴S1的计算式为:
Mp*Sp=(M1+Mm)*S1,由此可得S1=Mp*Sp/(M1+Mm)。
但由于跷跷板存在倾角Ø,使得物体重心偏移。
从而可得S’=[Mp*Sp+(M1*h1+Mmhm-Mp*hp)*tanØ]/(M1+Mm)。
到达该点后,小车再稍向前移动,跷跷板开始振荡。
显然此时小车已经超过了理论平衡点,故应后退以寻求平衡。
在这里,再加上车载微调块的移动来微调至最终的平衡状态。
三、电路与程序设计
3.1、检测与驱动电路设计
3.1.1、主控制器:
我们最终选用了既能较好的满足题目要求,又能方便在线仿真和下载程序凌阳16位单片机SPCE061A。
(最小系统图见附图1)
3.1.2、驱动模块:
采用专用芯片L298N作为电机驱动芯片。
(电路图见附图2)
3.1.3、微调模块:
我们采用步进电机进行中心的微调。
(电路图见附图3)。
3.1.4、寻迹模块:
用红外对管制作光电对管寻迹传感器。
(电路图见附图4)
3.1.5、车载显示模块用8位数码管显示小车行驶时间用CH451实现驱动。
(电路图见附图5)
3.1.6、平衡提示模块。
(电路图见附图6)
3.1.7、角度传感器。
(电路图见附图7)
3.2、总体电路图
3.3、软件设计与工作流程图
软件设计采用模块化设计方法,每一个模块对应一个文件,各模块之间耦合度较小,比较容易修改维护。
软件设计主函数见附录3。
主程序流程图如图2。
四、结果分析
4.1创新发挥
我们在小车实现所有基本功能和扩展功能的基础上,进行了创新发挥。
为小车添加了无线通信功能和上位机动态显示界面。
方便了人对小车的观察和控制。
在小车运动控制系统的设计中,为了能够将过程和状态通过PC机端上进行显示,我们运用了串口进行了下位机(单片机)与上位机(PC机)的通信。
数据通过无线芯片NRF2401传输给下位机。
PC机动态显示小车的运动状态。
该设计具有人机界面友好的优点,完成了该系统的创新功能。
图2、工作流程图
4.2结果分析
表1基本功能时间测试
由A到C
显示时间(s)
第一次
第二次
第三次
5
6
5
在C点达到平衡
平衡倾角值
平衡所需时间(s)
第一次
第二次
第三次
1.8度
1.1度
1.3度
55
48
46
由C到B
显示时间(s)
第一次
第二次
第三次
6
5
5
由B到A
显示时间(s)
第一次
第二次
第三次
11
11
10
表2配重平衡测试
第一次
第二次
第三次
能否自动驶上跷跷板
能
能
能
第一次平衡倾角
1.6
1.5
1.2
第二次平衡倾角
1.4
1.4
1.6
表3时间测试
第一次
第二次
第三次
登上跷跷板时间
7
4
5
第一次平衡时间
43
41
39
第二次平衡时间
45
40
42
经过反复调试与测试,我们的电动车顺利完成了所有基本功能和扩展功能,并在此基础上有所创新。
我们的小车不仅能够实现驶上跷跷板、寻迹、找平衡点的功能,在此基础上又增加了无线模块和上位机部分来完成小车的运动过程的动态监控显示.而且还增加语音功能来使我们的设计更加具有人性化。
经过4天3夜的努力,我们遇到了许多困难,这些困难使我们意识到成功很大部分决定于细节。
由于制作时间太紧张了,焊接电路得不到保证.我们只是制作了小部分的PCB板。
在这个作品制作的过程中,我们深刻的体会到了共同协作和团队精神的重要性,提高了自己解决问题的能力。
参考文献
[1]黄智伟等,全国大学生电子设计竞赛训练教程.电子工业出版社,2005
[2]谭浩强,C程序设计(第二版).清华大学出版社,2000
[3]谭思亮,邹思群,visualc++串口通讯工程开发实例导航人民邮电出版社,2003
[4]刘海成,秦进平等,MCU-DSP型单片机原理与应用北京航空航天大学出版社,2005
[5]戴佳,戴卫恒,51单片机C语言应用程序设计实例精讲电子工业出版社,2007
[6]陈小忠,黄宁,赵小侠,单片机接口技术实用子程序人民邮电出版社,2006
[7]谢自美,电子线路设计.实验.测试(第二版)华中科技大学出版社,2000
附录1、电路图
附图1凌阳16位单片机SPCE061A最小系统
附图2、L298N电机驱动
附图3、L298N步进电机驱动
附图4光电对管寻迹传感器
附图5、CH451实现驱动8位数码管显示
附图6蜂鸣器平衡提示模块
附图7角度传感器接线图
附图8、无线通信模块
附录2、主函数
#include
intmain(void)
{
intstate,x,y,speed,old_speed,ajust,speed_signal,ir,old_ir,timer_flag;
tframeframe;
io_init(0x0fff,0xffff,0,0x7f00,0xffff,0);
BUZZER=1;
nrf2401_init(ADDR_CAR);
nrf2401_mode(NRF2401_RECEIVE);
nrf2401_dest(ADDR_CONSOLE);
zct245al_init();
CH451_init();
ajust=old_ir=timer_flag=0;
*P_INT_Ctrl_New=C_IRQ5_2Hz;
irq_on();
state=ST_START;/*小车状态为开始状态*/
nrf2401_mode(NRF2401_SEND);/*更改无线模块为发射状态*/
nrf2401_dest(ADDR_CONSOLE);
reset_time();
speed=old_speed=pid_init(0,y);
dc_set_speed(LEFT,speed);
dc_set_speed(RIGHT,speed);
dc_start();
state=ST_AJUST;/*调整平衡状态*/
/*发送状态到控制台*/
frame.syn=SYN;
frame.type=DATA_STATE;
frame.data=ST_AJUST;
nrf2401_send((char*)(&frame),4);
for(;;wdclr())
{
ir=IR_IN;/*检测红外对管*/
if(ir!
=old_ir)/*两次检测值不一样,需要重新计算*/
{
old_ir=ir;
if(ir&LEFTFRONT)/*左前方检测到黑线,小车左偏*/
ajust=5;/*右转*/
elseif(ir&RIGHTFRONT)/*右偏*/
ajust=-5;/*左转*/
speed_signal=1;
}
if(zct245al_signal)/*采集到角度数据*/
{
zct245al_signal=0;
zct245al_get(&x,&y);/*获取倾角数据*/
if((!
timer_flag)&&/*未进入平衡计时*/
(y>-10)&&(y<10))/*检测到角度足够小,假定小车已平衡*/
{
timer(5);/*设置定时器*/
timer_flag=1;/*定时器已启动标志*/
}
elseif((y<-20)||(y>20))/*未平衡*/
timer_flag=0;
speed=pid_ctrl(y);/*PID算法调整基准速度*/
if(speed!
=old_speed)
{
old_speed=0;
speed_signal=1;
}
if(time_signal)/*刷新数码管显示时间*/
{
inttime;
BUZZER=0;
time_signal=0;
time=get_time();
set_led(1,time%10);
set_led(0,time/10%10);
delay(500);
BUZZER=1;
}
if(timer_signal)/*定时器触发,已保持平衡足够时间*/
{
timer_signal=0;
break;/*进入下一状态*/
}
}
BUZZER=0;/*启动蜂鸣器*/
delay(1000);
BUZZER=1;
state=ST_FORWARD;/*前进至B点状态*/
frame.type=DATA_STATE;
frame.data=ST_FORWARD;
nrf2401_send((char*)(&frame),4);
reset_time();
state=ST_BACKWARD;/*退回A点状态*/
frame.type=DATA_STATE;
frame.data=ST_BACKWARD;
nrf2401_send((char*)(&frame),4);
reset_time();
/*停车状态*/
dc_stop();
irq_off();
state=ST_STOP;
frame.type=DATA_STATE;
frame.data=ST_STOP;
nrf2401_send((char*)(&frame),4);
nrf2401_mode(NRF2401_RECEIVE);
reset_time();
for(;;wdclr())
return0;
}