精华内容
下载资源
问答
  • 51单片机定时器产生pwm
    千次阅读
    2021-05-08 08:33:49

    51单片机是可以实现PWM波输出的,原理其实都是一样的。说白了,PWM波就是让某一个引脚输出周期性连续高低电平变化的信号。

    那么如何用51单片机实现周期性的高低电平呢?

    答案就是用定时器。首先我们需要配置一下定时器,这里不做过多阐述,资料到处都有。然后设置一个计数周期,比如说让定时器计一百个数产生溢出,那么这一百个数的时间就是一个周期。接下来我们就以这一百个数的时间为基准。比如设置前五十个数的时间某引脚为高电平,后五十个数为低电平。那么这个引脚就会输出一个占空比为50%的高低电平变化。这就是所谓的PWM波。

    基本代码实现如下:

    sbitPWM=P2^0;//P2.0输出pwm

    int   time;//定义占空比的变量

    void main()

    {

    TMOD=0x01;//定时器0工作方式1

    TH0=0xff;//(65536-10)/256;//赋初值定时

    TL0=0xf7;//(65536-10)%256;//0.01ms

    EA=1;//开总中断

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

    TR0=1;//启动定时器0

    while(1)

        {

               ;

        }

    }

    void tim0() interrupt1

    {

    TR0=0;//赋初值时,关闭定时器

    TH0=0xff;//(65536-10)/256;//赋初值定时

    TL0=0xf7;//(65536-10)%256;//0.01ms

    TR0=1;//打开定时器

    time++;

    if(time>=100)

    time=0;

    if(time<=50)   //占空比%50,可改

    PWM=1;

    else

    PWM=0;

    }

    PWM波可以用来调节速度,角度,灰度等。

    更多相关内容
  • 由于51单片机没有PWM的功能,所以控制舵机等旋转旋转固定角度相对困难,本程序利用定时器模拟一个PWM产生的周期和频率较为准确。
  • 简要说明定时器产生pwm

    定时器产生PWM理论总结通过网上查阅资料了解到定时器产生PWM的方法,在这里记录下来,和大家一起学习。
    ** 方法一 😗
    通过2个定时器实现pwm:

    • timer0可以用来控制工作频率(周期),timer1用来调节占空比,注意timer0计时周期要比timer1时间长,具体为什莫看下去应该就明白了。格式如下:
    void timer0()interrupt 1
    {
    	P0^0=1;
    	TR0=1;//启动定时器1
    }
    void timer1()interrupt 3
    {
    	P0^0=0;
    	TR0=0;
    }
    

    这里我设置timer0计时周期为2ms,timer1计时周期为1ms,便可以实现50%占空比的pwm实现。
    在这里插入图片描述
    ** 方法二:**
    通过1个定时器实现pwm:

    • 这里用timer0为例:
      假设设备的工作频率为1000Hz(周期T=1ms),令T0计时周期为0.01ms
    void timer0()interrupt 1
    {
    	unsigned char count=0;
    	if(count<=49)
    		{
    			P0^0=1;
    			count++;
    		}
    		if(50<=count<100)
    		{
    			P0^0=0;
    			count++;
    		}
    		if(count==100)
    		{
    			count=0;
    		}
    }
    

    图这里就不画了,跟上面的差不多都是50%占空比。如果需要其他占空比,可以对定时器中的条件判断语句进行修改。

    展开全文
  • STC系列51单片机利用PCA定时器产生PWM信号例程,使用STC系列单片机自带PWM功能
  • 使用定时器0做为PWM波的一个周期,然后改变一个周期的高电平和低电平时间,高低电平时间加起来就是一个周期,周期一旦固定好是恒定不变的,改变脉宽宽度(占空比)导通时间的改变,从而实现开关稳压电源输出的改变。...

    PWM即为“脉冲宽度调制”

    脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中

     使用定时器0做为PWM波的一个周期,然后改变一个周期的高电平和低电平时间,高低电平时间加起来就是一个周期,周期一旦固定好是恒定不变的,改变脉宽宽度(占空比)

     GPIO初始化,单片机系统时钟为11.0592MHZ

    #include <STC8G.h>
    
    //系统时钟为11.0592MHZ
    
    #define DOW   P32
    #define UP	  P33
    #define PWM   P54
    
    //引脚初始化
    void GPIO_Init(void)
    {
    	P3M0 &= ~(1<<2);
    	P3M1 &= ~(1<<2);
    	P3M0 &= ~(1<<3);
    	P3M1 &= ~(1<<3);
    	
    	P5M0 |= 1<<4;
    	P5M1 &= ~(1<<4);
    }

     定时器0初始化函数,定时器时间为10us中断一次,中断100次则1ms,即周期是1KHZ

    //定时器0初始化
    void Time0_Init(void)
    {
    	TMOD &= 0xF0;
    	TMOD |= 0x00; //配置定时器0为16位自动重装模式
    //	TH0 = 0xFC; //1ms
    //	TL0 = 0x66;
    	TH0 = 0xFF;   //10us
    	TL0 = 0xF7;
    	TR0 = 1;      //定时器0运行使能
    	ET0 = 1;      //使能定时器0中断
    	EA = 1;       //开启总中断
    }

     按键调节占空比需要定义一个变量,占空比上电默认为10%

    //PWM占空比调整
    unsigned char Dut=10;

    按键调整占空比函数

    //PWM占空比调节按键扫描函数
    void Key_Scan(void)
    {
    	static bit Keyup_Flag=1,Keydow_Flag=1;
    	
    	if(UP != Keyup_Flag)
    	{
    		if(Keyup_Flag == 0)
    		{
    			Dut += 5;			//按键按下每次增加5
    			if(Dut >= 100)
    				Dut = 100;
    		}
    		Keyup_Flag = UP;
    	}
    	
    	if(DOW != Keydow_Flag)
    	{
    		if(Keydow_Flag == 0)
    		{
    			if(Dut != 10)
    				Dut -= 5;      //按键按下每次减少5
    		}
    		Keydow_Flag = DOW;
    	}
    }

    已下是定时器0中断函数,即PWM输出

    void main(void)
    {
    	GPIO_Init();    //引脚配置初始化
    	Time0_Init();   //定时器0初始化
    	
    	while(1)
    	{
    		Key_Scan();
    	}
    }
    
    //定时器0中断服务函数
    void Time0_ISR(void) interrupt 1
    {
    	static unsigned char PWM_CNT=0;
    	static bit PWM_Out=0;  //此变量为在Debug中使用,在实际中是不需要的
    	
    	PWM_CNT++;
    	if(PWM_CNT > Dut)
    	{
    		PWM = 0;
    		PWM_Out = 0;
    	}
    	else
    	{
    		PWM = 1;
    		PWM_Out = 1;
    	}
    	
    	if(PWM_CNT >= 100)
    		PWM_CNT = 0;
    }

    keil仿真输出波形图

    占空比:10%

     占空比:50%

     占空比:95%

    压缩文件下载链接:https://download.csdn.net/download/qq_43265868/86339425?spm=1001.2014.3001.5501

    展开全文
  • 51单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。  用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是...
  • 51单片机定时器PWM波形输出, ///Max_Init_value的大小将影响到PWM ///的频率,其与频率的关系如下: /// Max_Init_value=1/Freq*1000*1000 ///在标准51中,Max_Init_value的值不能 ///过高,因为定时器0的...
  • 利用 51 定时器生成 PWM

    千次阅读 2021-12-14 18:55:19
    利用 51 定时器生成 PWM 1 PWM 简介 PWM(Pulse Width Modulation,脉冲宽度调制)是按一定规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调制方式。 在控制系统中最常用的是矩形波 PWM 信号,在控制时需要...

    利用 51 定时器生成 PWM

    1 PWM 简介

    PWM(Pulse Width Modulation,脉冲宽度调制)是按一定规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调制方式。

    在控制系统中最常用的是矩形波 PWM 信号,在控制时需要调节 PWM 波占空比。如下图所示,占空比是指高电平持续时间在一个周期时间内的百分比。控制电机的转速时,占空比越大,速度越快,如果全为高电平,占空比为 100% 时,速度达到最快。

    当用单片机 I/O 输出 PWM 信号时,可采用以下三种方法:

    • 利用软件延时。当高电平延时时间到时,对 I/O 口电平取反变成低电平,再延时;当低电平延时时间到时,对该 I/O 口电平取反;如此循环,就可得到 PWM 信号。
    • 利用定时器。控制方法同上,只是利用单片机的定时器来定时进行高、低电平的翻转,而不用软件延时。
    • 利用单片机自带的 PWM 控制器。

    2 定时器的应用

    单片机的周期

    • 时钟周期,也成为振荡周期,定义为时钟频率的倒数(单片机外接晶振的倒数,如 12MHz 晶振的时钟周期就是 1/12 us)。它是单片机中最基本、最小的时间单位。在一个时钟周期内,CPU 仅完成一个最基本的动作。
    • 状态周期:时钟周期的 2 倍。
    • 机器周期 T c y T_{cy} Tcy:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作。如取指令、存储器读/写等。机器周期由 12 个时钟周期( 6 个状态周期)组成。
    • 指令周期:指 CPU 执行一条指令所需的时间。指令周期一般包含 1 ~ 4 个机器周期。

    定时器/计数器本质

    定时器/计数器的本质是加 1 计数器(16 位),有高 8 位和低 82 个寄存器组成。TMOD 是定时器/计数器的工作模式寄存器,确定工作方式和功能,TCON 是控制寄存器,控制 T0T1 的启动和停止及设置溢出标志。

    1 计数器输入的计数脉冲的来源:

    • 一个由系统的时钟振荡器输出脉冲经 12 分频后送来
    • 一个由 T0T1 引脚输入的外部脉冲源,每来一个脉冲计数器加 1

    当加到计数器全为 1 时,在输入一个脉冲就使计数器回零,且计数器的溢出使 TCON 寄存器中 TF0TF11,向 CPU 发出中断请求。如果定时器/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。

    定时器定时时间:计数值 N N N × 机器周期 T c y T_{cy} Tcy

    定时器初值

    溢出时计数器的值减去计数初值才是加 1 计数器的计数值。

    定时器一旦启动,它便在原来的数值上开始加 1 计数,若在程序开始时,没有设置 TH0TL0,则默认是 0,假设时钟频率为 12MHz12 个时钟周期为一个机器周期,那么此时机器周期就是 1 us,计满 TH0TL0 就需要 2 16 − 1 2^{16} - 1 2161 个数,再来一个脉冲计数器溢出,随即向 CPU 申请中断,因此溢出一次共需 65536us,约 65.5ms

    如果想要定时 50 ms,那么就需先给 TH0TL0 装入一个初值,在这个初值的基础上计 5000 个数后,定时器溢出,此时刚好就是 50ms 中断一次。当需要定时 1s 时,我们可以产生 2050ms 的定时器中断后,便认为是 1s

    定时器初值计算方法

    当用定时器的方式 1 时,设机器周期为 T c y T_{cy} Tcy,定时器产生一次中断的时间为 t t t,那么需要计数的个数为 N = t / T c y N = t / T_{cy} N=t/Tcy,装入 THX 和 TLX 中的数分别为:

    T H X = ( 65536 − N ) / 256 THX = (65536 - N) / 256 THX=(65536N)/256
    T L X = ( 65536 − N ) % 256 TLX = (65536 - N) \% 256 TLX=(65536N)%256

    3 示例-舵机的驱动

    舵机的原理

    舵机的控制信号,一般是脉宽调制(PWM)信号,如下图,反映了 PWM 信号和舵机转动角度的关系,可以简单的理解为,通过给舵机通电的时间控制,结合角度传感器的反馈信号检测和控制,实现了舵机的精确角度控制。

    舵机的控制信号周期为 20ms 的脉宽调制信号(PWM),其中脉宽从 0.5ms ~ 2.5ms,相应的舵盘位置从 0 ~ 180度,呈线型变化。也就是说,给舵机提供一定的脉宽,输出轴就会保持一定的对应角度,无论外接转矩怎么改变,直到提供另外一个脉冲信号,才会改变输出角度到新的对应的位置上。

    舵机内部有一个基准电路,产生周期为 20ms,宽度为 1.5ms 的脉冲信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。

    伺服电动机的周期通常为 20ms,希望以 50Hz 的频率产生脉冲。

    180 度电机与 360 度电机

    360 度舵机与一般舵机的区别是:给一般舵机一个 PWM 信号,舵机会转到一个特定角度,而给 360 度舵机一个 PWM 信号,舵机会以一个特定的速度转动,类似与电机。但与电机不同的是,360 舵机是闭环控制,速度控制稳定。

    PWM 信号与 360° 舵机转速的关系:

    • 0.5ms ———— 正向最大转速
    • 1.5ms ———— 速度为 0
    • 2.5ms ———— 反向最大转速

    利用 51 单片机驱动舵机

    通过上述分析,可以得出 1ms 对应 90°,那么 0.1ms 对应 。由于驱动舵机的控制信号周期为 20ms,可以将 20ms 的周期信号分为 200 份,那么 1 份代表 0.1ms,相对应舵机的转角为 9°。

    因此,将定时器中断一次的时间设定为 0.1 ms,即定时时间为 0.1ms。采用定时器 1 工作方式 2(8 位初值自动重载)。

    • 计算定时器初值
      1. 机器周期 T c y = 12 × 1 / ( 11.0592 × 1 0 6 ) s T_{cy} = 12 × 1 / (11.0592 × 10^6) s Tcy=12×1/(11.0592×106)s 约等于 1.0851 u s 1.0851 us 1.0851us
      2. 定时时间 t = 0.1 m s t = 0.1ms t=0.1ms
      3. 计数值 N = t / T c y = 0.1 m s / 1.0851 u s = 92 N = t / T_{cy} = 0.1ms / 1.0851 us = 92 N=t/Tcy=0.1ms/1.0851us=92
      4. 装入 THX 和 TLX 的数为: T H X = T L X = 256 − 92 = 164 THX = TLX = 256-92 = 164 THX=TLX=25692=164
    • 代码
    void T1_Init(void)
    {
    	TMOD &= 0x0F;		//设置定时器模式
    	TMOD |= 0x20;		//设置定时器模式	
    	TH1 = 164;			//设置定时初始值
    	TL1 = 164;			//设置定时重载值
    	TF1 = 0;			//清除TF1标志
    	TR1 = 1;			//定时器1开始计时
    }
    
    展开全文
  • 51单片机应用定时器实现pwm输出C语言程序,频率、占空比可调
  • 51单片机定时器0模拟PWM输出C程序例程,适合刚接触PWM波调光、调速等应用场合,程序方便移植,能够直接使用
  • 51单片机实现用一个定时器输出可调PWM
  • 本篇主要讲一下我以初学者的身份对51单片机定时器的了解,并且使用到keil的虚拟示波器,方便大家对PWM有一个感性的认识。
  • 任务要求:使用定时器输出两路不同占空比的PWM波形。 #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include ...
  • STC89c52单片机,利用定时器中断产生PWM信号,控制舵机,涉及到定时器,中断,PWM知识
  • 51单片机利用pwm做出呼吸灯并用串口每隔一秒(用定时器)打印亮度(百分比)于电脑上。
  • 89C51芯片没有自带PWM发生器,如果要用51产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。
  • 利用定时器使无PWM功能的51 单片机产生PWM
  • 51单片机 通过定时器0实现PWM输出 Proteus仿真 实例代码 /*----------------------------------------------- 名称:定时器0 内容:通过定时让LED灯闪烁 ------------------------------------------------*/ ...
  • Protues仿真实例-51单片机-定时器做的可调PWM.rar
  • 51单片机控制io口输出高低电平就可以实现简单的PWM输出,但是这个要占用主循环,非常的不方便使用,本次实验采用的51单片机定时器0,用配置定时器的方式来输出PWM
  • 程序思路:该程序是利用51单片机定时器中断,另外根据音符的频率计算每个音符定时时长从而输出不同音符对应的PWM波驱动蜂鸣器播放音乐。 使用工具:Keil4,protues8;程序具体代码和仿真原理图都已打包放到《基于...
  • 51单片机定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成 定时器作用: (1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作 (2)替代长时间的Delay,提高CPU的运行...
  • 51定时器PWM调节

    2022-04-07 15:46:39
    pwm 原理部分 PWM-脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的...利用定时器0来定时PWM的周期为1ms分成100个单位 定时器1来控制其他的部分 void Timer0_Init(void) { TMOD &am
  • 本程序是用51单片机通过PWM(脉冲宽度调制)方式控制LED,达到呼吸灯的效果。
  • 51单片机模拟输出PWM

    2018-09-05 23:27:37
    89c51单片机通过定时器定时,对IO口进行操作,模拟出PWM信号。
  • 之前写过用内部pwm直接产生脉冲:https://blog.csdn.net/zy19981110/article/details/89446812 这次写的是用定时器,不推薦用延时来模拟。此程序结合了我之前发的矩阵按键程序,按键进行亮度调整。 #include"lcd...
  • 本文使用单片机T2定时器,这个定时器大多数人很少使用它,而却不知道它有一个非常优秀的功能就是定时自动重载功能。利用这个功能能够更为精确的对定时器进行设定,可控制精度在1个机器周期(12M晶振下就是1us),T0、...
  • 干货,干货,代码可用,51单片机按键控制PWM呼吸灯,#include #define uchar unsigned char #define uint unsigned int sbit s1=P3^0; sbit s2=P3^4; sbit s3=P3^5; sbit beep=P2^3; uint pwm; uint num; //延时 ...
  • 【利用51单片机定时器功能产生PWM信号来实现流水呼吸灯。(蓝桥杯常考PWM)】
  • 利用51单片机定时器中断产生占空比可变的PWM

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,770
精华内容 1,108
热门标签
关键字:

51单片机定时器产生pwm