如何用51单片机控制步进电机运动
来源:互联网 发布:淘宝男装品牌推荐 编辑:程序博客网 时间:2024/05/02 11:25
本来接触单片机挺久了的,但是一直只是停留在非常初级的认识阶段,本科的时候上过几门课,但是从来没有自己捣鼓过单片机,这次突然来了兴趣,感觉一下子学到了好多东西,在这里好好整理一下。这篇文章只适合于入门阶段的小白阅读,高手请绕道。
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位的,所以实际计数值化为十进制为:
//也就是说实际上计数为461,而实际上我查得我的晶振频率为11.907MHz,所以实际的时间长度为:
//也就是说实际的定时器定时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}
1 0
- 如何用51单片机控制步进电机运动
- 51单片机控制四相步进电机
- 51单片机控制四相步进电机
- 51单片机控制步进电机的程序
- 51单片机控制四相步进电机
- 51单片机 步进电机旋转角度控制
- 步进电机的单片机控制
- 用单片机控制步进电机
- 【转】51单片机控制四相步进电机
- 51单片机 步进电机的驱动和旋转角度控制
- 单片机对步进电机的控制(一)
- 单片机对步进电机的控制(二)
- 51单片机--如何解决步进电机只颤不转
- STM32F103控制两个步进电机按照一定转速比运动
- STM32——小车2个步进电机运动控制
- 用AVR单片机直接控制其步进电机
- mega128单片机控制光驱上的步进电机
- 项目日志(1)关于使用单片机控制步进电机
- kaldi
- Android Studio好用的插件(一)
- 如何使用MD5和SHA算法加密信息
- 微信小程序 获取session_key和openid
- 80老翁谈人生(316):原创科普作品,未经作品著作权人许可不得随意删除
- 如何用51单片机控制步进电机运动
- Log4net入门使用
- swiper移动端左右滑动与连接同时触发解决方案
- Vmware Vsphere (ESXI)嵌套虚拟化
- Java HashMap
- aop(面向切面编程)
- switch 结构的 fall through
- 《C++ Primer Plus(第六版)》(45)(第十八章 探讨C++新标准 编程练习和答案)
- python控制鼠标 pyautogui