由图可知,单片机每次用P0口发送3个字节的数据(N1、N2分别为速度和方向控制字,N3为和校验字节),当CPLD检测到EN从高到低的跳变表示传进数据开始。每个字节的有效数据出现在CLK的上升沿。ACK为CPLD的应答信号。当CPLD接收完数据后进行和校验.如果不对则把ACK拉高。单片机若检测到ACK为高电平则重新开始送数的过程。CPLD接收到正确的数据后就把它转换成步进电机的物理运动。直到接收到新的控制信息。我们用VHDL语言编程,并选择EPM7128SLC84-15作为目标器件进行时序仿真和硬件测试。程序的框图如下:
EN:系统使能信号。
CPLD_CLK:系统时钟信号。
N1:速度控制信号。
N2:方向控制信号。
系统时钟CPLD_CLK在速度控制信号N1的控制下得到脉冲分配器(状态机)的输入时钟,此时钟的频率决定控制逻辑输出的频率从而(在允许的范围内)控制电机的转速。EN为高电平时系统使能开始正常运转。N1为01H代表电机正转,00H代表电机反转。
程序的脉冲分配器部分采用状态机的方法编写。状态机是纯硬件数字系统中的顺序控制电路,在状态机的运行方式上类似于控制灵活方便的CPU,而在运行速度和工作可靠性方面都优于CPU。
状态机部分的VHDL代码如下:
PROCESS(C_ST,EN,N1,BCLK)
BEGIN
IF RISING_EDGE(BCLK) THEN C_ST<=N_ST;
IF EN='1' THEN
CASE C_ST IS
WHEN ST0=> IF N1="00000000" THEN
N_ST<=ST1; ELSE N_ST<=ST7;END IF;
CON_OUT<="1000";
WHEN ST1=> IF N1="00000000" THEN
N_ST<=ST2; ELSE N_ST<=ST0;END IF;
CON_OUT<="1100";
WHEN ST2=> IF N1="00000000" THEN
N_ST<=ST3;ELSE N_ST<=ST1;END IF;
CON_OUT<="0100";
WHEN ST3=> IF N1="00000000" THEN
N_ST<=ST4;ELSE N_ST<=ST2;END IF;
CON_OUT<;"0110";
WHEN ST4=> IF N1="00000000" THEN
N_ST<=ST5;ELSE N_ST<=ST3;END IF;
CON_OUT<="0010";
WHEN ST5=> IF N1="00000000" THEN
N_ST<=ST6; ELSE N_ST<=ST4;END IF;
CON_OUT<="0011";
WHEN ST6=> IF N1="00000000" THEN
N_ST<=ST7;ELSE N_ST<=ST5;END IF;
CON_OUT<="0001";
WHEN ST7=> IF N1="00000000" THEN
N_ST<=ST0; ELSE N_ST<=ST6;END IF;
CON_OUT<="1001";
WHEN OTHERS=> N_ST<=ST0;
CON_OUT<="0000";
END CASE;
END IF;
END IF;
END PROGESS;
2.4 结论
实践表明.这样的控制方法切实可行。在整个工作过程中,单片机运行稳定.电机能够根据情况完成正常的正转反转,加速减速。
3 结语
单片机是一种非常传统的智能控制器件,无论是智能家电还是消费类产品都有它的身影。CPLD器件在各种场合的应用也越来越广泛。两者有各自的优缺点。单片机控制功能很强,能完成复杂的数学运算.但是稳定性稍差。CPLD运行速度快。程序不会跑飞。适合产生各种复杂组合逻辑和时序逻辑。可以灵活的定义各个引脚的与外围电路连接的电气特性等。使用单片机和CPLD联合控制步进电机只是不同类型的器件协同完成同一任务在实际应用中的一个例子。实践证明这种方法是可取的。