51单片机PWM实验
51系列单片机输出PWM的两种方法

51系列单片机输出PWM的两种方法PWM(Pulse Width Modulation,脉宽调制)是一种常用的调制技术,通过改变信号的脉宽来控制输出电平的占空比。
在51系列的单片机中,常用的PWM输出方式有基于定时/计数器和软件实现两种方法。
一、基于定时/计数器的PWM输出方法:在51系列单片机中,内部有多个定时/计数器可用于实现PWM输出。
这些定时/计数器包括可编程定时/计数器T0、T1、T2和看门狗定时器。
1.T0定时/计数器:T0定时/计数器是最简单和最常用的PWM输出方式之一、通过配置T0定时/计数器的工作模式和重装值来实现PWM输出。
具体步骤如下:(1)选择T0的工作模式:将定时/计数器T0设置为工作在16位定时器模式,并使能PWM输出。
(2)设置T0的重装值:通过设定T0的装载值来定义PWM输出的周期。
(3)设置T0的计数初值:通过设定T0的计数初值来定义PWM输出的脉宽。
(4)启动T0定时/计数器:开启T0定时/计数器的时钟源,使其开始计数。
2.T1定时/计数器:T1定时/计数器相对于T0定时/计数器来说更加灵活,它具有更多的工作模式和功能,可以实现更复杂的PWM输出。
与T0定时/计数器类似,通过配置T1的工作模式、装载值和计数初值来实现PWM输出。
3.T2定时/计数器:T2定时/计数器在51系列单片机中的应用较少,但也可以用于实现PWM输出。
与T0和T1不同,T2定时/计数器没有独立的PWM输出功能,需要结合外部中断请求(INT)来实现PWM输出。
二、软件实现PWM输出方法:在51系列单片机中,除了利用定时/计数器来实现PWM输出外,还可以通过软件来实现PWM输出。
软件实现PWM的核心思想是利用延时控制来生成不同占空比的方波信号。
软件实现PWM输出的步骤如下:(1)设置IO口:选择一个适合的IO口,将其设置为输出模式。
(2)生成PWM信号:根据要求的PWM占空比,通过控制IO口的高低电平和延时的时间来生成PWM方波信号。
基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

