×
单片机 > 单片机程序设计 > 详情

用51单片机控制步进电机运动详解

发布时间:2020-08-26 发布时间:
|

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


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


硬件单片机型号:STC90C516RD+ 
步进电机型号:39HS4012A4 1.8° 1.2A 

步进电机驱动器型号:M415B 1.5A 

代码源代码

#include


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 //包含了单片机系统的头文件

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;
//这句代码非常的费解,刚开始的时候完全不懂这两个数索要表示的意思是什么,旁边还有个注释,也是没看懂。好在实验室有一位大神,分分钟帮我讲懂了。先看芯片手册上给出的例子:



关键字:51单片机控制  步进电机  运动详解 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向