S3C2440的PWM及定时器的使用

发布者:纯真年代最新更新时间:2016-11-21 来源: eefocus关键字:S3C2440  PWM  定时器 手机看文章 扫描二维码
随时随地手机看文章

  s3c2440芯片中一共有5个16位的定时器,其中有4个定时器(定时器0~定时器3)具有脉宽调制功能,即他们都有个输出引脚,可以通过定时器来控制引脚周期性的高低电平变化,定时器4没有输出引脚。上次脱机运行PWM测试程序实验的时候就用到了这块,所以这次将PWM和定时器放在一起来学习。

       定时器部件的时钟源为PCLK,首先通过两个8位预分频器降低频率,定时器0和1共用第一个预分频器,2,3,4共用第二个预分频器。预分频器输出接入第二级分频器,可以生成5种分频信号(1/2,1/4,1/8,1/16,TCLK),其中8位预分频器是可编程,根据装载值来分频PCLK,值储存在TCFG0和TCFG1中。

       定时器内部控制逻辑工作流程如下:

1.程序初始,先设置TCMPBn、TCNTBn这两个寄存器,分别表示定时器n的比较值和初始计数值。

       2.然后设置TCON寄存器启动定时器n,这时TCMPBn、TCNTBn值将被装入内部寄存器TCMPn、TCNTn。在定时器n的工作频率下,TCNTn开始减1计数,其值可以通过读取TCNTOn得知。

       3.当TCNTn值等于TCMPn值的时候,定时器n的输出管脚TOUTn反转;TCNTn继续减1计数。

       4.当TCNTn值为0,输出管脚TOUTn再次反转,并触发定时器n中断(中断使能)。

       5.当TCNTn值为0,如果在TCON寄存器中将定时器n设为自动加载,则TCMPBn、TCNTBn值将被自动装入内部寄存器TCMPn、TCNTn中,进入下一个计数流程。

       定时器n的输出管脚TOUTn初始状态为高电平,然后会两次反转,也可以通过TCON寄存器设定其初始电平,这样输出就完全反相了。通过设置TCMPBn、TCNTBn可以设置TOUTn输出信号的占空比,这样就是所谓的PWM。这里PWM的原理就不做介绍了。

       下面介绍定时器的几种重要寄存器,每一种我们都以定时器0为例。

1.      TCFG0寄存器



[7:0],[15:8]各8位分别被用于控制预分频器0,1,值为0~255。经过预分频器出来的时钟频率为:PCLK/(prescaler+1)。

 

 

2.      TCFG1寄存器


经过预分频器得到的时钟将进入2次分频,这个寄存器就是设置2次分频系数的。这样定时器的工作频率为:PCLK/(prescaler+1)/(divider value),其中prescaler=0~255,divider value=2,4,6,8。

 

3.      TCON寄存器


TCON寄存器位[3:0]、[11:8]、[15:12]、[19:16]、[22:20]分别用于定时器0~4,位[4]为死区使能位,[7:5]为保留位。除了定时器4没有输出反转位外,其他位功能相似,这里以定时器0为例加以说明。位[0]开启停止位:0停止定时器,1开始定时器。[1]手动更新位:0无用,1将TCNTBn/TCMPBn寄存器的值装入内部寄存器TCNTn\TCMPn中。[2]输出反转:0不反转,1反转。[3]自动加载:0不自动加载,1自动加载。

 

 

 

4.      TCNTBn/TCMPBn寄存器


 

5.      TCNTOn寄存器

      

下面就具体介绍如何实现PWM功能。

1、PWM是通过引脚TOUT0~TOUT3输出的,而这4个引脚是与GPB0~GPB3复用的,因此要实现PWM功能首先要把相应的引脚配置成TOUT输出。

2、再设置定时器的输出时钟频率,它是以PCLK为基准,再除以用寄存器TCFG0配置的prescaler参数,和用寄存器TCFG1配置的divider参数。

3、然后设置脉冲的具体宽度,它的基本原理是通过寄存器TCNTBn来对寄存器TCNTn(内部寄存器)进行配置计数,TCNTn是递减的,如果减到零,则它又会重新装载TCNTBn里的数,重新开始计数,而寄存器TCMPBn作为比较寄存器与计数值进行比较,当TCNTn等于TCMPBn时,TOUTn输出的电平会翻转,而当TCNTn减为零时,电平会又翻转过来,就这样周而复始。因此这一步的关键是设置寄存器TCNTBn和TCMPBn,前者可以确定一个计数周期的时间长度,而后者可以确定方波的占空比。由于s3c2440的定时器具有双缓存,因此可以在定时器运行的状态下,改变这两个寄存器的值,它会在下个周期开始有效。