基于C51单片机的直流电机PWM调速控制--SQ这是最近一阶段自己学习所获,现分享与大家。
这里采用A T89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等注:考虑小直流电机自身因素,调速范围仅设有四级电路原理图:C语言程序源代码:/******************** 硬件资源分配*********************/数码管:显示电机状态(启停、正反、速度)、运行时间、是否转弯按键:K4 启动/暂停K3 正反转/转弯允许K2 加速/左转/运行时间清零K1 减速/右转/停止定时器:T0 数码管动态显示,输出PWMT1 运行时间记录********************************************************//*******主程序文件PWM.c******/#include <reg52.h>#include "Afx.h"#include "Config.c"#define CIRCLE 5 //脉冲周期//按键定义uchar key,key_tmp=0, _key_tmp=0;//显示定义uchar LedState=0xF0; //LED显示标志,0xF0不显示,Ox00显示uchar code LED_code_d[4]={0xe0,0xd0,0xb0,0x70}; //分别选通1、2、3、4位uchar dispbuf[4]={0,0,0,0}; //待显示数组uchar dispbitcnt=0; //选通、显示的位uchar mstcnt=0;uchar Centi_s=0,Sec=0,Min=0; //分、秒、1%秒//程序运行状态标志bit MotState=0; //电机启停标志bit DirState=0; //方向标志0前,1后uchar State1=-1;uchar State2=-1;uchar State3=0;uchar State4=-1;uchar LSpeed=0;uchar RSpeed=0;//其他uint RunTime=0;uint RTime_cnt=0;uint LWidth;uint RWidth; //脉宽uint Widcnt=1;uint Dispcnt;//函数声明void key_scan(void);void DisBuf(void);void K4(void);void K3(void);void K2(void);void K1(void);void disp( uchar H, uchar n );void main(void){P1|=0xF0;EA=1;ET0=1;ET1=1;TMOD=0x11;TH0=0xFC;TL0=0x66; //T0,1ms定时初值TH1=0xDB;TL1=0xFF; //T1,10ms定时初值TR0=1;Widcnt=1;while(1){key_scan();switch(key){case 0x80: K1(); break;case 0x40: K2(); break;case 0x20: K3(); break;case 0x10: K4(); break;default:break;}key=0;DisBuf();LWidth=LSpeed;RWidth=RSpeed;}}//按键扫描**模拟触发器防抖void key_scan(void){key_tmp=(~P3)&0xf0;if(key_tmp&&!_key_tmp) //有键按下{key=(~P3)&0xf0;}_key_tmp=key_tmp ;}//按键功能处理/逻辑控制void K4(void){if(State4==-1){State4=1;TR1=1;dispbuf[3]=1;LedState=0x00; //打开LEDMotState=1; //打开电机LSpeed=1;RSpeed=1; //初速设为1}else if(State4==1){State4=0;TR1=0;MotState=0; //关闭电机}else if(State4==0){MotState=1;if(State3==0){State4=1;TR1=1;}else if(State3==1){LSpeed=2;RSpeed=2;}}}void K3(void){if(State4==1)DirState=!DirState;if(State4==0){if(State3==0){State3=1; //可以转向标志1可以,0不可以TR1=1;dispbuf[3]=9;MotState=1;LSpeed=2;RSpeed=2;}else if(State3==1){State3=0;TR1=0;dispbuf[3]=0;MotState=0;}}}void K2(void){if(State4==1&&LSpeed<4&&RSpeed<4){LSpeed++;RSpeed++;}else if(State4==0){if(State3==0){//State4=-1;//LedState=0xF0;MotState=0;Sec=0;Min=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=0;LSpeed=2;RSpeed++;}}}void K1(void){if(State4==1&&LSpeed>1&&RSpeed>1){LSpeed--;RSpeed--;}else if(State4==0){if(State3==0){State4=-1;LedState=0xF0;MotState=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=1;LSpeed++;RSpeed=2;}}}//显示预处理void DisBuf(void){if(RTime_cnt==100){Sec++;RTime_cnt=0;}if(Sec==60){Min++;Sec=0;}if(State4==1){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;if(!DirState) //正转dispbuf[3]=LSpeed;if(DirState) //反转dispbuf[3]=LSpeed+4;}if(State4==0){if(State3==0){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;dispbuf[3]=0;}if(State3==1){dispbuf[0]=RSpeed;dispbuf[1]=LSpeed;dispbuf[2]=Min;dispbuf[3]=9;}}}//LED驱动void disp( uchar H, uchar n ){P1=n;P1|=LedState ;P1|=LED_code_d[H];}//T0中断**显示/方波输出void Time_0() interrupt 1{TH0=0xFC;TL0=0x66;Widcnt++;Dispcnt++;//电机驱动/方波输出if(Widcnt>CIRCLE){Widcnt=1;}if(Widcnt<=LWidth)LMot_P=!DirState&&MotState;elseLMot_P=DirState&&MotState;LMot_M=DirState&&MotState;if(Widcnt<=RWidth)RMot_P=!DirState&&MotState;elseRMot_P=DirState&&MotState;RMot_M=DirState&&MotState;//显示if(Dispcnt==5){disp(dispbitcnt,dispbuf[dispbitcnt]);dispbitcnt++;if(dispbitcnt==4){dispbitcnt=0;}Dispcnt=0;}}//T1中断**运行时间void Time_1() interrupt 3{TH1=0xDB;TL1=0xFF;RTime_cnt++;}/******配置文件Afx.h******/#ifndef _AFX_#define _AFX_typedef unsigned char uchar;typedef unsigned int uint;typedef unsigned long ulong;#endif/******IO配置文件Config.c******/#ifndef _Config_#define _Config_#include "Afx.h"#include <reg52.h>//显示定义sbit led=P3^2;//电机引脚定义sbit LMot_P=P2^2; sbit LMot_M=P2^3; sbit RMot_P=P2^0; sbit RMot_M=P2^1;#endif。
基于51单片机PWM调光灯设计

基于51单片机PWM调光灯设计引言随着科技的不断发展,人们对照明的要求也越来越高,不再满足于简单的开关式灯光,而是更加注重光线的亮度调节。
PWM调光技术由于其调光范围广、控制精度高等特点成为了一种常见的调光方式。
本文将以51单片机为基础,介绍一种基于PWM调光技术的灯光系统设计。
一、原理概述PWM调光技术即脉宽调制技术,通过不同占空比的高电平信号,控制LED灯的亮度。
根据一个固定的周期周期(T),将周期平均分为一个个等间隔的时间段,根据每个时间段内高电平信号的占空比(即高电平的持续时间占整个周期的比例)控制LED灯的亮度。
二、系统设计本系统主要由51单片机、脉冲宽度调制模块、MOSFET和LED灯组成。
其中,51单片机负责生成PWM控制信号,脉冲宽度调制模块用于接收单片机的PWM信号并产生相应的电压信号,MOSFET用于根据电压信号调节电流,最终通过LED灯发出可调亮度的光线。
三、硬件设计1.电源电路设计:本系统使用12V直流电源供电,通过稳压电路将电压稳定在5V,用于驱动51单片机和脉冲宽度调制模块。
2.PWM信号生成电路设计:需要为51单片机提供一个定时器来生成PWM信号。
可选择定时器2,使用定时器2的PWM输出功能。
将定时器2的输出引脚接到脉冲宽度调制模块。
3.脉冲宽度调制模块设计:根据PWM信号的不同占空比,需要将其转换为相应的电压信号。
可以使用一个RC电路来实现。
具体电路如下:将51单片机的PWM信号通过一个三极管经过RC滤波后,输入到MOSFET的栅极,控制MOSFET的导通和关断。
4.MOSFET和LED电路设计:MOSFET的特点是可以根据栅极电压的变化来控制其通断,并且具有较小的电流损耗。
因此可以使用MOSFET来控制LED的亮度。
五、软件设计1.定时器2初始化:选择定时器2作为PWM输出源后,需要对其进行初始化,设置相关的工作模式和参数。
2.PWM信号输出:在主程序中,可以通过修改定时器2的占空比寄存器来调节PWM信号的占空比。
基于51单片机的PWM直流电机调速

基于51单片机的PWM直流电机调速在现代社会,PWM直流电机已经成为各类机械设备不可或缺的动力源。
为了更好地控制电机的转速和输出功率,我们需要进行PWM调速操作。
本文将简要介绍如何基于51单片机实现PWM直流电机的调速。
一、PWM调速原理PWM调速是一种通过改变电机供电电压的占空比来调整电机转速和功率的方法。
当一个周期内高电平所占的时间比较短时,电机得到的平均电流和平均转矩也相应减小,电机的速度和功率也随之降低。
反之,当高电平所占的时间比较长时,电机得到的平均电流和平均转矩也相应增大,电机的速度和功率也随之提高。
因此,通过改变PWM信号的高电平占空比,可以实现直流电机的调速、调功等功能,极大地提高了电机的效率和可控性。
二、硬件电路搭建根据上述PWM调速原理,我们需要搭建一个控制板,将51单片机的PWM输出与直流电机相连。
具体电路如下:1、选择合适的电源供电,一般为12V/24V直流电源。
2、使用L298N模块作为直流电机驱动模块,将模块的电源接到电源供电上,将模块的IN1和IN2引脚分别接到51单片机的P1^0和P1^1引脚上,将直流电机的正负极分别接到模块的OUT1和OUT2引脚上。
3、将51单片机的P1^2引脚连接到一个脉冲宽度计波形滤波器(LCF)的输入端,并将输出端接到L298N模块的ENA引脚上。
4、调整脉冲宽度计波形滤波器的参数,以达到合理的PWM输出波形。
5、建立一个按键,将按键的一端接到51单片机的P3^2引脚上,将另一端接到单片机的地端。
6、根据需要进行其他接线。
三、软件程序设计根据上述硬件电路,我们需要进行相应的软件程序设计,以实现基于51单片机的PWM 直流电机调速。
以下是程序设计的主要步骤:1、在程序中定义需要使用的IO口。
2、调用定时器初始化程序,设置定时器的时钟频率、计数器值和工作方式等参数。
3、编写一个PWM输出函数,实现对PWM信号的输出。
4、编写一个ADC采样函数,读取ADC转换器的值,并根据采样值输出一定的PWM信号。
51单片机产生PWM控制小车速度的两种方法

