以下是我们老师给我的的一个程序(也算是个讲义)关于驱动步进电机。他要求我们将一下程序中 使步进电机正转与反转的两步程序改写成一个程序, 提示是增加一个参数。 我没有学过编程,实在不会啊,请教各位大神帮忙 ,谢啦。
/**********************************************************************
C51_StepCtl.c
生成(有转角参数和速度参数的)模块化的减速永磁步进电机驱动函数
用端口P2的低四位驱动第一台减速永磁步进电机
单片机 P2.0 引脚接驱动板输入脚 In1 (控制第一台电机的线圈A)
单片机 P2.1 引脚接驱动板输入脚 In2 (控制第一台电机的线圈B)
单片机 P2.2 引脚接驱动板输入脚 In3 (控制第一台电机的线圈C)
单片机 P2.3 引脚接驱动板输入脚 In4 (控制第一台电机的线圈D)
用端口P2的高四位驱动第二台减速永磁步进电机
单片机 P2.4 引脚接驱动板输入脚 In1 (控制第二台电机的线圈A)
单片机 P2.5 引脚接驱动板输入脚 In2 (控制第二台电机的线圈B)
单片机 P2.6 引脚接驱动板输入脚 In3 (控制第二台电机的线圈C)
单片机 P2.7 引脚接驱动板输入脚 In4 (控制第二台电机的线圈D)
用延时函数控制步进电机相位变化的频率
采用单双相八拍步序信号驱动
-> 0xF9 -> 0xF1 -> 0xF3 -> 0xF2 -> 0xF6 -> 0xF4 -> 0xFC -> 0xF8 ->
------------------------------------------------------------------
二进制数位 1 使得对应的线圈导电, 同时使该数位上的发光二极管暗
November 27, 2012
**********************************************************************/
#include<reg51.h> // 包括头文件
unsigned char paramSpd; // 循环内的延时参数
unsigned char paramItv; // 两次操作之间的延时参数
void delayms(unsigned char ms); // 申明延时程序程序
void mt1_cw(unsigned char angUnits, unsigned char spdParam);
void mt1_ccw(unsigned char angUnits, unsigned char spdParam);
void mt2_cw(unsigned char angUnits, unsigned char spdParam);
void mt2_ccw(unsigned char angUnits, unsigned char spdParam);
void mt1cw_basic(unsigned char spd);
void mt1ccw_basic(unsigned char spd);
void mt2cw_basic(unsigned char spd);
void mt2ccw_basic(unsigned char spd);
//******************************** 主程序 *******************************
void main()
{
paramSpd = 15; // 循环内延时参数赋值
paramItv = 80; // 两次操作之间的延时参数赋值
while (1)
{
mt1_cw(100, paramSpd); // 驱动第一台电机正向旋转16个八个节拍
delayms(paramItv); // 停顿一段时间
mt2_cw(0, paramSpd); // 驱动第二台电机正向旋转16个八个节拍
delayms(paramItv); // 停顿一段时间
mt2_ccw(0, paramSpd); // 驱动第一台电机反向旋转16个八个节拍
delayms(paramItv); // 停顿一段时间
mt1_ccw(100, paramSpd); // 驱动第二台电机反向旋转16个八个节拍
delayms(paramItv); // 停顿一段时间
}
}
//***************************** 驱动第一台电机正向旋转 *********************************
void mt1_cw(unsigned char angUnits, unsigned char spdParam)
{
while(angUnits--)
{
mt1cw_basic(spdParam);
}
}
void mt1cw_basic(unsigned char spd)
{
P2 = 0xF9; // 第一节拍 ( 1111 1001 线圈 D 和 线圈 A 同时导电)
delayms(spd);
P2 = 0xF1; // 第二节拍 ( 1111 0001 线圈 A 单独导电)
delayms(spd);
P2 = 0xF3; // 第三节拍 ( 1111 0011 线圈 B 和 线圈 A 同时导电)
delayms(spd);
P2 = 0xF2; // 第四节拍 ( 1111 0010 线圈 B 单独导电)
delayms(spd);
P2 = 0xF6; // 第五节拍 ( 1111 0110 线圈 C 和 线圈 B 同时导电)
delayms(spd);
P2 = 0xF4; // 第六节拍 ( 1111 0100 线圈 C 单独导电)
delayms(spd);
P2 = 0xFc; // 第七节拍 ( 1111 1100 线圈 D 和 线圈 C 同时导电)
delayms(spd);
P2 = 0xF8; // 第八节拍 ( 1111 1000 线圈 D 单独导电)
delayms(spd);
}
//***************************** 驱动第一台电机反向旋转 *********************************
void mt1_ccw(unsigned char angUnits, unsigned char spdParam)
{
while(angUnits--)
{
mt1ccw_basic(spdParam);
}
}
void mt1ccw_basic(unsigned char spd)
{
P2 = 0xFc; // 第一节拍 ( 1111 1100 线圈 D 和 线圈 C 同时导电)
delayms(spd);
P2 = 0xF4; // 第二节拍 ( 1111 0100 线圈 C 单独导电)
delayms(spd);
P2 = 0xF6; // 第三节拍 ( 1111 0110 线圈 C 和 线圈 B 同时导电)
delayms(spd);
P2 = 0xF2; // 第四节拍 ( 1111 0010 线圈 B 单独导电)
delayms(spd);
P2 = 0xF3; // 第五节拍 ( 1111 0011 线圈 B 和 线圈 A 同时导电)
delayms(spd);
P2 = 0xF1; // 第六节拍 ( 1111 0001 线圈 A 单独导电)
delayms(spd);
P2 = 0xF9; // 第七节拍 ( 1111 1001 线圈 D 和 线圈 A 同时导电)
delayms(spd);
P2 = 0xF8; // 第八节拍 ( 1111 1000 线圈 D 单独导电)
delayms(spd);
}
//***************************** 驱动第二台电机正向旋转 *********************************
void mt2_cw(unsigned char angUnits, unsigned char spdParam)
{
while(angUnits--)
{
mt2cw_basic(spdParam);
}
}
void mt2cw_basic(unsigned char spd)
{
P2 = 0x9F; // 第一节拍 ( 1111 1001 线圈 D 和 线圈 A 同时导电)
delayms(spd);
P2 = 0x1F; // 第二节拍 ( 1111 0001 线圈 A 单独导电)
delayms(spd);
P2 = 0x3F; // 第三节拍 ( 1111 0011 线圈 B 和 线圈 A 同时导电)
delayms(spd);
P2 = 0x2F; // 第四节拍 ( 1111 0010 线圈 B 单独导电)
delayms(spd);
P2 = 0x6F; // 第五节拍 ( 1111 0110 线圈 C 和 线圈 B 同时导电)
delayms(spd);
P2 = 0x4F; // 第六节拍 ( 1111 0100 线圈 C 单独导电)
delayms(spd);
P2 = 0xcF; // 第七节拍 ( 1111 1100 线圈 D 和 线圈 C 同时导电)
delayms(spd);
P2 = 0x8F; // 第八节拍 ( 1111 1000 线圈 D 单独导电)
delayms(spd);
}
//***************************** 驱动第二台电机反向旋转 *********************************
void mt2_ccw(unsigned char angUnits, unsigned char spdParam)
{
while(angUnits--)
{
mt2ccw_basic(spdParam);
}
}
void mt2ccw_basic(unsigned char spd)
{
P2 = 0xcF; // 第一节拍 ( 1111 1100 线圈 D 和 线圈 C 同时导电)
delayms(spd);
P2 = 0x4F; // 第二节拍 ( 1111 0100 线圈 C 单独导电)
delayms(spd);
P2 = 0x6F; // 第三节拍 ( 1111 0110 线圈 C 和 线圈 B 同时导电)
delayms(spd);
P2 = 0x2F; // 第四节拍 ( 1111 0010 线圈 B 单独导电)
delayms(spd);
P2 = 0x3F; // 第五节拍 ( 1111 0011 线圈 B 和 线圈 A 同时导电)
delayms(spd);
P2 = 0x1F; // 第六节拍 ( 1111 0001 线圈 A 单独导电)
delayms(spd);
P2 = 0x9F; // 第七节拍 ( 1111 1001 线圈 D 和 线圈 A 同时导电)
delayms(spd);
P2 = 0x8F; // 第八节拍 ( 1111 1000 线圈 D 单独导电)
delayms(spd);
}
//********************************* 延时子程序 *********************************
void delayms(unsigned char ms)
{
unsigned char j;
unsigned char k;
while(ms--)
{
for(j = 0; j < 10; j++)
{
for(k = 0; k < 10; k++);
}
}
}
一周热门 更多>