如何用51单片机控制步进电机运动

如何用51单片机控制步进电机运动本来接触单片机挺久了的,但是一直只是停留在非常初级的认识阶段,本科的时候上过几门课,但是从来没有自己捣鼓过单片机,这次突然来了兴趣,感觉一下子学到了好多东西,在这里好好整理一下。这篇文章只适合于入门阶段的小白阅读,高手请绕道。12年年初的时候购买了一套普中科技的“单片机开发试验仪”,好多次想好好学学,结果每一次都半途而废,主要原因还是周围的人都不会用,有问题都不知道找谁问,结果锁到箱子里一直到现在。

大家好,又见面了,我是你们的朋友全栈君。

本来接触单片机挺久了的,但是一直只是停留在非常初级的认识阶段,本科的时候上过几门课,但是从来没有自己捣鼓过单片机,这次突然来了兴趣,感觉一下子学到了好多东西,在这里好好整理一下。这篇文章只适合于入门阶段的小白阅读,高手请绕道。

12年年初的时候购买了一套普中科技的“单片机开发试验仪”,好多次想好好学学,结果每一次都半途而废,主要原因还是周围的人都不会用,有问题都不知道找谁问,结果锁到箱子里一直到现在。因为最近需要用到一个步进电机,而这个步进电机需要用PWM波控制。以前也用过电机,直流无刷的、交流伺服等等,但是都是RS232、RS485或者Can总线协议,从来没有用PWM波控制过。废话不多说,直接入正题。

硬件

单片机型号:STC90C516RD+
步进电机型号:39HS4012A4 1.8° 1.2A
这里写图片描述
步进电机驱动器型号:M415B 1.5A
这里写图片描述

代码

源代码

#include <reg52.h>

unsigned char timer1; 
sbit DIR=P1^0; //位定义DIR为P1.0口
sbit ENA=P1^1; //位定义ENA为P1.1口
sbit PWM=P1^2; //位定义PWM为P1.2口

void system_Ini()
{
    TMOD|= 0x11;
    TH1 = 0xfe; //11.0592MHz 0.5ms定时
    TL1 = 0x33;
    TR1 = 1; //启动T1定时
    IE =0x8A; //开T0,T1中断,开总中断
}

main()
{
    system_Ini(); //调用子函数,初始化定时器T1
    while(1)
    { 
        if(timer1>100)
        {
            timer1=0; //输出占空比0.7的PWM脉冲
        }
        if(timer1<30)
        {
            PWM=0;
        }
        else 
        {
            PWM=1;
        }
    }
}

/************************************* [ t1 (0.5ms)中断] 中断中做 PWM 输出 ------------1000/(0.02ms*250)=200Hz *************************************/
void T1zd(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
    TH1 = 0xfe; //11.0592 初始化定时器
    TL1 = 0x33;
    timer1++; //计数+1
}

代码解释

#include <reg52.h> //包含了单片机系统的头文件
unsigned char timer1; //定义一个无符号字符常量timer1,用来给定时器计数用

sbit DIR=P1^0; //位定义DIR为P1.0口,用来控制步进电机的方向
sbit ENA=P1^1; //位定义ENA为P1.1口,用来控制步进电机的使能
sbit PWM=P1^2; //位定义PWM为P1.1口,用来输出PWM波

TMOD = 0x11; 
//这一句代码比较费解,因为对单片机的控制字不熟悉,仔细翻看了单片机的手册,原来这是控制定时器的,共有两位,前一位控制定时器1,后一位控制定时器0。因为控制只使用了一个定时器1,所以其实定时器0所在的位其实无关紧要。控制位的定义如下图所示,共4位,组成一个16进制数,所以代码中的1其实铺开了二进制应该是0001,对应下面的16位定时器,TL1、TH1全用。

这里写图片描述

TH1 = 0xfe; //11.0592MHz 0.5ms定时
TL1 = 0x33;
//这句代码非常的费解,刚开始的时候完全不懂这两个数索要表示的意思是什么,旁边还有个注释,也是没看懂。好在实验室有一位大神,分分钟帮我讲懂了。先看芯片手册上给出的例子:

这里写图片描述
这里写图片描述

//也就是说初始时我的计数是从0xfe33开始的,定时器是16位的,所以实际计数值化为十进制为:

216(15×163+14×162+3×161+3×160)=461

//也就是说实际上计数为461,而实际上我查得我的晶振频率为11.907MHz,所以实际的时间长度为:

