摘要:
本步进电机项目展示了Microchip PIC16可配置逻辑块(CLB)的功能特性。该项目重点展示了PIC16F13145的Verilog设计能力。包含原理图与代码。
引言
本工程简报通过控制图1所示步进电机,演示PIC16可配置逻辑块(CLB)功能。
-
CLB架构独立于PIC16微控制器内核运行。
-
步进电机采用半步进控制方式。
-
通过方向按钮和使能按钮控制电机。
-
电机按用户编程设定的固定速度运行。
-
数字逻辑采用Verilog编码实现。这不是笔误——门级和Verilog风格的可编程逻辑现已成为PIC16编程的一部分。
CLB使我们能够整合并吸收通常分散在微控制器周围的胶合逻辑。从而实现更小尺寸、更精简的物料清单及更低的总成本。
可在此下载步进电机项目:Stepper.X.zip (596.1 KB)
预备知识
在前期文章中我们探讨过Microchip PIC16 CLB的入门种子项目。请先阅读该文章,其中包含I/O引脚配置、使用MPLAB MCC工具连接简单逻辑块等必备知识。
图 1 :演示项目中使用的步进电机驱动装置。
切勿将 3.3V 直流电源与 12V 直流电源混接。
图1可见面包板上层轨道直接连接12V直流电。切勿将PIC引脚连接至此轨道。否则将导致PIC芯片烧毁。
笔者亲历过这种情况,可以明确告诉您烧毁过程极其迅速。当PIC芯片炸裂,电脑USB端口烧毁时,情况只会变得更糟。这是你永生难忘的昂贵教训。
技术提示 :Microchip的可配置逻辑块(CLB)容易与PIC的可配置逻辑单元(CLC)混淆。这可以理解,因为两者都提供数字逻辑功能,且都存在于特定的PIC16系列成员中。
从相对规模和功能角度理解PIC16数字逻辑外设会很有帮助:
小型逻辑 :CLC入门演示如何将CLC配置为经典555定时器。
大型逻辑 :CLB入门演示种子项目。稍后我们将介绍步进电机示例。
复现实验所需部件
图1所示的步进电机演示使用以下组件构建(核心部件附有DigiKey链接):
-
Microchip EV06M52A Curiosity评估板(用于PIC16F13145微控制器)
-
电机绕组续流二极管
-
2N3904晶体管
-
每个晶体管基极串联1kΩ电阻
-
带电阻的LED(如本逻辑探头替代方案文章所述)
-
电源去耦电容(如1000μF 25VDC)
-
面包板、导线和跳线
-
未显示的12VDC电源
电路搭建
开始搭建前务必阅读先决条件文章。这将建立基准线以简化搭建和故障排除。之后你搭建电路应该不会有问题。参考图3原理图作为指导,并配合图1和图2中的照片。
图 2 :每个电机绕组两端都包含一个续流二极管。每个晶体管基极都串联了一个电阻。
技术提示 :别忘了在每个电机绕组上并联续流二极管。若未安装这些二极管,将产生高压尖峰导致2N3904晶体管损毁。图2中可清晰看到二极管连接在面包板电源轨上。
背景中可见晶体管基极限流电阻。
图 3 :步进电机项目原理图,采用分立NPN晶体管驱动电机。
为何本演示项目选用 Verilog ?
选择Verilog因其快速高效,相比门级电路更易调试。本例中,Verilog省去了为状态转移和输出逻辑构建卡诺图的步骤。原本需要数小时的工作现在只需几分钟。
同时,我也不希望剥夺学习者设计门级电路的学习机会。通过Verilog,我能快速展示最终结果,再建议您从头手动构建状态机。
个人观点 :Verilog能带来惊艳效果。25年前刚开始编程时,从未想过能用Verilog为PIC16编程。当然,那时我还在用汇编语言。
步进电机控制逻辑的 Verilog 编程
顶层控制逻辑描述见图4。包含两个部分:
-
状态 :此模块接收来自按钮的使能与方向输入信号。该模块维护控制半步序列的3位状态寄存器。代码见清单1。可见该模块作为3位升降计数器运行。
-
步进输出 :此模块接收3位状态信号,生成图5所示的输出信号。代码见清单2。该模块作为解码器运行,其核心操作通过查找表实现。
各模块独立构建以简化故障排查。状态模块最先构建完成。曾临时连接至PIC输出端,并通过LED验证了操作功能。
请注意步进电机项目消耗了数字逻辑结构约50%的资源。
图 4 :展示两个Verilog模块的顶层逻辑描述。
module State(
input CLK, enable, dir,
output step_val_2, step_val_1, step_val_0
);
reg [2:0] step_val;
assign {step_val_2, step_val_1, step_val_0} = step_val;
always @(posedge CLK) begin
if (enable) begin
if (dir == 1'b0) begin
step_val <= step_val + 3'b001; // forward
end else begin
step_val <= step_val - 3'b001; // reverse
end
end
end
endmodule
清单 1 :状态模块的Verilog代码。
图 5 :步进电机八离散输出端的半步驱动波形。
module StepperOutputs(
input CLK,
input step_val_2, step_val_1, step_val_0,
output out_3, out_2, out_1, out_0
);
reg [3:0] step_val;
assign {out_3, out_2, out_1, out_0} = step_val;
always @(posedge CLK) begin
case ({step_val_2, step_val_1, step_val_0})
3'b000: step_val <= 4'b1000;
3'b001: step_val <= 4'b1100;
3'b010: step_val <= 4'b0100;
3'b011: step_val <= 4'b0110;
3'b100: step_val <= 4'b0010;
3'b101: step_val <= 4'b0011;
3'b110: step_val <= 4'b0001;
3'b111: step_val <= 4'b1001;
default: step_val <= 4'b0000;
endcase
end
endmodule
清单 2 :步进输出模块的Verilog代码
结语
本步进电机项目是衡量PIC16 CLB性能的标尺。我们现在已清楚PIC16在功能、编程风格和易用性方面的表现。这一基准让我们能将PIC16与经典74系列逻辑器件及其他HDL工具进行对比。
相关文章
若您喜欢本文,这些相关文章可能对您有所助益:
-
MCC工具使用技巧:防止Microchip的MCC Melody覆盖您的代码
-
探索RC伺服机械臂中的结构体:什么是结构体?
-
观看PIC16工业应用实例:光幕拆解——Banner EZ-Screen LP内部探秘