4、最后就是对PWM的控制,它是通过寄存器TCON来实现的,当不想计数了,可以使自动重载无效,这样在TCNTn减为零后,不会有新的数加载给它,那么TOUTn输出会始终保持一个电平(输出反转位为0时,是高电平输出;输出反转位为1时,是低电平输出),这样就没有PWM功能了,因此这一位可以用于停止PWM。

       总的来说PWM功能其实就是对2440定时器的应用。

       下面我们来分析上次脱机运行PWM测试程序中没有分析的Buzzer_Freq_Set函数。函数如下:

       void Buzzer_Freq_Set( U32 freq )

{

       rGPBCON &= ~3;                  

       rGPBCON |= 2;

       rTCFG0 &= ~0xff;

       rTCFG0 |= 15;                  

       rTCFG1 &= ~0xf;

       rTCFG1 |= 2;                    

       rTCNTB0 = (PCLK>>7)/freq;

       rTCMPB0 = rTCNTB0>>1;   

       rTCON &= ~0x1f;

       rTCON |= 0xb;                 

       rTCON &= ~2;                

}

      

首先rGPBCON &= ~3;其他位不变,只是把最低2位清0。

rGPBCON |= 2;最低2位赋值为10。

这两句话的作用是让GPBCON寄存器最低两位为10,即配置GPB0为复用功能TOUT0作为PWM输出。

rTCFG0 &= ~0xff; TCFG0寄存器低8位清0,即使用定时器0。

rTCFG0 |= 15;赋值给TCFG0寄存器低8位,prescaler = 15。

rTCFG1 &= ~0xf; TCFG1只是最低4位清0,使用定时器0。

rTCFG1 |= 2;定时器0二次分频divider value=8。

rTCNTB0 = (PCLK>>7)/freq;这里是配置计时器的计数缓冲寄存器,让PCLK/2^7/freq得到完成一个PWM周期需要计数值。因为通过前面的设置,我们知道定时器的工作频率=PCLK/(15+1)/8=PCLK/(2^7),即PCLK>>7,所以定时器工作频率/PWM freq(PWM周期/定时器计一次数的周期)=计数值。

rTCMPB0 = rTCNTB0>>1; 这里是配置计时器的比较缓冲寄存器,让比较值为初始值的一半,即设定了PWM的占空比为50%。

rTCON &= ~0x1f; 和rTCON |= 0xb;这两句同上,给TCON最低5位赋值,开启定时器,第一次使用定时器手动更新以便装入TCNTB0和TCMP0的值,关闭反相器,自动加载,disable 死区。

rTCON &= ~2;   清0手动更新位。

这就完成了PWM的设置。

当我们完成试验退出时用到Buzzer_Stop函数,我们来看这个函数:

void Buzzer_Stop( void )

{

       rGPBCON &= ~3;

       rGPBCON |= 1;

       rGPBDAT &= ~1;

}

 

rGPBCON &= ~3;和rGPBCON |= 1;这两句上面已经分析过,是配置GPBCON的,不同是这次让GPBCON最低两位为01,即作为输出功能,不再作为PWM的TOUT了。

rGPBDAT &= ~1;即GPB0输出0,蜂鸣器不发声。

至此PWM蜂鸣器发声实验就分析完了。后面使用蜂鸣器唱歌等实验原理相似,只不过调整声音频率和对于声音频率的延时时长的控制,后面不做分析了。


关键字:S3C2440  PWM  定时器 引用地址:S3C2440的PWM及定时器的使用

上一篇:S3C2440的ADC程序
下一篇:S3C2440定时器0 的初始化程序

推荐阅读最新更新时间:2024-03-16 15:21

西门子S7系列的保持型接通延时定时器介绍
保持型接通延时定时器时序如下: 例3.2.4 STL语句表如下: A I 0.0 L S5T#2s 装入定时时间到ACCU1 SS T5 启动保持型延时接通定时器T5 A I 0.1 R T 5 定时器T5复位 A T 5 = Q 4.0 FBD 功能图如下: 时序图如下:
[嵌入式]
西门子S7系列的保持型接通延时<font color='red'>定时器</font>介绍
PFC和PWM开关电源控制器
    Micro Linear公司的8引脚封装功率因数校正(PFC)和脉冲宽度调制(PWM)电源控制器ML4803,为设计低输入电流谐波畸变的高品质开关电源(SMPS)提供一切所必需的功能,使其元件数量明显减少,成本降低。     根据IEC1000-3-2规范要求,SMPS必须采取谐波抑制措施。Bi-CMOS ML4803采用多项专利技术,将PFC与PWM控制器二合一集成到同一芯片上,并使二者同步化,把引脚由原先的至少16个减少到8个,成为目前引脚最少的PFC和PWM混合型IC。     ML4803采用先进的AC输入电流整形技术,内含平均电流(或峰值)升压型前沿PFC。ML4803的PFC控制器,由新发明的