51单片机产生PWM控制小车速度的两种方法首先你的先知道什么是PWM。
PWM是一种脉宽调制技术。
简单的说就是在一个周期内高电平所占用的时间,通过改变脉冲的周期可以调频,改变脉冲的宽度或占空比可以调节驱动上的电压。
将产生的PWM信号接到L298N的ENA和ENB端调节不同的占空比从而调节速度第一种方法用单片机的定时器模拟出PWM。
假如你用定时器延时100ms,在50ms之前某一个引脚为低电平,50ms之后该引脚为高电平,这样高电平占用的时间为1/2,此时该引脚就会产生50%的占空比信号。
程序如下:#include<reg52.h>unsigned chartimer1;sbit PWM=P1^1;void system_Ini(){TMOD|= 0x11;TH1 = 0xfe; //11.0592TL1 = 0x33;TR1 =1;IE=0x8A;}main(){ system_Ini() ;定时器初始化while(1){ if(timer1>100) timer1=0;if(timer1<=30) pwm=0;//产生30%的占空比else PWM=1;}}另一种方法就是利用简单的延时产生PWM方波信号#include<reg52.h>unsigned char count=0;sbit PWM_1=PI^1;//利用P1^1产生PWMvoid mian(){while(1)for(count=0;count<=100;count++) //让单片机记100个数{If(count<=50){ PWM_1=1;}//前一半时间为高电平elsePWM_1=0//后一半时间为低电平这样就产生了50%的占空比}PWM不仅能够控制小车速度还可以控制小灯的亮灭程度,朋友们可以去试试。
水平有限,如果觉得对您有用请您推荐您的朋友关注我们,还请大神们轻喷。
51单片机实现PWM波占空比可调

51单片机实现PWM波占空比可调单片机实现PWM波占空比可调的方法有很多种,下面将详细介绍一种常见的实现方式。
PWM(脉冲宽度调制)是一种常用的数字信号调制技术,可以通过改变脉冲的高电平时间来控制电平的占空比,从而实现对信号的调节。
在单片机中,可以使用定时器/计数器模块来生成PWM波,并通过改变计数器的值来调整占空比。
以AT89C51单片机为例,以下是实现PWM功能的步骤:1.设置定时器模式:选择合适的定时器模式来生成所需的PWM信号。
AT89C51单片机有定时器/计数器模块,可以选择模式2,该模式下定时器有自动重装载功能,能够方便地实现周期性的PWM波。
3. 设置PWM参数:根据需要调节的占空比,计算出所需的高电平时间和低电平时间。
通常,PWM波的高电平时间与低电平时间之和等于一个周期的时间(定时器的重装载值)。
例如,如果需要一个占空比为60%的PWM波,周期为20ms,则高电平时间为「20ms * 60% = 12ms」,低电平时间为「20ms - 12ms = 8ms」。
4.设置PWM引脚:选择一个合适的IO口作为PWM波的输出引脚,并在程序中设置该引脚为输出模式。
5.编写中断服务程序(ISR):针对定时器溢出中断(TOF)编写中断服务程序。
每当定时器溢出时,PWM波应该翻转输出引脚的电平,以实现所需的占空比。
6.初始化定时器和中断:在程序初始化阶段,将定时器设为所需的模式,设置中断向量表中的对应中断服务函数,并开启定时器中断。
7.主循环中设置占空比:在主循环中,通过改变定时器的初值来实现不同占空比的调节。
将计算得到的高电平时间和低电平时间分别赋值给定时器初值,即可实现占空比的调整。
通过上述步骤,我们可以实现占空比可调的PWM波。
在实际应用中,可以根据需要进行适当的优化和改进,例如增加输入口的设置,使得用户可以通过外部按键或旋钮来实时调整占空比,从而更加灵活地控制PWM波的输出。
总结:通过合适的定时器模式、初值设置和中断服务程序编写,配合适当的IO口配置和占空比计算,我们可以在单片机中实现占空比可调的PWM波。
PWM直流电机调速实验报告

