首先打开proteus软件,导入元器件并连线。
接着了解一下步进电机:
步进电机的特点:
步进电机的驱动芯片:
l298步进电机驱动芯片各引脚的功能:
L298的逻辑功能表
四相步进电机的工作原理:
接下来就是proteus中导入步进电机的方法:
proteus中导入L298芯片的方法:
接下来就是编写C代码了。
先写一个用不精确的延时函数来控制转速的程序
#include"reg52.h"
#define uchar unsigned char
// 使用8步法对步进电机进行控制的数组
uchar st[]={0x09, 0x08, 0x0c, 0x04, 0x06, 0x02, 0x03, 0x01}; //1001, 1000, 1100, 0100, 0110, 0010, 0011, 0001
#define uint unsigned int
void delay(uint t){ // 模糊延时(不精确的延时)
uint i=0, j=0;
for(i=0; i<t; i++){
for(j=0; j<120; j++);
}
}
void stepper(){ // 电机控制函数
int i=0;
for(i=0; i<8; i++){ // 从左往右取值是正转
for(i=7; i>0; i--){ // 从右往左取值是反转
P2 = st[i];
delay(v); // 延时越短 电机转动的速度越快
}
}
void main(){ // 主函数
inittimer();
while(1){
stepper(); // 调用电机控制函数
}
}
接下来写的是用计时器来写的精确的计时来控制转速的代码:
#include"reg52.h"
#define uchar unsigned char
// 使用8步法对步进电机进行控制的数组
uchar st[]={0x09, 0x08, 0x0c, 0x04, 0x06, 0x02, 0x03, 0x01}; //1001, 1000, 1100,0100, // 0110, 0010, 0011, 0001
#define uint unsigned int
uchar count=0, num=0; // 定义中断中使用的变量
void inittimer(){ // 计时器初始化函数
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
ET0 = 1;
EA = 1;
TR0 =1;
}
void main(){ // 主函数
inittimer();
while(1){
//stepper();
}
}
//***********************************************************************************
// 中断服务函数每隔50毫秒进来1次
// 赋初值就是确定下一次计时多长时间。
///**********************************************************************************
void zhongduan() interrupt 1{ // 中断服务函数 每隔50毫秒进来一次
TH0 = 0x3C ; //(65536-50000)/256; // 3C 高8位赋初值
TL0 = 0xB0 ;//(65536-50000)%256; // B0 低8位赋初值
count++; // 每隔50毫秒 count自加1
if(count==20){ // 如果count等于20了,证明加了20次了,也就是1秒钟了
P2 = st[num++]; // P2等于数组st的第num个值(从第0个到第8个)
if(num==8){ // 如果num等于8了,就是st的值从头取到尾了。
num=0; // 就将num置0,从头取
}
count = 0; // 将count置0,从头计算
}
}
以上两段代码都是经过测试的,可以直接复制编译成hex文件,最后导入proteus中模拟仿真。
文章来源:https://www.toymoban.com/news/detail-494577.html
文章来源地址https://www.toymoban.com/news/detail-494577.html
到了这里,关于51单片机对步进电机的控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!