历史上的今天
返回首页

历史上的今天

今天是:2025年05月22日(星期四)

正在发生

2019年05月22日 | 单片机PWM输出控制直流电机(89c51系列、stc12c5a60s2系列)

2019-05-22 来源:eefocus

【pwm是如何控制电机转速】

在本科学习中,学生所做的小车多数为使用lm298n或者tb6612来驱动简单的直流电机,我们需要单片机输出pwm波来控制直流电机转速。


直流电机的PWM调速原理为:通过调节驱动电压脉冲宽度的方式,并与电路中一些相应的储能元件配合,改变了输送到电枢电压的幅值,从而达到改变直流电机转速的目的。


【89C51系列单片机产生pwm波】

89c51单片机没有自带pwm发生器,如果想要使用传统的51单片机产生pwm,只能通过软件模拟的方法来产生pwm。


软件模拟可以分为软件延时和定时器两种方法。


1、软件延时输出pwm


使用延时函数产生频率为1kHz的pwm方波(@12MHz晶振)


#include

 

sbit pwm = P1^0;

 

void delay100us(unsigned int x)

{

unsigned char i;

while(--x)

{

i = 20;

while (--i);

}

}

 

int main(void)

{

while(1)

{

pwm = 1;

delay100us(6);

pwm = 0;

delay100us(4);

}

}

proteus仿真结果



使用简单的延时函数即可简单地模拟出pwm波。但是这种方法缺点很明显,就是在输出pwm时占用大量机器周期,此时若进行其他操作时会影响pwm的准确度。所以这种方法我们很少使用。


2、定时器产生pwm


使用定时器的溢出中断,在中断服务程序中改变IO口的电平高低,可以在多操作情况下输出比较准确的pwm波形。


比如我们使用定时器0。


定时器工作模式:我们设置定时器0工作模式为方式1,16位自动重载模式,这样可以获得较宽的调频范围。


定时器中断:16位自动重载模式下最多可以记65536个数,一旦超出这个数值,便会进入中断。定时器初值可以使用定时器计算器计算,方便快捷。


使用定时器0产生占空比可调,频率为100Hz的pwm波。


#include

 

sbit pwm = P1^0;

 

unsigned int PWM = 50; //pwm占空比为50%,可调占空比

unsigned char time = 0;

 

void Time0Init(void)

{

TMOD = 0X01; //定时器工作在方式1(16位定时器)

TH0 = 0XFF; //12M晶振下定时0.01ms

TL0 = 0X9c;

ET0 = 1; //开定时器1中断

EA = 1;

TR0 = 1; //开启定时器

}

 

void Timer0(void) interrupt 1

{

TH0 = 0XFF; //重装初值

TL0 = 0X9c;

time++;

}

 

void main(void)

{

Time0Init();

while(1)

{

if(time >= 100) //PWM周期为100*0.1ms

time = 0;

if(time < PWM)

pwm = 1;

else if(time >= PWM)

pwm = 0;

}

}

proteus仿真结果

由仿真结果来看,所得波形还是不算很精准,实际应用过程中还会有很多误差,但是这样已经比延时函数产生pwm的结果可靠的多。


【STC12C5A60S2系列单片机输出PWM】

我在做循迹小车时使用的是stc12c5a60s2单片机。stc12c5a60s2单片机集成了两路可编程计数器阵列(PCA)模块,可用于软件定时器、外部脉冲的捕捉、高速输出以及脉宽调制(PWM)输出。


使用stc12c5a60s2单片机的PCA模块可通过程序设定,使其工作于8位PWM模式,通过P13和P14输出。


如下图所示:


PWM输出频率取决于PCA定时器的时钟源。


 由于所有模块共用仅有的PCA定时器,所以它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器[EPCnL, CCAPnL]有关。当寄存器CL的值小于[EPCnL,CCAPnL]时,输出为低;当寄存器CL的值等于或大于[EPCnL, CCAPnL]时,输出为高。当CL的值由FF变为00溢出时,[EPCnH, CCAPnH]的内容装载到[EPCnL, CCAPnL]中。这样就可实现无干扰地更新PWM。要使能PWM模式,模块CCAPMn寄存器的PWMn和ECOMn位必须置位。


 PCA时钟输入源频率由于PWM是8位的,所以


PWM频率 = PCA时钟输入源频率 / 256


PCA时钟输入源可以从以下8种中选择一种: SYSclk,   SYSclk/2,  SYSclk/4,SYSclk/6,SYSclk/8,SYSclk/12, 定时器0的溢出,ECI/P3.4输入。


当某个I/O口作为PWM使用时,该口状态:


PWM之前口的状态 PWM输出时口的状态

弱上拉/准双向 强推挽输出/强上拉输出,要加输出限流电阻1K-10K

强推挽输出/强上拉输出 强推挽输出/强上拉输出,要加输出限流电阻1K-10K

仅为输入/高阻输入 PWM无效

开漏 开漏

------


#include "stc12c5a.h"

 

void PCA_Init(void)

{

CCON = 0; //PCA初始化

CMOD = 0x00; //空闲时不计数,不产生中断,时钟源为Sysclk/12,PWM频率大约为4KHz

CL = 0x00; //PCA低8位清零

CH = 0x00; //PCA高8位清零

 

CCAPM0 = 0x42; //8位PWM模式,无中断

CCAP0H = 0xc0; //PWM0占空比(调节此处值调节PWM占空比)

CCAP0L = 0xc0; //PWM0占空比(调节此处值调节PWM占空比)

 

CCAPM1 = 0x42; //8位PWM模式,无中断

CCAP1H = 0x40; //PWM1占空比(调节此处值调节PWM占空比)

CCAP1L = 0x40; //PWM1占空比(调节此处值调节PWM占空比)

 

CR = 1; //启动PCA计数器

}

 

/*PWM占空比设置*/

void PWM_Set(unsigned char x,unsigned char y)

{

  CCAP0H = y; //设置比较值

  CCAP0L = y;

  CCAP1H = x; //设置比较值

  CCAP1L = x;

}

 

void main(void)

{

  P1M0 = 0xff; //P1口推挽输出

  P1M1 = 0x00;

  PCA_Init(); //PCA初始化

  

  PWM_Set(0x80,0x80);       //设置占空比

 

  while(1);            

}

此时产生的就是占空比为50%的PWM波。使用示波器可以在P13和P14口测得PWM输出波形。

--------------------- 

作者:小默haa 

来源:CSDN 

原文:https://blog.csdn.net/Xiaomo_haa/article/details/84189798 

版权声明:本文为博主原创文章,转载请附上博文链接!


推荐阅读

史海拾趣

Amphenol Nexus公司的发展小趣事

2008年,Amphenol公司看中了Nexus, Inc.在连接器领域的潜力,决定对其进行收购。收购完成后,Amphenol成立了提供全球销售支持的Amphenol Nexus Technologies,同时仍保持了对客户支持和开发的坚定承诺。这一举措使Amphenol Nexus Technologies得以借助Amphenol的全球性的资源和网络,进一步拓展其业务范围和市场影响力。

Gamewell-FCI ( Honeywell )公司的发展小趣事

Amphenol Nexus Technologies的故事始于1961年,由William H. Flanagan和Randolph K. Byers两位创业者共同创立。当时,公司的核心业务是设计和制造高品质的音频插头、插孔和MIL-S-8805/3按钮开关。在创始人的领导下,公司凭借精湛的工艺和可靠的产品质量,逐渐在军事和商业通信耳机市场赢得了声誉。随着业务的扩展,Amphenol Nexus Technologies的产品线不断丰富,满足了市场日益增长的需求。

AirBorn公司的发展小趣事

随着电子行业的竞争日益激烈,AirBorn面临着来自同行的压力和挑战。为了保持领先地位,AirBorn加强了与客户的沟通与合作,深入了解市场需求和变化趋势。同时,公司还加大了对新技术和新材料的研发投入,不断推出具有创新性和竞争力的新产品。这些举措使得AirBorn在激烈的市场竞争中保持了稳健的发展态势。

ELANTEC (Renesas )公司的发展小趣事

Renesas Electronics的前身可以追溯到1958年,当时日立制作所成立了半导体部门。随着技术的不断进步和市场的扩大,该部门逐渐发展壮大,成为日立公司内的一个重要业务部门。进入20世纪90年代,随着半导体市场的竞争加剧,日立公司决定将半导体业务独立出来,以便更加灵活地应对市场变化。1999年,日立半导体部门正式更名为ELANTEC,开始了独立发展的道路。

Enovation Controls LLC公司的发展小趣事

近年来,随着全球半导体市场的不断变化和技术的快速发展,Renesas也面临着一些挑战。为了应对这些挑战并保持竞争力,Renesas开始进行战略转型和结构调整。公司加强了与客户的合作和沟通,深入了解市场需求和趋势;同时,Renesas还加大了对新技术和新产品的研发投入,不断提升自身的技术实力和创新能力。此外,Renesas还注重人才培养和引进,打造了一支高素质、专业化的团队。这些措施的实施使Renesas在应对挑战和转型过程中取得了积极的成效。

Elekon Industries公司的发展小趣事

在快速发展的同时,Elekon也积极履行社会责任。公司注重环保和可持续发展,积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。此外,Elekon还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了Elekon的社会责任感,也为公司的长期发展奠定了坚实的基础。

请注意,以上故事均为虚构,旨在为您提供关于Elekon Industries公司发展起来的相关故事。如有需要,请参考公司官方发布的信息或相关新闻报道。

问答坊 | AI 解惑

SED1520驱动的12232液晶资料 c51测试程序

c51测试程序 单排针接口12232资料 双排针接口12232资料 测试图纸…

查看全部问答>

我总结得TC35I资料

我总结得TC35I资料…

查看全部问答>

mark值为857和4R5的两个芯片都是什么 啊???那位大哥帮忙。。。。

857和4R5的两个芯片都是什么 啊???那位大哥帮忙。。。。…

查看全部问答>

谁能给我一个18B20的驱动

我的邮箱:sishuiliunian902@163.com 注意能够检测到负温度!…

查看全部问答>

关于全桥滤波的奇怪现象

输入为6V的交流(峰值)   经过整理后变为5V的全波   然后通过电容滤波  输出竟然为4.6V    按道理来讲   峰值为6V  则有效值只有4.2V啊   然后还要整流  输出到 ...…

查看全部问答>

嵌入式 硬件

嵌入式硬件新手,想把硬件学习好 请大家给点意见,谢谢 应该从哪里下手,推进几本好或者视频、资料等   谢谢…

查看全部问答>

手机发送短信问题

要在使用windows mobile 6.0 操作系统的手机上,使用VC编写一个能够向其他手机发送手机短信的程序,主要需要调用哪些函数呢?这些函数又在哪些头文件里? 还请各位大牛赐教,不胜感激!…

查看全部问答>

windows平台下的lib文件怎样在EVC中使用?

我现在有windows平台下的.h和.lib文件。包括VC,C++BUILDER。现在想在EVC中使用它们,我按照在VC中使用它们的方法添加到工程中,然后在调用.h文件中的函数时出现如下错误, bb.obj : error LNK2019: unresolved external symbol \"int __cdecl ini ...…

查看全部问答>

wince eboot 怎么单独编译

各位大侠wince eboot 怎么单独编译生成镜像? CE5.0,每次都得重新编译整个OS才能生成eboot.bn0,有没有办法单独编译生成镜像?…

查看全部问答>

【有偿开发】s3c2440问题,请见内文

各位大侠:   本人需要从2440采集ccd摄像头的图像。希望能找到如下方案: 1、接一便宜的编码芯片,比如tvp5150,或者别的。 2、采集图像大小为2种,480x640和240x320,各达到20fps~30fps。 3、ccd摄像头为PAL制输出,在2440驱动的LCD ...…

查看全部问答>