[应用]
基于S3C2440的嵌入式Linux驱动——看门狗(watchdog)驱动解读
本文将介绍看门狗驱动的实现。 目标平台:TQ2440 CPU:s3c2440 内核版本:2.6.30 1. 看门狗概述 看门狗其实就是一个定时器,当该定时器溢出前必须对看门狗进行 喂狗“,如果不这样做,定时器溢出后则将复位CPU。 因此,看门狗通常用于对处于异常状态的CPU进行复位。 具体的概念请自行百度。 2. S3C2440看门狗 s3c2440的看门狗的原理框图如下: 可以看出,看门狗定时器的频率由PCLK提供,其预分频器最大取值为255+1;另外,通过MUX,可以进一步降低频率。 定时器采用递减模式,一旦到0,则可以触发看门狗中断以及RESET复位信号。 看门狗定时器的频率的计算公式如下
[单片机]
基于<font color='red'>S3C2440</font>的嵌入式Linux驱动——看门狗(watchdog)驱动解读
STM32学习--PWM测试
  今天针对通用定时器的输入捕获和PWM输出进行了学习测试,使用库函数进行。 1. PWM输出测试 1.1 测试方法   输出测试使用软件调试方法,直接在MDK调试界面的逻辑分析仪进行。软件调试设置网上一堆一堆的,我只描述一下遇到问题点。   图中,软件仿真只用设1、2项,加入硬件调需设第3项。 打开逻辑分析仪,在setup中输入想看的端口,如下图设置。   在端口号上右击,选择bit,然后运行即可看PWM输出的效果。 1.2测试的程序 ① GPIO设置,主要是时钟、复用时钟、推挽输出、由于用默认的映射所以不用GPIO_PinRemapConfig。 void PWMOut_GPIO_Init() { GP
[单片机]
STM32学习--<font color='red'>PWM</font>测试
基于555定时器构成的多谐振荡器的应用
1.引言 繁华的都市,当夜幕降临时,五缤纷的彩灯灯便亮了起来,点亮这个黑暗的世界,给人民生活增添一点情趣,而流水灯是其中的角色之一。随着技术的不断发展,控制彩灯的电路不断更新,这里主要介绍由555定时器构成的流水灯控制电路。 2.555定时器 2.1 555定时器的内部结构(如图1所示):     (1)分压器 ①5脚悬空时。 ②5脚外接控制电压时。 (2)电压比较器 电压比较器C1和C2是两个结构完全相同的理想运算放大器。比较器有两个输入端,分别用1和0表示相应输入端上所加的电压,用表示比较器的比较结果(1代表高电平,0代表低电平)。 (3)基本RS触发器     (4)放电三极管 V1是一个集电极开路的放电三极管。当时,V
[电源管理]
基于555<font color='red'>定时器</font>构成的多谐振荡器的应用
基于嵌入式的远程监控系统的设计
 对图像监控系统,用户常常提出这样的功能需求:希望能够监控距离较远的对象。这些对象有可能分布在郊区、深山,荒原或者其他无人值守的场合;另外,希望能够获取比较清晰的监控图像,但对图像传输的实时性要求并不高,很明显,用传统的PC机加图像采集卡的方式很难满足这样的需求。 在嵌入式领域,ARM9系列微处理器在高性能和低功耗方面提供了最佳的性能,因此选用ARM9嵌入式处理器S3C2440设计实现了一个远程图像光线监控系统通过这个系统,可以远在千里之外控制一个摄像机进行图像采集并回传。如果这个摄像机有一个485接口的云台,还可以通过互联网远程控制摄像机的取景角度、镜头拉伸、聚焦等功能。 除了获取图像数据.系统还提供了多路开关控制和 数
[单片机]
基于嵌入式的远程监控系统的设计
定时器计数、定时器中断函数、while(1)之间如何协调、工作?
51单片机程序,使用定时器时,定时器计数、定时器中断函数、while(1)循环三者之间如何协调好整个流程? 我拿一个最经典的单片机应用——‘流水灯’来分析吧。 【定时器0实现间隔1s的流水灯】简单示例 #include reg52.h typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define LED P3 bit LED_flag=0; //定时到1s的标志位 u8 n; //循环变量,用作LED总线的位索引index void InitTimer0(void); //定时器0,初始化 void mai
[单片机]
中断及定时器的应用
#include reg51.h #define uchar unsigned char #define uint unsigned int sbit K1=P3^7; uchar i,second_count, key_flag_idx; bit key_state; uchar dsy_code ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delayms(uint ms) { uchar i; while(ms--) for(i=0;i 120;i++); } void key_event_handle() { if(k
[单片机]
中断及<font color='red'>定时器</font>的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved