现在的运动操控器现已开展到了以专用芯片(ASIC)或FPGA作为中心处理部件的开放式运动操控器。这样的处理计划杰出的特色,是让运动操控的处理部分以独立的、硬件性方法打开,添加体系的功用和可靠性,然后有用地处理了以单纯的MCU或DSP体系的处理带宽约束,以及用户体系软件和运动操控软件稠浊性的问题。
业界也早已呈现了各种类型的运动操控专用芯片,虽然有较高的功用、功用,但一般都比较复杂,使得客户运用起来十分困难。
用户们常常需求一种简略运用的运动操控芯片与通用MCU/CPU结合起来的体系计划,用以面向更一般性的或中低端的运用场合。这样的计划里,运动操控芯片部分能够担任要害的马达操控信号产生功用,又能够具有较高的功用和其他的体系性接口资源(若是使用8253/8254之类的计数器,就显得绰绰有余,计数长度太短,且没有其他资源);而在MCU/CPU部分能够经过一些简略的操控指令完成对马达运动的操控,更多的资源用来处理体系界面或运用软件。
简略而言,便是需求一个计划有用地协调了运动操控体系的软硬件的分工,软件部分便利客户开发,硬件部分保证体系功用。
深圳市斯迈迪科技开展有限公司(Smarteer)推出的SM1000系列SOPC运动操控芯片便是上述需求的处理计划。它是在高功用系列运动操控FPGA/芯片—SM5000计划后,经过不断的技能堆集和商场调查后,特别为中低端商场运用推出的。
SM1000是一个简易的运动操控芯片系列,它供给长达32位的可编程计数和脉冲产生的功用,脉冲频率能够高达10M赫兹以上,一起在芯片内部添加了许多体系性的资源,比方:内置3-8译码器、地址锁存器、矩阵键盘扫描接口和通用I/O等。因为芯片是SOPC技能计划,因而还能够依据客户的详细需求做定向化的规划。
SM1000简易而又便利于客户运用,它面向更广泛、更一般的运动操控运用领域。使用它结合MCU/CPU能够快捷地组建成一个运动操控体系,尤其是一些嵌入式、体系集成的运用体系。
SM1000十分适合于独立多轴的马达操控场合,一起结合操控软件也能够十分灵敏地完成常见的加减速运动操控,甚至多轴联动操控。
以下是SM1000系列芯片技能特色和运用介绍。
一、SM1000芯片计划的技能指标
⑴ 输入时钟CLK频率最高到78MHz;
⑵ 1-4路32位计数器,可达计数规模为:1~ 2,147,483,647;
⑶ 1-4路32位直接脉冲分频器,可设置频率系数规模为:1~ 2,147,483,647;
⑷ 1-4路正/反向脉冲输出,可接成差分输出;
⑸ 1-4路正/反向脉冲输出有用指示,可接成差分输出;
⑹ 最高输出脉冲频率为:CLK/64(SM1001不同);
⑺ 其他功用:
a) 内置3-8译码器,输出7个附加片选信号;
b) 8通用输入+8通用输出;
c) 可接8×8矩阵键盘,直接读取按键编码/有用值;
d) 8位数据接口(内置地址锁存,能够直接接MCS51 CPU)。
二、SM1000系列标准
三、SM1000功用框图
图1. SM1000功用框图
1. 复位
2. 锁存
3. 总线
4. 2-4路计数器
5. 2-4路32位脉冲分频器
6. GPIO
7. 3-8译码器
8. 8×8矩阵键盘
四、功用引脚介绍
五、运用方向举例
1. 步进马达操控器
2. 轻纺设备:缝纫机/绣花机等
3. 机器手/臂
4. 空间座标丈量/定位体系
5. 经济型通用运动操控器
6. 钻孔、铣边设备
7. 其他
六、编程运用介绍
A、CPU接口
该芯片选用通用8051 8位地址/数据复用接口。因为芯片内置了地址锁存器,因而能够直接与8051单片机地址/数据总线相连,而不需求经过地址锁存器别离出地址和数据总线。别的,该芯片内置了一个3-8译码器,能够输出7个片选信号,以供用户扩展地址译码用。这样,极大地便利了用户根据8051单片机的运用体系规划。整个接口只需求14根线。包括:
a) 8根地址/数据总线:AD0~7
b) 3根片选线:CS1~3
c) 1根地址锁存答应线:ALE
d) 1根读答应线:RD_n
e) 1根写答应线:WR_n
输出7根片选线,地址区分见地址分配表。
B、地址分配
C、CPU读/写操作
读写脉冲计数器:
脉冲计数器的值能够用指令直接写,但要读出时,就有必要先用锁存脉冲计数器值指令,先锁存起来,再用指令直接读;如下所示。
写脉冲计数器操作格局:
a、(*地址)= 数据 ;
其间:地址=基地址+0+nn*16+mm; nn=(0~3)为通道号,mm=(0~3)为字节地址;
数据为8位字节数据。
读脉冲计数器操作格局:
a、(*锁存地址)= 恣意数据;
b、变量=(*读地址);
其间:锁存地址=基地址+10+nn*16; nn=(0~3)为通道号,10为锁存脉冲计数器地址;
锁存指令的数据为8位字节恣意数据,其值无意义。
读地址=基地址+0+mm; mm=(0~3)为字节地址;
留意:脉冲计数器长度为32位,答应全规模设置:0x00000000~0xFFFFFFFF。实践输出脉冲个数由下面公式给出:
脉冲个数=(脉冲计数器值+1)/2;
当脉冲计数器值为最大值0xFFFFFFFF时,答应最大脉冲个数为2,147,483,648。
当脉冲计数器值为最小值0x00000001时,答应最小脉冲个数为1。
其间,脉冲计数器值应该为奇数,如为偶数,则最终一个脉冲宽度很窄。输出脉冲为对应频率的方波。
写脉冲频率数据:
写脉冲频率数据操作格局:
a、(*地址)= 数据 ;
其间:地址=基地址+4+nn*16+mm; nn=(0~3)为通道号,mm=(0~3)为字节地址;
数据为8位字节数据。
32位状况:脉冲频率值长度为32位,答应设置规模为:0x00000001~0xFFFFFFFF。实践输出脉冲频率由下面公式给出:
当脉冲频率值0x00800000 时:
脉冲频率=(输入时钟频率/228)*脉冲频率值;
当脉冲频率值≥0x00800000 时:
脉冲频率=(输入时钟频率/(236+228)*脉冲频率值。
24位状况:脉冲频率值长度为24位,答应设置规模为:0x000001~0xFFFFFF。实践输出脉冲频率由下面公式给出:
当脉冲频率值0x00400000 时:
脉冲频率=(输入时钟频率/225)*脉冲频率值;
当脉冲频率值≥0x00400000 时:
脉冲频率=(输入时钟频率/(233+225)*脉冲频率值。
发动脉冲通道作业:
发动脉冲通道作业操作格局:
a、(*地址)= 数据 ;
其间:地址=基地址+8;
数据为8bit字节,作为答应发动标志,界说为:
D0—-为1时,答应通道1发动,为0时不发动;
D1—-为1时,答应通道2发动,为0时不发动;
D2—-为1时,答应通道3发动,为0时不发动;
D3—-为1时,答应通道4发动,为0时不发动。
中止脉冲通道作业:
中止脉冲通道作业操作格局:
a、(*地址)= 数据 ;
其间:地址=基地址+9;
数据为8bit字节,作为答应中止标志,界说为:
D0—-为1时,答应通道1中止,为0时不中止;
D1—-为1时,答应通道2中止,为0时不中止;
D2—-为1时,答应通道3中止,为0时不中止;
D3—-为1时,答应通道4中止,为0时不中止。
回读数据锁存:
CPU要读相应功用的数据,就有必要先锁存其数据,才能读;不然,只能读取前次锁存的数据。共有下面三种功用数据:
1. 脉冲计数器值:32bit;
2. 通用输进口值:8bit;
3. 按键编码值: 7bit;
CPU读数据是按8 bit字节读方法进行的,32 bit脉冲计数器值需求读4次,可按0~3恣意次序读取。8 bit值只能从地址0读取。格局为:
a、(*锁存地址)= 恣意数据;
b、变量=(*读地址);
其间:锁存地址和读地址,可拜见地址分配表3。
8/8位通用输入/输出口:
该芯片包括8位通用输进口和8位通用输出口。
8位通用输进口读指令为:
a、(*锁存地址)=恣意数据;
b、变量=(*读地址);
其间:锁存地址=基地址+12;
读地址=基地址+0;(一切读地址相同)
8位通用输出口写指令为:
a、(*写地址)= 数据;
其间:写地址=基地址+11;
写数据为8位字节数据。
8×8键盘接口:
该芯片支撑8X8矩阵键盘,主动扫描键盘,辨认按键键码,CPU经过接口可读取当时按键编码值。指令如下:
a、(*锁存地址)=恣意数据;
b、变量=(*读地址);
其间:锁存地址=基地址+28;
读地址=基地址+0;(一切读地址相同)
按键编码格局:
标志位:为1表明有键正按下,为0表明没有按键;
X:疏忽;
回读码:取0~7为当时按键所对应的行(或列)编码,特指输入线(KBC_0~7);
扫描码:取0~7为当时按键所对应的列(或行)编码;特指输出线(KBS_0~7);
七、编程示例
//A、地址常量界说:(设芯片基地址为0xe000)
#define MC_sys_CLK 32000000 //界说芯片作业频率
#define MC_CNT_WR_Base_Addr (volatile unsigned char *) 0xe000 //界说计数器值写基地址
#define MC_CNT_Latch_WR_Base_Addr (volatile unsigned char *) 0xe00A //界说计数器锁存写基地址
#define MC_FRQ_WR_Base_Addr (volatile unsigned char *) 0xe004 //界说频率值写基地址
#define MC_Startup_WR_Base_Addr (volatile unsigned char *) 0xe008 //界说发动写基地址
#define MC_Stop_WR_Base_Addr (volatile unsigned char *) 0xe009 //界说中止写基地址
#define MC_GPOut_WR_Base_Addr (volatile unsigned char *) 0xe00B //界说通用输出值写基地址
#define MC_GPIn_Latch_WR_Base_Addr (volatile unsigned char *) 0xe00C //界说通用输入值锁存写基地址
#define MC_KB_Latch_WR_Base_Addr (volatile unsigned char *) 0xe01C //界说键盘编码值锁存写基地址
#define MC_ RD_Base_Addr (volatile unsigned char *) 0xe000 //界说回读值读基地址
//B、子程序片:
//0、推迟子程序:芯片读/写指令间要求有必定的守时距离。
void delay(int n)
{ int i;
for( i = 0; i}
//1、写第n通道脉冲数值(有必要为奇数)
cnt = Np*2-1;
MC_CNT_WR_Base_Addr[n*16+0] = (char)((cnt>> 0) 0x0ff);delay(10);
MC_CNT_WR_Base_Addr[n*16+1] = (char)((cnt>> 8) 0x0ff); delay(10);
MC_CNT_WR_Base_Addr[n*16+2] = (char)((cnt>>16) 0x0ff); delay(10);
MC_CNT_WR_Base_Addr[n*16+3] = (char)((cnt>>24) 0x0ff);
//2、读第n通道脉冲数值
MC_CNT_Latch_WR_Base_Addr [n*16+0] = (char)0; delay(10); //锁存第n通道脉冲数值
Cnt = MC_ RD_Base_Addr [0]; delay(10); //回读数据0字节
Cnt |= MC_ RD_Base_Addr [1]8; delay(10); //回读数据1字节
Cnt |= MC_ RD_Base_Addr [2]16; delay(10); //回读数据2字节
Cnt |= MC_ RD_Base_Addr [3]24; //回读数据3字节
if( Cnt ==0xffffffff )
{ //第n通道脉冲输出完处理
}
//3、写第n通道脉冲频率值
Nfrq= frq_pulse*0x10000000/MC_sys_CLK; //留意整数运算溢出问题
MC_FRQ_WR_Base_Addr [n*16+0] = (char)((Nfrq>> 0) 0x0ff); delay(10);
MC_FRQ_WR_Base_Addr [n*16+1] = (char)((Nfrq>> 8) 0x0ff); delay(10);
MC_FRQ_WR_Base_Addr [n*16+2] = (char)((Nfrq>>16) 0x0ff); delay(10);
MC_FRQ_WR_Base_Addr [n*16+3] = (char)((Nfrq>>24) 0x0ff);
//4、发动多个通道脉冲作业
MC_Startup_WR_Base_Addr[0] = (F0 1) | ((F11)2) | ((F22)4 | ((F33)8) ;
//5、中止多个通道脉冲作业
MC_Stop_WR_Base_Addr[0] = (F0 1) | ((F11)2) | ((F22)4 | ((F33)8) ;
//6、8位通用输出口输出
MC_GPOut_WR_Base_Addr [0] = (char)(GPOut 0x0ff) ;
//7、8位通用输进口输入
MC_GPIn_Latch_WR_Base_Addr [0] = (char)0; delay(10); //锁存通用输进口值
GPIn_V = MC_ RD_Base_Addr [0] ;
//8、7位键盘按键编码输入
MC_KB_Latch_WR_Base_Addr [0] = (char)0; delay(10); //锁存按键编码值
KBCode = MC_ RD_Base_Addr [0] ;
if(KBCode 0x80)
{
//当时有按键按下处理
}
八、根据SM1000的运动操控体系框图
在图2计划里,除了1-4轴运动操控自身之外,在板上底子不需求译码器、锁存器之类的芯片,按键扫描电路也节省了不少MCU带宽开支,数字量通用输出/输入也添加了体系的操控便利性。
图2. 根据SM1000的运动操控体系框图