用FPGA给玩具小车装个大脑:手把手教你用Verilog和Quartus II实现PWM直流电机调速

发布时间:2026/6/12 21:17:11

用FPGA给玩具小车装个大脑:手把手教你用Verilog和Quartus II实现PWM直流电机调速 用FPGA给玩具小车装个大脑手把手教你用Verilog和Quartus II实现PWM直流电机调速周末整理房间时翻出一台尘封多年的玩具小车。看着它呆板的前进后退突然萌生一个想法能否用FPGA给它装上智能大脑实现更灵活的速度控制和转向这个看似简单的改造项目实际上融合了数字电路设计、电机控制和嵌入式系统三大技术领域。本文将带你从零开始用Verilog语言和Quartus II工具链为普通玩具小车打造一个可编程的电机驱动核心。与传统单片机方案相比FPGA的并行处理特性可以带来更精准的PWM控制响应延迟可降低到纳秒级。我们使用的Altera Cyclone IV开发板成本不到200元配合L298N电机驱动模块就能构建完整的控制系统。下面这个表格对比了三种常见控制方案的特性特性FPGA方案Arduino方案专用驱动IC方案响应延迟10-100ns10-100μs1-10μs最大PWM频率1-50MHz500Hz-20kHz5-50kHz占空比分辨率16位8-10位8-12位多电机同步控制能力优秀一般有限1. 硬件准备与系统架构1.1 所需材料清单改造项目需要以下硬件组件FPGA开发板推荐Cyclone IV EP4CE6L298N电机驱动模块直流减速电机玩具车原装电机即可锂电池组7.4V按键开关方向控制用电位器速度调节用注意FPGA的IO口驱动能力有限必须通过电机驱动模块连接直接连接可能损坏芯片。1.2 系统架构设计整个控制系统采用分层设计用户输入层包括方向按键和速度旋钮FPGA控制核心时钟分频模块PWM生成器方向控制逻辑功率驱动层L298N H桥电路执行层直流电机硬件连接示意图如下FPGA开发板 ├── GPIO1 → L298N IN1 ├── GPIO2 → L298N IN2 ├── GPIO3 → L298N EN1 ├── 按键1 → 方向控制 └── 电位器 → 速度调节2. Verilog核心模块设计2.1 时钟分频模块由于FPGA主时钟通常在50MHz左右而PWM控制只需要1-20kHz频率我们需要先设计分频器module clk_divider( input clk_50MHz, output reg clk_1kHz ); reg [15:0] counter; always (posedge clk_50MHz) begin if(counter 24999) begin // 50MHz/(25000*2)1kHz clk_1kHz ~clk_1kHz; counter 0; end else begin counter counter 1; end end endmodule2.2 可调PWM生成器这是整个系统的核心通过改变占空比调节电机速度module pwm_generator( input clk, input [7:0] duty_cycle, output reg pwm_out ); reg [7:0] counter; always (posedge clk) begin counter counter 1; pwm_out (counter duty_cycle) ? 1b1 : 1b0; end endmodule2.3 方向控制逻辑通过两个GPIO的高低电平组合控制电机转向module direction_ctl( input clk, input dir_btn, output reg motor_in1, output reg motor_in2 ); always (posedge clk) begin if(dir_btn) begin // 正向 motor_in1 1b1; motor_in2 1b0; end else begin // 反向 motor_in1 1b0; motor_in2 1b1; end end endmodule3. Quartus II工程实现3.1 工程创建与配置启动Quartus II选择File → New Project Wizard选择Cyclone IV EP4CE6器件添加上述Verilog模块文件配置未使用引脚为As inputs, tri-stated3.2 引脚分配技巧在Assignment Editor中设置时钟引脚 → 全局时钟专用引脚PWM输出 → 普通IO口方向控制 → 带消抖功能的专用输入引脚推荐引脚分配方案信号名称FPGA引脚号板载标识clk_50MHzPIN_23CLK0pwm_outPIN_45GPIO0motor_in1PIN_46GPIO1motor_in2PIN_47GPIO2dir_btnPIN_12KEY04. 系统调试与性能优化4.1 常见问题排查电机不转检查L298N使能端是否接高电平方向控制相反交换IN1和IN2接线PWM频率过高调整分频系数推荐1-5kHz占空比响应不线性检查电位器ADC采样代码4.2 高级优化技巧动态PWM频率调整// 根据速度需求自动调整PWM频率 if(duty_cycle 50) pwm_freq 1kHz; else if(duty_cycle 150) pwm_freq 5kHz; else pwm_freq 10kHz;软启动功能// 上电时缓慢增加占空比 always (posedge clk) begin if(startup_counter 255) begin duty_cycle startup_counter; startup_counter startup_counter 1; end end刹车能量回收// 快速制动时短接电机两端 if(brake_signal) begin motor_in1 1b1; motor_in2 1b1; // 形成能耗回路 end5. 扩展应用智能小车系统基础功能实现后可以进一步扩展增加超声波模块实现自动避障添加蓝牙模块实现手机遥控集成编码器实现闭环速度控制一个典型的避障控制逻辑实现module obstacle_avoid( input clk, input [7:0] distance, output reg [1:0] action ); parameter SAFE_DIST 30; // 30cm always (posedge clk) begin if(distance SAFE_DIST) begin action 2b01; // 右转 end else begin action 2b10; // 直行 end end endmodule实际测试中发现当PWM频率设置在3kHz左右时电机运行最平稳且啸叫声最小。对于需要精确控制的场景建议增加编码器反馈形成闭环控制系统。

相关新闻