直流电机PWM调速模块由测速电路和PWM调速电路两部分组成。模块的电源由接口总线引入。本模块使用的电机为5V直流电机。
1)电机测速部分
①直流电机测速原理介绍
电机测速部分由光电开关完成,电机带动一个周边均匀分布圆孔的金属圆盘,当电机转动时,圆盘跟着一起转动。光源发出的光通过圆孔照射到光电器件上,当圆孔随着电机轴转动时,光电开关可以输出和圆孔数目相同的脉冲,从而测得转速。
3.观察直流电机转速,一段时间后控制在程序设定的值30转/S的左右。
三、实验原理图
四、实验原理
1.PWM的调速原理
PWM调速是通过改变输出脉冲的占空比,从而改变电机转速的一种调速方法。PWM调速分为单极性和双极性两种。在单极性方式下,电机的转动方向不变,改变的只是转速;而在双极性方式下,电机的转动方向和转速都是可变的。本实验是单极性控制,其基本原理如下:
shortdelay(PWMH);
PWM=0;//turn off电机
shortdelay(PWML);
}
}
五、实验结论及讨论
本实验成功实现了直流电机转速的控制,转速设定值为30r/s,通过数码管显示出当前转速,和设定值,利用脉宽调制原理对电机转速进行间接控制。
本实验实现了通过PWM方法使输出电压改变从而改变直流电机转速的目标,并且电机的转速可以显示出来。因此,本实验既达到了动态调节电机转速,又实现了实时检测电机运转情况。
机电一体化实验报告
题目:
PWM直流电机调速实验
学生姓名:
学号:
指导教师:
张友旺
学院:
机电工程学院
专业班级:
机械1604班
日期2019年12月
51系列单片机输出PWM的两种方法

