backup[i][j] = KeySta[i][j]; //刷新前一次的备份值 } } } }
/* 按键扫描函数,需在定时中断中调用,推荐调用间隔1ms */ void KeyScan() {
unsigned char i;
static unsigned char keyout = 0; //矩阵按键扫描输出索引 static unsigned char keybuf[4][4] = { //矩阵按键扫描缓冲区 {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF} };
//将一行的4个按键值移入缓冲区
keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1; keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2; keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3; keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4; //消抖后更新按键状态
for (i=0; i<4; i++) //每行4个按键,所以循环4次 {
if ((keybuf[keyout][i] & 0x0F) == 0x00)
{ //连续4次扫描值为0,即4*4ms内都是按下状态时,可认为按键已稳定的按下
KeySta[keyout][i] = 0; }
else if ((keybuf[keyout][i] & 0x0F) == 0x0F)
{ //连续4次扫描值为1,即4*4ms内都是弹起状态时,可认为按键已稳定的弹起
KeySta[keyout][i] = 1; } }
//执行下一次的扫描输出
keyout++; //输出索引递增 keyout = keyout & 0x03; //索引值加到4即归零
switch (keyout) //根据索引,释放当前输出引脚,拉低下次的输出引脚 {
case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break;
} }
/* 电机转动控制函数 */ void TurnMotor() {
unsigned char tmp; //临时变量
static unsigned char index = 0; //节拍输出索引
unsigned char code BeatCode[8] = { //步进电机节拍对应的IO控制代码 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 };
if (beats != 0) //节拍数不为0则产生一个驱动节拍 {
if (beats > 0) //节拍数大于0时正转 {
index++; //正转时节拍输出索引递增 index = index & 0x07; //用&操作实现到8归零 beats--; //正转时节拍计数递减 }
else //节拍数小于0时反转 {
index--; //反转时节拍输出索引递减
index = index & 0x07; //用&操作同样可以实现到-1时归7 beats++; //反转时节拍计数递增 }
tmp = P1; //用tmp把P1口当前值暂存 tmp = tmp & 0xF0; //用&操作清零低4位
tmp = tmp | BeatCode[index]; //用|操作把节拍代码写到低4位
P1 = tmp; //把低4位的节拍代码和高4位的原值送回P1 }
else //节拍数为0则关闭电机所有的相 {
P1 = P1 | 0x0F; } }
/* T0中断服务函数,用于按键扫描与电机转动控制 */ void InterruptTimer0() interrupt 1 {
static bit div = 0;
TH0 = 0xFC; //重新加载初值 TL0 = 0x67;
KeyScan(); //执行按键扫描
//用一个静态bit变量实现二分频,即2ms定时,用于控制电机
div = ~div; if (div == 1)
{ delay(speed); TurnMotor(); } }
void delay(unsigned int i) { while(i--);
②实验结果:
我们借鉴了板子的内带按键、步进电机、定时器例程程序,重新进行编写,实现了步进电机的加减速控制和正反转控制,在学习板子的过程中,我们小组遇到的问题就是对C语言的不熟悉,起码有两年没有接触C语言程序了,程序的很多函数,语句不知道该怎么使用,一些C语言的规则也记得不太清了,在学习的过程中需要不断复习,上网查资料慢慢的才把C语言重新捡回来,经过一周的学习,我们也初步掌握了C语言程序与板子之间的正常单向通信,以及板子基本模块功能的实现,在编写程序过程中,我们常遇到的问题就是编写的程序下载到单片机后,和我们的预想情况不一样,如步进电机加减速定时函数的调用,经过的反复的修改,变量的定义错误,前置声明的缺少等,修改好程序后发现电机还是不能转,经过排查才发现,板子的跳线没有调好,在设计的过程中还遇到了很多其他的问题,如按键扫描不能正常工作,按键的状态备份没有设置好等等,经过了反复的排查修改才最后调试成功,通过这两星期的学习,我们小组对51单片机的部分功能有了进一步的认识。
图1-1 单片机步进电机运行照片
(二)要求(2)(3)的实现:
我们利用实验室的PLC步进电机控制系统实现(2)(3)的要求,其步进电机的频率-时间图如图2-1所示。
图2-1 步进电机的频率-时间图
①实验过程(包括主要步骤、代码分析)
(1)了解触摸屏Touch-Win、西门子S7-200工作原理和驱动器KR-5MC 参数设置。
(2)根据实验要求,画出实验硬件接线图,如图2-2所示。
图2-2 实验硬件接线图
(3)依据实验连线图接线,同时设置电机参数:将细分调到“FULL”档(对应电机接收一个脉冲时转动0.72度);将时钟调到“1”档(对应的CW控制输出脉冲,CCW控制转向)。接线和电机参数设置无误后请老师检查是否正确。
(4)设计如图2-3所示的基于Touch-Win的人机界面,同时设置相关参数。其中量程、最大转速是需要输入的变量,分别设定为VW1和VW11。M0.1=1时电机启动,M0.0=1代表电机正转,丝杠向电机方向运动;M0.0=0代表电机反转,丝杠朝电机反方向运动。
图2-3 触摸屏工作界面
其中触摸屏中各个变量对应关系如表1所示: 表1 触摸屏中变量对应关系表 变量 M0.1 M0.0=1 M0.0=0 VW1 VW11 M0.3
(5)根据实验要求及其触摸屏的相关输入变量,设计基于西门子S7-200的PLC程序。已知控制器接收一个脉冲转动0.72度,每500个脉冲电机转一圈,丝杠的螺距是2毫米,电机转一圈丝杠前进2毫米。
名称 启动 左移 右移 行程设定值 最大转速设定值 电机图标
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库4步进电机定位控制实验 - 图文(2)在线全文阅读。
相关推荐: