采用Microchip PIC16可配置逻辑块实现的步进电机驱动

摘要:

本步进电机项目展示了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 直流电源混接。

:warning: 图1可见面包板上层轨道直接连接12V直流电。切勿将PIC引脚连接至此轨道。否则将导致PIC芯片烧毁。

笔者亲历过这种情况,可以明确告诉您烧毁过程极其迅速。当PIC芯片炸裂,电脑USB端口烧毁时,情况只会变得更糟。这是你永生难忘的昂贵教训。

技术提示 :Microchip的可配置逻辑块(CLB)容易与PIC的可配置逻辑单元(CLC)混淆。这可以理解,因为两者都提供数字逻辑功能,且都存在于特定的PIC16系列成员中。

从相对规模和功能角度理解PIC16数字逻辑外设会很有帮助:

小型逻辑CLC入门演示如何将CLC配置为经典555定时器。

大型逻辑CLB入门演示种子项目。稍后我们将介绍步进电机示例。

复现实验所需部件

图1所示的步进电机演示使用以下组件构建(核心部件附有DigiKey链接):

电路搭建

开始搭建前务必阅读先决条件文章。这将建立基准线以简化搭建和故障排除。之后你搭建电路应该不会有问题。参考图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工具进行对比。

相关文章

若您喜欢本文,这些相关文章可能对您有所助益: