- 什么是PWM
PWM(脉宽调制),是靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。
(脉冲可以理解为是IO口的一次高低电平改变)
- PWM是怎么对直流电机进行调速的
使用PWM对电极调速时,是靠改变占空比(改变脉冲宽度)来控制输出电压的,电压较小电机转速就会下降;再通过改变周期(脉冲的周期)来控制其输出频率,脉冲频率对电机的转速有着决定性作用,脉冲频率越高连续性就越好。
我们一般时通过改变占空比来改变电机转速的。
(占空比:占空比是指一个脉冲循环内,通电(高电平)时间相对于总时间所占的比例。)
- 通过定时器中断实现PWM调速
因为51单片机不附带PWM硬件电路,所以我们一般通过软件模拟PWM,具体是利用定时器中断来实现PWM调速。
改变脉冲宽度:此处利用定时器0的工作方式2(即8位自动装填 TMOD=0X02),一次计时溢出就代表一次脉冲,所以占空比的改变(脉冲宽度的改变是在每一次脉冲改变的)就在中断函数内进行了。
主要是在中断函数内进行占空比设置,如下
void timer0() interrupt 1
{
pwm_t++;
if(pwm_t == 255) //将一个周期分成256份
pwm_t = left_en = right_en = 0;
if(pwm_left_val == pwm_t)//达到pwm_left_val后开启左使能开关
left_en = 1;
if(pwm_right_val == pwm_t)//达到pwm_left_val后开启右使能开关
right_en = 1;
}
改变周期:那周期的改变是依据什么呢?当然是控制溢出时间了(即控制TH0和TL0的初始值)脉冲周期=定时器溢出时间x占空比的总份数。
当设置周期为0.01s、占空比总份数为256时,可以根据定时器溢出时间算出TH0和TL0的初始值为220。
- 上代码
代码经过本人亲测,可以实现
#include sbit left_en=P1^4;
sbit right_en=P1^5;
sbit left_advance=P1^3;
sbit left_back=P1^2;
sbit right_advance=P1^6;
sbit right_back=P1^7;
unsigned char pwm_left_val = 200;//左电机占空比值 取值范围0-170,0最快
unsigned char pwm_right_val = 0;//右电机占空比值取值范围0-170 ,0最快
unsigned char pwm_t=0;//周期计数变量
/*小车前进*/
void forward()
{
left_advance=1; //左电机前进
left_back=0;
right_advance=1; //右电机前进
right_back=0;
}
//定时器0中断
void timer0() interrupt 1
{
pwm_t++;
if(pwm_t == 255) //将一个周期分成256份
pwm_t = left_en = right_en = 0;
if(pwm_left_val == pwm_t)//达到pwm_left_val后开启左使能开关
left_en = 1;
if(pwm_right_val == pwm_t)//达到pwm_left_val后开启右使能开关
right_en = 1;
}
void main()
{
TMOD |= 0x02;//8位自动重装模块
TH0 = 220;
TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ
TR0 = 1;//启动定时器0
ET0 = 1;//允许定时器0中断
EA = 1;//总中断允许
while(1)
{
forward();//前进
}
}
关键字:51单片机 PWM 直流电机调速
引用地址:
51单片机—使用PWM对直流电机调速
推荐阅读最新更新时间:2024-11-09 15:31
采用AT89C51单片机和温度变送器实现炉温控制系统的设计
1、引 言 电加热炉随着科学技术的发展和工业生产水平的提高,已经在冶金、化工、机械等各类工业控制中得到了广泛应用,并且在国民经济中占有举足轻重的地位。对于这样一个具有非线性、大滞后、大惯性、时变性、升温单向性等特点的控制对象,很难用数学方法建立精确的数学模型,因此用传统的控制理论和方法很难达到好的控制效果。 单片机以其高可靠性、高性能价格比、控制方便简单和灵活性大等优点,在工业控制系统、智能化仪器仪表等诸多领域得到广泛应用。采用单片机进行炉温控制,可以提高控制质量和自动化水平。 2、单片机炉温控制系统结构 本系统的单片机炉温控制系统结构主要由单片机控制器、可控硅输出部分、热电偶传感器、温度变送器以及被控对象组成。如图1所示
[单片机]
51单片机对智能防火防盗报警系统的设计
0 引言 现如今在学校的寝室里,学生贵重物品被盗、由于学生过失而引起着火等事故时有发生,这些都是一直以来困扰着学生、学工以及学校保卫处的“大问题”。传统的防范措施存在很大的弊端,比如当事故发生时,防护铁门、铁栏杆就会成为主人逃生的最大障碍。而采用智能防火防盗报警系统,便能很好地解决此类问题了。但是市场上防火防盗系统价格对大学生来讲过高,本系统便是针对大学宿舍,从低成本的角度来设计制作的。 1 系统组成及工作原理 本系统通过一个监控室和两个宿舍来模拟,通过RS 485总线来实现通信。考虑到现实中监控室要能监控整栋宿舍楼,因此采用功能强大的ARM7芯片LPC2103作为主机控制芯片,从机采用价格低廉的51系列单片机作为控制芯片。宿
[单片机]
51单片机使用C语言点亮闪烁LED灯
导语 下面是点亮51单片机使用C语言闪烁LED灯的的一段代码,也是我们迈入C51的第一步。我们将从头开始,一步步讲解下面的程序。 #include #define uchar unsigned char #define uintunsigned int sbit LED= P1^0; void main() { LED=0; while(1) { LED=0; delay(1000); LED=1; delay(1000); } } void delay(uchar ms) { uint x=0, y=0; for(x=xms;x =0;x--) for(y=110;y =0;y--); } .C to .Hex 在从编写
[单片机]
Proteus8.9 仿真STM32407ZGT6系列009_PWM多路可调占空比输出
一,打开文件(可以随文下载放置在文档中打开)。(如下图1所示) 图1 二,调整虚拟器件,另存工程文件。(如下图2,3,4所示) 图2 图3 图4 三,点击Source Code标签。(如下图5所示) 图5 四,编辑main.c,timer.c,timer.h, key.c,key.h, led.c,led.h 代码如Proteus8.9 仿真STM32407ZGT6系列001(如下图6所示) 图6 五,Main.c 代码: /* Main.c file generated by New Project wizard * Author: Ziegler Yin * Created: 周四 一月
[单片机]
基于8051单片机DPTR扩展设计介绍
单片机的出现是计算机技术发展史上的一个里程碑,它使计算机从海量数值计算进入到控制领域。在单片机中,以8051系列最为经典,至今仍是最普及、广泛使用的8位MCU架构。业界许多技术人员在其基础上不断进行性能扩展,使得8051系列芯片不断完善,从而形成一个庞大的体系。在传统的8051系列单片机中,设置了一组双字节寄存器(数据指针DPTR),用于访问外接的64 KB数据存储器和I/O接口电路;但在现今的8051单片机应用中,特别是在嵌入式系统中,往往涉及大规模的数据转移操作,而传统8051的一组数据指针使用起来则显得捉襟见肘,因此若在8051设计中将数据指针设计为两组或多组,则在执行大规模数据转移操作时会相当简便、迅速。在这种背景下,本文
[单片机]
MCS-51单片机最小系统的组成部分及电路图介绍
MCS-51单片机概述 MCS-51单片机是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。 51系列单片机的特点 -8位cpu -片内带振荡器,频率范围为1.2MHz~12MHz -片内带128B的数据存储器 -片内带4KB的程序存储器 -程序存储器的寻址空间为64KB -片外数据存储器的寻址空间为64KB -128个用户位寻址空间 -21个字节特殊功
[单片机]
80C51单片机内部定时器和计数器的结构及原理解析
80C51单片机内部设有两个16位的可编程定时器/计数器。可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。 定时器/计数器的结构: 图片1 从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过
[单片机]
51单片机字符串口通信为什么乱码?终于找到原因了
被这个问题卡了3天,代码很简单就是乱码出问题,烦恼! 后来查资料找到原因,晶振12MHz和11.0592Hz的问题。 如果你用的是12Mhz的单片机,定时器初值TH1一般要设置到E6(2400bps)、F3(4800bps)。 对应的在上位机配置UART串口时,选取2400 4800bps。如果试了不行,那就换更低的1200bps。 修改前 修改后 做了半天才发现我的晶振是11.0592Mhz,为啥对应的开发板视频讲的是12Mhz。 以4800bps为例,TH1=TL1=0xF4,SMOD=1,波特率翻倍=2*2400bps。这样就不会乱码了 ------------------------------
[单片机]