- 前语
传统智能小车,特别是嵌入式体系,一般都是依据单片机或许ARM的嵌入式体系,基本上都由软件体系和硬件体系组成的,硬件体系方面,跟传统的建立硬件环境相同,只能做相对裁剪和功用拓宽,可是,本项意图课题是经过xilinx的FPGA开发板建立嵌入式的硬件环境,从最小体系到IP核的添加,都是依据需求进行拓宽的,完成1对1的拓宽,不浪费资源,并且依据FPGA的嵌入式体系的最大有长处是,既有PFGA的并行履行功率,又有嵌入式软件的逻辑进程剖析操控。
- 整体计划规划
图1 体系硬件结构框图
运用Spartan-6的XC6SLX16 CSQ234 作为主操控器,传感器运用摄像头ov6620图画收集模块(兼测途径),运用超声波模块(HCSR04)测距,因为两者具有互补特性,所以能够很好的操控小车的运转状况,选用含糊算法核算出电机所需求的转速,和舵机的转角,然后完成稳步渐进。
- 1主操控器的挑选
解决计划:选用可编程逻辑器件FPGA作为操控器。FPGA能够完成杂乱的逻辑功用,规划大,密度高,体积小,安稳性高,IO资源丰富,易于外围功用扩展,跟着FPGA的本钱逐渐下降,并且依据FPGA的嵌入式体系的建立也成为可行,既有传统嵌入式的软件灵活性,也有FPGA的并行快速履行功率。
综上所述,咱们选用的Nexys3 Spartan-6作为体系的主操控器。
- 2电源稳压芯片的挑选
本体系中,Spartan-6主操控器。
解决计划:因为直流电机的功耗大,决议选用7.2V,2000mAh的电池为供电源,选用LM25xx系列单片集成开关电源作为降压芯片,能够供给大功率的输出,转化功率高,功用安稳。
- 3电机驱动挑选
解决计划:选用BTS7960B建立全桥驱动,能够满意大功率的输出,别离驱动两个电机。
驱动模块电路
- 摄像头模块的挑选
计划:选用数字摄像头ov6620,操控简略,价格适宜,信号安稳。
- 体系硬件规划
- 1车体模型
什物如下图所示。
图2 车体实践模型
摄像头寻觅黑线,指引小车循迹,超声波测距,指引小车自控速度。
- 2电源
其原理图如图三所示:
7.2V的输入,安稳输出5V
- 3Ov6620摄像头传感器模块
OV6620 时序剖析
OV6620的同步信号时序如下:场同步信号VSYN 为两个正脉冲之间扫描一帧的守时,即
完好的一帧图画在两个正脉冲之间;行同步信号HREF 扫描该帧图画中各行像素的守时,
即高电平时为扫描一行像素的有用时刻;像素同步信号 PCLK为读取有用像素值供给同步信
号,高电平时输出有用图画数据。下图为OV6620 VSYN、HREF、PCLK三个同步信号之
间的时序联系:
VYNSC是判别是否一幅图画开端,周期是 20ms, 其间高电平继续时刻很短;HREF 是判
断是否一行图画的开端,周期是 63us 左右,其间高电平继续时刻为 40US,低电平继续
时刻 23US,那么咱们对照时序图能够核算一下 OV6620 的分辨率:20ms/63us=317,
当然实践上没有这么多,消隐和无效信号去掉之后只要 292行;有用的灰度数据是内行中
断之后的上升沿内,所以不要内行中断后的 23US 后收集。核算一下一行 OV6620 有多
少个点: 40us/110ns=363, 消隐和无效信号去掉之后只要 356 个点。足以证明
OV6620的分辨率为 356*292。经过示波器调查,PCLK 的周期只要 150ns,按照单片
机的总线,底子无法捕捉到这个信号,此刻PCLK 的波形现已变为尖波,彻底没有意义捕捉
这个信号,收集图画时尽快地一个点一个点的取就行了。
- 4直流电机驱动
体系中选用了BTS7960B建立全桥驱动,能够满意大功率的输出,别离驱动两个电机。
BTS7960B 的芯片内部为一个半桥。INH引脚为高电平,使能BTS7960。IN引脚用于确认哪个MOSFET 导通。IN=1 且INH=1 时,高边MOSFET 导通,OUT 引脚输出高电平;IN=0 且INH=1 时,低边MOSFET 导通,OUT 引脚输出低电平。SR 引脚外接电阻的巨细,能够调理MOS管导通和关断的时刻,具有防电磁搅扰的功用。
3.5下图是由FPGA构建的最小嵌入式体系,是依据xilinx官方的EDK要求建立的。
最小体系
4体系软件规划
软件规划首要分为三部分,榜首部分是最小体系的建立(软件初始化),第二部分是外部硬件的驱动,第三部分是中心算法。
- 1最小体系的建立(软件初始化):
运用EDK东西,建立最小的嵌入式体系。
- 2外部硬件驱动:
外部硬件驱动,挑选以IP核的方式添加到最小体系向来,用硬件描绘言语编写驱动中心代码,然后软件经过寄存器驱动外部硬件。
- 3中心算法:
这部分是整个体系的中心,它的结构框图如下图所示:
图10 软件结构框图
5体系调试和测验
调试进程:
5.1硬件渠道的计划测验
在EDK规划中,能够新建测验代码,主动生成测验代码,经过串口打印验证成果。
5.2 超声波模块的运用
在添加IP核进程中,需求依据超声波的时序要求,用硬件描绘言语描绘驱动的进程。
process(Bus2IP_Clk,slv_reg1,the_end)
begin
if slv_reg1=x00000000 then
counter=x00000000;
chao_out = 0;
div_clk=0;
elsif rising_edge(Bus2IP_Clk) then
if the_end = 1 then
chao_out = 1;
counter=counter+1;
if(counter=x1F4) then
counter=x00000000;
chao_out = 0;
div_clk=1;
end if;
end if;
end if;
end process;
— implement slave model software accessible register(s) read mux
SLAVE_REG_READ_PROC : process( Bus2IP_Resetn,slv_reg_read_sel, slv_reg0, slv_reg1,Bus2IP_Clk,div_clk ) is
begin
case slv_reg_read_sel is
when 10 =>
if Bus2IP_Resetn = 0 then
timer_count = x00000000;
the_end = 0;
elsif div_clk=1 then
if slv_chao_in=1 then
the_end = 0;
timer_count = timer_count + 1;
else
slv_ip2bus_data = timer_count; –slv_reg0;
the_end = 1;
timer_count = x00000000;
end if;
else
slv_ip2bus_data = slv_reg0;
end if;
when 01 => slv_ip2bus_data = slv_reg1;
when others => slv_ip2bus_data = (others => 0);
end case;
end process SLAVE_REG_READ_PROC;
5.3 PWM模块的调试
因为需求两路的PWM来别离操作舵机和直流电机,一切PWM的调试时至关重要的。
代码如下:
int main()
{
unsigned long i,j;
//close PWM
PWM_IP_mWriteSlaveReg1(XPAR_PWM_IP_0_BASEADDR,0,0×00); //PWM0
PWM_IP_mWriteSlaveReg1(XPAR_PWM_IP_1_BASEADDR,0,0×00); //PWM1
for(i=0;i=99999;i++);
PWM_deal(0x2E);
while(1)
{
PWM_deal(0x2E);
delay(60);
PWM_deal(0x38);
delay(60);
PWM_deal(0x2E);
delay(60);
PWM_deal(0x24);
delay(60);
}
return 0;
}
void PWM_deal(unsigned char reg0)
{
//PWM0 舵机
//PWM 频率
PWM_IP_mWriteSlaveReg1(XPAR_PWM_IP_0_BASEADDR,0,0x1F4);
//PWM 占空比
PWM_IP_mWriteSlaveReg0(XPAR_PWM_IP_0_BASEADDR,0,reg0);
//PWM1 直流电机
PWM_IP_mWriteSlaveReg1(XPAR_PWM_IP_1_BASEADDR,0,0x1F4); //
PWM_IP_mWriteSlaveReg0(XPAR_PWM_IP_1_BASEADDR,0,reg0); //slv_reg0
}