前言
用到的模块如图所示:需要的结合关键词去买就行
一、系统核心原理
测速原理
光电编码器通过光栅盘和光电传感器产生正交脉冲信号(A相、B相)。
电机码盘旋转时,光栅遮挡/透光产生周期性脉冲,脉冲频率与电机转速成正比。
通过测量脉冲频率或周期,结合机械传动比和车轮半径,计算车辆线速度。
里程计算原理
积分法:对实时速度进行时间积分 S = ∫v·dt。
脉冲累加法:每个编码器脉冲对应固定位移,总里程 S = (总脉冲数 × 轮胎周长) / 每转脉冲数(无累计误差)。
二、系统硬件组成
光电编码器与码盘
类型:增量式正交编码器(如1024 PPR)。
输出信号:
A/B相:相位差90°的方波,用于测速和辨向。
Z相(可选):每转一个脉冲,用于基准点校准。
安装位置:直接安装在电机输出轴或传动轴上。
FPGA核心板
主芯片:Xilinx Artix-7 / Intel Cyclone 10 等低功耗型号。
关键外设:
高速时钟(50MHz)用于精密计时。
外部EEPROM/Flash:存储标定参数(轮胎半径、传动比、PPR值)。
UART/CAN接口:与上位机通信。
信号调理电路
差分接收器(如AM26LV32):将编码器的RS422差分信号转换为FPGA可处理的单端信号。
施密特触发器:整形脉冲边沿,抑制噪声。
光耦隔离:隔离电机侧高压(12/24V)与FPGA低压电路(3.3V)。
仿真分析
代码展示
滤波代码
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2025/04/17 11:21:08
// Design Name:
// Module Name: signal_fir
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module signal_fir(
input sys_clk ,
input rst_n,
input TTL_signal,
output reg TTL_signal_fir
);
reg [31:0] BufferTTL_signal;
always @(posedge sys_clk or negedge rst_n)begin
if(!rst_n)begin
TTL_signal_fir<=1'b0;
end
else begin
if (BufferTTL_signal == 32'b11111111_11111111_11111111_11111111)begin
TTL_signal_fir<=1'b1;
end
else if (BufferTTL_signal == 32'b00000000_00000000_00000000_00000000)begin
TTL_signal_fir<=1'b0;
end
else begin
TTL_signal_fir<=TTL_signal_fir;
end
end
end
always @(posedge sys_clk or negedge rst_n)begin
if(!rst_n)begin
BufferTTL_signal<=32'b0;
end
else begin
BufferTTL_signal[31] <= BufferTTL_signal[30];
BufferTTL_signal[30] <= BufferTTL_signal[29];
BufferTTL_signal[29] <= BufferTTL_signal[28];
BufferTTL_signal[28] <= BufferTTL_signal[27];
BufferTTL_signal[27] <= BufferTTL_signal[26];
BufferTTL_signal[26] <= BufferTTL_signal[25];
BufferTTL_signal[25] <= BufferTTL_signal[24];
BufferTTL_signal[24] <= BufferTTL_signal[23];
BufferTTL_signal[23] <= BufferTTL_signal[22];
BufferTTL_signal[22] <= BufferTTL_signal[21];
BufferTTL_signal[21] <= BufferTTL_signal[20];
BufferTTL_signal[20] <= BufferTTL_signal[19];
BufferTTL_signal[19] <= BufferTTL_signal[18];
BufferTTL_signal[18] <= BufferTTL_signal[17];
BufferTTL_signal[17] <= BufferTTL_signal[16];
BufferTTL_signal[16] <= BufferTTL_signal[15];
BufferTTL_signal[15] <= BufferTTL_signal[14];
BufferTTL_signal[14] <= BufferTTL_signal[13];
BufferTTL_signal[13] <= BufferTTL_signal[12];
BufferTTL_signal[12] <= BufferTTL_signal[11];
BufferTTL_signal[11] <= BufferTTL_signal[10];
BufferTTL_signal[10] <= BufferTTL_signal[9];
BufferTTL_signal[9] <= BufferTTL_signal[8];
BufferTTL_signal[8] <= BufferTTL_signal[7];
BufferTTL_signal[7] <= BufferTTL_signal[6];
BufferTTL_signal[6] <= BufferTTL_signal[5];
BufferTTL_signal[5] <= BufferTTL_signal[4];
BufferTTL_signal[4] <= BufferTTL_signal[3];
BufferTTL_signal[3] <= BufferTTL_signal[2];
BufferTTL_signal[2] <= BufferTTL_signal[1];
BufferTTL_signal[1] <= BufferTTL_signal[0];
BufferTTL_signal[0] <= TTL_signal;
end
end
endmodule
视频展示
基于FPGA的车速检测与里程计算系统
总结
实际用起来有一个注意点,光电传感器获取数据信号毛刺比较多,我进行了一个简单滤波,最后达到了稳定效果。