历史上的今天
返回首页

历史上的今天

今天是:2025年02月22日(星期六)

2020年02月22日 | 用51单片机控制步进电机运动详解

2020-02-22 来源:51hei

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


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


硬件单片机型号:STC90C516RD+ 
步进电机型号:39HS4012A4 1.8° 1.2A 
1.jpg?imageView2/2/w/550 
步进电机驱动器型号:M415B 1.5A 
2.jpg?imageView2/2/w/550 
代码源代码

#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全用。

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

1.jpg?imageView2/2/w/5502.jpg?imageView2/2/w/5500.png?imageView2/2/w/550 

//也就是说实际的定时器定时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

}



推荐阅读

史海拾趣

High Energy Corp公司的发展小趣事

机顶盒,全称为数字视频变换盒,是连接电视机与外部信号源的关键设备,具备高度的专业性和广泛的科普意义。从广义上讲,任何与电视机连接的网络终端设备均可称为机顶盒,包括传统的模拟频道增补器到现代的数字卫星机顶盒、有线电视数字机顶盒及IPTV机顶盒等。其主要功能在于接收来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,并将这些信号转换为电视机可识别的视频和音频格式,极大地丰富了用户的观看选择,提升了观看体验。

机顶盒不仅能提供高清、4K甚至超高清的电视节目,还具备网络交互功能,用户可通过机顶盒连接互联网,享受在线购物、观看网络视频、玩游戏等多元化服务。此外,机顶盒还支持电子节目指南、因特网网页浏览等增值服务,使电视机不再仅仅是接收信息的单向设备,而是成为与用户进行互动的智能终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化、多功能化方向发展。例如,通过智能推荐算法,机顶盒能为用户提供个性化的节目推荐;借助语音识别技术,用户可通过语音指令控制机顶盒,实现便捷操作。未来,机顶盒将继续融合新技术,如人工智能、云计算等,为用户提供更加丰富的娱乐选择和更加智能的观看体验。

Bay Linear Inc公司的发展小趣事

Bay Linear Inc公司一直注重人才培养和团队建设。公司建立了完善的人才培养和激励机制,吸引了一批批优秀的研发人才和管理人才。同时,公司还积极营造团结协作、创新进取的企业文化,使团队成员能够充分发挥自己的才能和潜力,共同推动公司的发展。

Electro-Mech Components Inc公司的发展小趣事

1997年,EMC做出了一次重要的收购决策——从Pollak Transportation Electronics Division(TED)收购了开关灯产品线。这一收购使EMC的产品线得到了极大的扩展,同时也增强了其在电气元件领域的竞争力。收购后的开关灯产品线在EMC的精心运营下,逐渐成为了公司的明星产品之一,为公司带来了丰厚的利润。

Gigarams Semiconductor Device Corp公司的发展小趣事
这可能是由于定位力量不够或初始力矩过大导致的。解决方案包括调整定位参数、优化启动策略或增加缓冲装置以减少振动。
Ercona Corp公司的发展小趣事
这可能是由于传感器精度不足、控制器算法不准确或驱动器性能不稳定等原因导致的。解决方案包括提高传感器精度、优化控制器算法和更换性能更稳定的驱动器。
ERP Power公司的发展小趣事

在这个故事中,我们将探讨ERP Power如何在云计算技术的推动下实现创新发展。通过引入云计算技术,ERP Power系统为企业提供了更加灵活、可扩展的信息化解决方案,帮助企业降低了IT成本并提高了系统安全性。

问答坊 | AI 解惑

verilog串口问题

module my_232_rx(                                                  ...…

查看全部问答>

请教 华为 和 ST-Ericsson 这两个公司哪个好点啊?

请教各位前辈:     我刚刚走出校门,不清楚每个公司情况     请问做研发的话(底层驱动)     华为 和 ST-Ericsson(T3G) 这两个公司哪个好点啊?…

查看全部问答>

如何用端点0控制传输任意数据包

原来在CE5上作用做中断.批量传输一直没问题. 现在需要用端点0做控制传输数据包. 测试发现只能用端点0控制传输一个标准的set up数据包. 共8个自己. 我想用端点0控制传输任意数据包. 怎么做? …

查看全部问答>

PCB制板说明-2010

PCB厂 发过来的制板说明 ,里面是他们关注的参数,大家可参考下。…

查看全部问答>

DEC2812与凌华CAN接口卡7841的通信

我用两根线将DEC2812的CAN接口与凌华CAN接口卡相连。两者都设置成1M波特率。 但是2812总是信息发送不出去,相应的CANTA位总不能置位。 但是,单独DEC2812自测试模式下工作正常,单独凌华接口卡CAN自己通信(双口)也正常。 请问是什么原因,应该 ...…

查看全部问答>

鑫海金工实习报告

答应过大家的要把我的实习报告给大家看看,索性传上来了嘿嘿 下面是封皮 [ 本帖最后由 鑫海宝贝 于 2011-4-13 21:17 编辑 ]…

查看全部问答>

关于ADS1115在采样时输入电压接近0却输出值65535或65534

刚才在写ADS1115的程序的时候用硬件仿真发现在有电压的时候是正常的,但如果输入电压基本上为0的时候,仿真出来的值就为65535或65534,这是为什么呀???求指导!!!!…

查看全部问答>

Quartus直接调用modelsim仿真IP内核

新手,求教如何直接利用Quartus内部IP核,并生成仿真文件,直接调用modelsim仿真?谢谢了,配图更好,不甚感激 …

查看全部问答>

解决一下

光电传感器检测物体时:根据反射率的的不同,接收器检测出来的光信号转换成的电流也不同,后经放大器生成电流给后面的集成电路也会不同,由此可不可以判断物体是什么,在已知反射率的情况下 。   …

查看全部问答>