51系列单片机输出PWM的两种方法51系列单片机(如STC89C52、AT89C51等)是一种常用的8位微处理器,具有较高的性价比和广泛的应用领域。
PWM(Pulse Width Modulation)是一种常用的模拟信号生成技术,在很多领域中都有广泛应用,比如电机控制、LED调光等。
在51系列单片机中,有两种常用的方法可以实现PWM输出,分别是软件实现PWM和硬件实现PWM。
下面将详细介绍这两种方法及其实现方式。
1.软件实现PWM软件实现PWM是通过定时器和IO口的相互配合来产生PWM信号。
具体实现的步骤如下:步骤1:设置定时器的工作模式和计数器初值。
选择一个合适的定时器,比如定时器0,然后设置定时器工作模式和计数器初值。
定时器的工作模式选择“模式1”或“模式2”,并根据需求设置计数器初值。
步骤2:设置IO口的工作模式。
选择一个合适的IO口,比如PWM输出口(如P1.2),然后将该IO口设置为输出模式。
步骤3:编写软件控制代码。
在主循环中,通过改变IO口的电平状态来实现PWM输出。
根据定时器的计数值,可以确定PWM信号的占空比大小。
当定时器计数值小于一些阈值时,将IO口置高电平;当定时器计数值大于该阈值时,将IO口置低电平。
通过改变该阈值,可以实现不同的PWM占空比。
通过上述步骤,就可以实现软件控制的PWM输出。
需要注意的是,软件实现PWM的精度较低,同时也会占用较多的处理器时间。
2.硬件实现PWM硬件实现PWM是通过专门的PWM模块或专用的计时电路来实现PWM输出。
具体实现的步骤如下:步骤1:选择一个合适的PWM模块或计时电路。
可以选择专门的PWM模块(如PCA模块)或计时电路(如555计时芯片),根据需求选择合适的硬件模块。
步骤2:设置PWM模块或计时电路的相关参数。
根据需求设置PWM频率、占空比等参数。
步骤3:连接并配置IO口。
将PWM模块或计时电路的输出引脚连接到需要输出PWM信号的IO口,然后将该IO口设置为输出模式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
假如说,第一个灯肯定比第二个灯亮的话,可以直接把8个LED灯的限流电阻弄成不同阻值的。
就像楼上说的那样。
但如果想随便变换不同的灯都能有不同的亮度话,硬件电路可以不变,限流电阻都一样。
可以在程序里这样写:
首先,例如你要最亮的灯先点亮,隔几十微秒后点亮第二个灯,再相隔同样时间点亮第三个灯……依次类推间隔一定时间点亮八个灯。
但间隔时间不要太大,超过十几毫秒就不行了。
然后再间隔相同的时间一次性把灯全关了,再间隔几十微秒回到上面的状态依次点亮灯。
……一直这样循环。
这样的话因为人的视力有一定的滞回效果,只要间隔时间不大,你就能看到八个灯不是闪的,而是同时亮,但亮度又不一样。
这是单片机设计中,PWM控制的思路。
LED PWM调光C程序
#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED1 = P2^0;
sbit LED = P2^1; //定义LED灯,通过LED显示调光效果
sbit LED2 = P2^2;
unsigned char CYCLE; //定义周期该数字X基准定时时间如果是10 则周期是10 x unsigned char PWM_ON ;//定义高电平时间
/******************************************************************/
/* 延时函数&nbs/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
/******************************************************************/
/* 主函数*/
/******************************************************************/
void main()
{
bit Flag;
TMOD |=0x01; //定时器设置in 12M crystal
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定时
IE= 0x82; //打开中断
TR0=1;
CYCLE = 50; // 时间可以调整这个是10调整8位PWM就是256步
while(!Flag)
{
delay(20000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果PWM_ON++; //这个使用较长延时,以便能看清楚变化过程
if(PWM_ON == CYCLE)
{ //这个里可以添加其他程序如到最亮时候控制设备
Flag=1;
}
}
while(Flag) //亮度递减同上,是个相反的过程
{
delay(20000); //延迟时间为20000*=8000us
PWM_ON--;
if(PWM_ON == 0)
{
Flag=0;
}
}
}
/******************************************************************/ /* 定时器中断函数*/
/******************************************************************/ void tim(void) interrupt 1 using 1
{
static unsigned char count;
TH0=(65536-100)/256;
TL0=(65536-100)%256; //定时
if (count==PWM_ON)
{
LED1 = 1;
LED = 1; //灯灭
LED2 = 1;
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //如果开启时间是0 保持原来状态
{
LED1 = 0;
LED = 0; //灯亮
LED2 = 0;
}
}
}
PWM意思是占空比调节!你上面的程序简单的讲就是通过中断系统定时控制输出!然后主函数实现高低电平的时间控制PWM_ON是亮度函数CYCLE是亮度时间控制!你如果想完全了解上面的程序的意思还是自己好好学习一下单片机编程!再说别人的程序只是参考参考就行了!。