pwmout<='1';
else
pwmout<='0';
endif;endif;
endprocess;
endcond;
(2)原理图
PWM是建立在十进制加减计数器上的分频结构,在CLK上升沿从0~9的范围内计数个数小于A时输出高电平‘1’,否则输出‘0’,其相当于速度控制单元。
(3)仿真波形
2、主要控制模块
(1)原理和功能
根据小车前面的四个红外传感器所检测到的信号控制两端电机的转速。
1)当小车需要正常前进时,左侧两个电机的转速应等于右侧两个电机的转速。
2)当小车需要左小拐时,左侧两个电机的转速应略小于右侧两个电机的转速。
3)当小车需要左大拐时,左侧两个电机的转速应比右侧两个电机的转速小得多。
4)当小车需要右小拐时,左侧两个电机的转速应略大于右侧两个电机的转速。
5)当小车需要右大拐时,左侧两个电机的转速应比右侧两个电机的转速大得多。
6)当小车需要停止时,左侧两个电机的转速和右侧两个电机的转速应都为零。
(2)VHDL程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYctlIS
PORT(p1,p2,p3,p4:
INSTD_LOGIC;
temp1,temp2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDctl;
ARCHITECTUREbehaveOFctlIS
BEGIN
PROCESS(p1,p2,p3,p4)
VARIABLETEMP:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000";
BEGIN
TEMP:
=p1&p2&p3&p4;
IF(TEMP="0000")THEN
temp1<="1000";
temp2<="1000";
ELSIF(TEMP="0010")THEN
temp1<="1000";
temp2<="0011";
ELSIF(TEMP=("0001")ORTEMP=("0011"))THEN
temp1<="1001";
temp2<="0001";
ELSIF(TEMP="0100")THEN
temp1<="0011";
temp2<="1000";
ELSIF(TEMP=("1000")ORTEMP=("1100"))THEN
temp1<="0001";
temp2<="1001";
ELSE
temp1<="0000";
temp2<="0000";
ENDIF;
ENDPROCESS;
ENDbehave;
(3)原理图
P1~P4分别对应小车从左到右四个传感器,‘1’电平表示压线‘0’表示正常,若左轮压线则右轮车速大于左轮,即TEMP2>TEMP1,通过程序给定的TEMP数值可以控制左右轮的相对速度大小,即实现循迹转弯。
(4)仿真波形
6、CPLD控制模块的顶层电路图
1、原理图
输入端接传感器的输入电平,输出端结控制速度单元模块即PWM,L和R分别控制小车左右侧电机。
例如当P1P2P3P4=0100时,表示左轮压线且需要往左小拐弯,这时TEMP1=0011,TEMP2=1000。
反应在PWM的作用为:
输出R的占空比大于L的,即8/3倍,也就是R与L的平均电压比。
这样也就实现了右侧轮的平均功率大于左侧平均功率,实现拐小弯。
2、仿真波形
7、系统总装配图
8、实验结果(照片)
9、实验结果分析
由于这次小车行驶的轨道的宽度有限,所以在速度上不能太快,否则很容易因为惯性大而冲出黑色跑道。
而且从前面仿真波形来看,小车作出判断有一定的延时性,故我们设计的程序还有待进一步的改进。
经调整传感器的灵敏度以及程序参数的调整,小车最终实现了预期的目的即通过控制小车左右轮相对速度大小从而拐小弯拐大弯实现自动循迹。
10、调试中出现问题的解决
小车在转弯的地方总会冲出跑道,因此要不断的对程序进行修改,而在这程序的修改时,要不断的从小车上取下CPLD集成块,再把程序通过串口下载到集成块后又要再次插入,这个过程虽然简单,但每次都必须小心的拔出并插入,以免把集成块插反而被烧坏。
在调试刚开始的时候,我们在检测到直线时用了100%的占空比,而在转弯时则把相对应的占空比进行改变,以便让小车能在转弯的时候顺利通过而不至于冲出跑道,在多次的测试后小车终于能顺利的沿着跑道跑了。
11、改进意见及收获体会
1、改进意见
(1)最大的不足:
驱动模块控制前进方向的插条被固定为一定的高低电平,只能前进而不能实现后退,也就不能实现大转弯(即一侧轮前进一侧轮后退)。
(2)再好的电路都应该考虑干扰问题,在编写程序时,我们都是想当然的在理想环境下,始终没有考虑硬件造成的干扰的问题。
事后,我认为应该考虑干扰问题,在程序中加入延时,使问题解决。
2、收获体会
通过本次课程设计,我学到了很多。
首先是掌握了用MAX+PLUS2软件设计电路的较为熟练的应用。
从最开始的源程序的输入,到波形图的生成与仿真,再到生成gdf格式的原件,最后应用层次化设计电路的思想调出已生成的元器件搭建总的电路图并编译模拟,最后在下载到CPLD集成块。
虽然以前实验课教过MAX+PLUS2软件但远没达到实际应用的地步。
这是我最大的收获。
其次是认识到自己缺乏发现问题解决问题的能力,归根到底就是平时学习时想的少,自己动手少。
刚开始下载完程序,装上集成块后小车并不是按原定程序运行而是不转动,自己当时就不知道是哪地方出了问题,经过一番茫无目的排查后最终才确定原来锁定管脚时CLK输入管脚没有锁定!
重新下载程序小车可以运行并循迹。
但也有不足,最大的不足是我只成功的编了一部分程序,有一部分是借鉴的。
遗憾的是明明感觉自己可以编出来虽然会费一些精力,但我却没有每一部分都亲自编。
这也就失去了一次很好的提升自己编程能力的机会。
时间很富余但自己却没有完全利用起来。
今后做类似的课程设计一定会注意到这一点。
十二、器材
1、CPLDEPM7128SLC84-6
2、FPGAEPF10K10
3、只读存储器EPROM2732A
4、稳压降压模块
5、小车
6、L298驱动板
7、红外传感器
8、测速码盘
9、施密特触发器74LS14
10、A/D转换器ADC0804、ADC0809
11、D/A转换器DAC0832
12、振荡分频器CD4060
13、石英晶体(4M、2M、32768HZ)
14、万能板
15、微动开关、拨盘开关、继电器、LED(红、绿、蓝)、电阻、电容、二极管、三极管、光敏二、三极管、导线……等。
16、工具(镊子、剪刀、万用表、电烙铁……)
十三、使用仪器设备
1、稳压电源(±5V,±15V);
2、实验电路箱;
3、信号发生器;
4、示波器
5、数字万用表
6、PC机(装有MAX+PLUSII或QuartusII软件);
7、EDA编程系统实验箱等。
十四、参考文献
1、“模拟电子技术基础”和“数字电子技术基础”教材;
2、有关“电子技术课程设计指导书”;
3、“集成电路特性应用手册”;
4、EDA技术使用教程
5、VHDL数字系统设计