Tc=461×1211.907×106=0.4646

//也就是说实际的定时器定时464.6ms,这里终于解释清楚了为什么上面的定时器数据应该那么写


TR1 = 1; //启动T1定时,这里比较好理解

IE =0x8A; //开T0,T1中断,开总中断
//这里继续翻出芯片的技术手册来解释,有了前面的基础,后面看起来自然一目了然,必须允许定时器溢出中断,定时器每溢出一次就产生一次中断,总中断是必须打开的,用了定时器1,因此定时器1的中断也需要打开,而定时器0的中断其实开不开无所谓的,因为根本就没有用定时器0。

这里写图片描述

main()
{
    system_Ini(); //调用子函数,初始化定时器T1
    while(1) //无限循环
    { 
        if(timer1>100)
        {
            timer1=0; //输出占空比0.7的PWM脉冲
        }
        if(timer1<30)
        {
            PWM=0;
        }
        else 
        {
            PWM=1;
        }
    }
}


/************************************* [ t1 (0.5ms)中断] 中断中做 PWM 输出 1000/(0.02ms*250)=200Hz *************************************/

void T1zd(void) interrupt 3 //3为定时器1的中断号; 1为定时器0的中断号; 0为外部中断1的中断号; 2为外部中断2的中断号; 4为串口中断的中断号,这是芯片规定的

{
    TH1 = 0xfe; //11.0592 初始化定时器,让定时器复位继续定时
    TL1 = 0x33;
    timer1++; //计数+1
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138008.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MATLAB 保存图片变黑色

    MATLAB 保存图片变黑色今天用MATLAB作图,碰到一个问题:想把结果保存成为图片,结果,失望,保存之后打开一片黑色。之后再试了几下,不论是jpg,bmp还是png都不行   只好Google,最后,总算找到答案,原来是着色属性的问题,修改其实很简单:              set(gcf,’Renderer’,’ZBuffer’)    这样,就把属性

    2022年9月12日
    2
  • intel酷睿游戏计算机,Intel酷睿九代i3-9100F配RX590游戏电脑配置单,预算3500元不到…「建议收藏」

    intel酷睿游戏计算机,Intel酷睿九代i3-9100F配RX590游戏电脑配置单,预算3500元不到…「建议收藏」想要组装一套游戏电脑主机,主要是玩绝地求生,想要1080P高画质,不过预算有限,想要一套3000-3500元的电脑主机,所以追求性价比。而下面装机之家晓龙分享一套电脑配置清单,采用了i3-9100F和性价比十足的RX5908G独显,显卡性能超GTX10606G,也就是说,能够在1080P高画质下畅玩绝地求生,来看看,有主机差不多预算完全可以参考。九代i3-9100F配RTX590电脑组装机配置…

    2022年7月16日
    21
  • 孙鑫java视频教程笔记[通俗易懂]

    孙鑫java视频教程笔记[通俗易懂](3)为了防止类或函数被覆盖,可以用final声明。private和static默认为final(6)接口中的数据成员默认为publicstaticfinal。(7)java不允许类的多继承,允许类的单继承和接口的多继承。(9)内部类通过this机制可以随意访问外部类的成员。(10)java.lang包被隐形自动导入,不需要import。(12)string是唯一被重载的对

    2022年5月17日
    50
  • struts2拦截器学习

    struts2拦截器学习一、什么是拦截器?提到拦截器,使我不得不想起武侠剧中劫匪们常说的一句话:“此山是我开,此树是我栽,要打此路过,留下买路财!”。难不成程序中也有“打劫”的,说的没错,拦截器就是个打劫的。在现实生活中,劫匪劫的大都是钱财,当然也有别的什么,那么程序中的“劫匪”劫的又是什么呢?或者说程序中为什么需要它?在我们的日常编程中少不了写一些重复的代码,例如在一个地方中写了一段代码,后来发现这段代码在其

    2022年10月7日
    2
  • C#彩色扭曲验证码

    C#彩色扭曲验证码该验证码生成类集合了网上大部分的验证码生成类的精华,并多次改进,现在已经形成了可在生产环节中使用的验证码。该验证码加入了背景噪点,背景噪点曲线和直线,背景噪点文字以及扭曲,调暗,模糊等。完全可以实现防识别。按照国际惯例先贴张效果图吧:#region验证码生成类//////验证码生成类///

    2022年7月21日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号