ARM 学习笔记七 (PWM试验)

发布者:Qingfang最新更新时间:2016-05-04 来源: eefocus关键字:ARM  PWM试验 手机看文章 扫描二维码
随时随地手机看文章
PWM-脉宽调制。我的理解是通过控制一个计数器来实现不同脉宽的输出,从而驱动蜂鸣器发出不同的声音。

本实验用到的寄存器如下:

GPBCON -- I/O端口配置寄存器 B
           00=Input 01=Output 10=PWM 11=Reserved

GPBDAT -- I/O端口数据寄存器 B

GPFUP --I/O端口上拉电阻使能寄存器 B
          0=Enable 1=Disabled
          
TCFG0 -- 时钟配置寄存器0 (主要是设置预分频)
定时器输入时钟频率=PCLK/{预分频}/{分割值}
{预分频}=1~255
{分割值}=2,4,8,16,32
Address: 0x51000000
Reset value:0x00000000
[7:0]:These 8 bits determine prescaler value for Timer0 and 1

TCFG1 --时钟配置寄存器1(主要是设置分割值)
Address: 0x51000004
Reset value:0x00000000
[3:0]:Select MUX input for PWM Timer0
      0000=1/2  0001=1/4 0010=1/8
      0011=1/16 01XX=External TCLK0

TCON -- 时钟控制寄存器
Address:0x51000008
Reset value:0x00000000
[0]: Determine start/stop for Timer0 (设置启动/停止)
     0=Stop 1=Start for Timer0
[1]: Determine the manual update for Timer0 (设置允许手动修改计数)
     0=No operation 1=Update TCNTB0 & TCMPB0
[2]: Determine the output inverter on/off for Timer0 (设置中断)
     0=Inverter off 1=Inverter on for TOUT0
[3]: Determine auto reload on/off for timer0
     0=One-shot 1=Interval mode(auto reload)
[4]: Determine the dead zone operation
     0=Disable 1=Enable


TCNTB0 -- timer0计数缓存寄存器
Address:0x5100000c
Reset value:0x00000000
[15:0]:Set count buffer value for Timer0

TCMPB0 -- timer0比较缓存寄存器
Address:0x51000010
Reset value:0x00000000
[15:0]:Set compare buffer value for Timer0

实验方法:
1.按下k1键,使TOUT0递增占空比

2.按下k2键,使TOUT0递减占空比

3.按下k3键,停止输出

//代码1---参考阿南的例子,这个简单

#include "2410addr.h"


#define KEY1   (1<<1)  // rGPF[1] =1 ;
#define KEY2   (1<<4)  // rGPF[4] =1 ;
#define KEY3   (1<<2)  // rGPF[2] =1 ;

unsigned short freq =0;

//===========================[ SYSTEM ]===================================================
//static int delayLoopCount = 400;
static int delayLoopCount = FCLK/10000/10;

void Delay(int time)
{
      // time=0: adjust the Delay function by WatchDog timer.
      // time>0: the number of loop time
      // resolution of time is 100us.
    int i,adjust=0;
    if(time==0)
    {
        time   = 200;
        adjust = 1;
        delayLoopCount = 400;
            //PCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
        rWTCON = ((PCLK/1000000-1)<<8)|(2<<3);
        rWTDAT = 0xffff;                              //for first update
        rWTCNT = 0xffff;                              //resolution=64us @any PCLK
        rWTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
    }
    for(;time>0;time--)
        for(i=0;i     if(adjust==1)
    {
        rWTCON = ((PCLK/1000000-1)<<8)|(2<<3);   //Watch-dog timer stop
        i = 0xffff - rWTCNT;                     //1count->64us, 200*400 cycle runtime = 64*i us
        delayLoopCount = 8000000/(i*64);         //200*400:64*i=1*x:100 -> x=80000*100/(64*i)  
    }
}

void PWM_Ini(unsigned short cycle,unsigned short duty){

   if(duty > cycle) duty = cycle;
  
   //定时器输入时钟频率=PCLK/{预分频}/{分割值}   
   rTCFG0 =0x64; //设置预分频为100
   rTCFG1 =0x0;//设置分割值为1/2
  
   rTCNTB0 =cycle; 
   rTCMPB0 =duty;
  
 
   rTCON = 0x0A;//disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, stop timer 0
    //000 01010
   rTCON = 0x09;//disable deadzone, auto-reload, inv-off, no operation, start timer 0
   //1001    
}

void PWM_Stop(){
    freq = 2000;
    rGPBCON = 0x0;
    rGPBDAT = 0x0;   
}

void PWM_Output(int number){
  
   if ( number > 0 ){
      if ( freq < 255 )
         freq += 16;
      else
         freq = 0;
   }
     
   if ( number < 0 ){
      if ( freq >= 16 )
         freq -= 16;
      else
         freq = 0;
   }
  
   rTCMPB0=freq; 
}
   
void Main(void){    

    rGPFUP = 0xf800;//  KEY [7:0] => PU En
    rGPFCON=0xfcc0; //KEY[7:0] => INPUT;
   
    rGPBCON = 0x0;
    rGPBCON = 0x02;//TOUT0为输出端口
   
    PWM_Ini(255,freq);
  
   Delay(0);
  
    while (1){
   
    if ( !(rGPFDAT & KEY1) ){
       Delay(1000);
       //if (rGPGDAT & KEY1) continue;
       PWM_Output(1);
    }
      
    if ( !(rGPFDAT & KEY2) ){
       Delay(1000);
       //if (rGPGDAT & KEY2) continue;
       PWM_Output(-1);
    }
   
    if ( !(rGPFDAT & KEY3) ){
       Delay(1000);
       //if (rGPGDAT & KEY3) continue;
       PWM_Stop();      
    }
      
   }
 }

上面的例子就是按键去抖功能没能调试出来。

//代码2---参考开发板带的例子,这个不好理解

#define GLOBAL_CLK  1

#include "def.h"
#include "2440addr.h"
#include "option.h"


#define KEY1  (1<<1) // rGPF[1] =1 ;
#define KEY2  (1<<4) // rGPF[4] =1 ;
#define KEY3  (1<<2) // rGPF[2] =1 ;


static unsigned int freq;

void PWM_Ini(){

    ChangeClockDivider(3,1); //获得PCLK=67.5MHz
    ChangeMPllValue(127,2,1);
   
    rGPFUP = 0xf800;//  KEY [7:0] => PU En
    rGPFCON=0xfcc0;  //KEY[7:0] => INPUT;
}

void PWM_Stop(){
    freq = 2000;
    rGPBCON = 0x0;
    rGPBDAT = 0x0;   
}

void PWM_Output(int number){

    rGPBCON = 0x0;
    rGPBCON = 0x02;//TOUT0为输出端口
    //rGPBUP  = 0x01;//禁止上拉电阻
   
    //定时器输入时钟频率=PCLK/{预分频}/{分割值}   
    rTCFG0 =0x64; //设置预分频为100
    rTCFG1 =0x0;//设置分割值为1/2 
    
  
   if ( number > 0 ){
      if ( freq < 20000 )
         freq += number;
      else
         freq = 2000;
   }
     
   if ( number < 0 ){
      if ( freq > 300 )
         freq -= number;
      else
         freq = 2000;
   }
     
  
   rTCNTB0 =freq; 
   rTCMPB0 =rTCNTB0>>1;
  
 
   rTCON = 0x0B;//disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
    //000 01011
   rTCON &= ~2;//clear manual update bit
}
   
void Main(void){

    freq = 2000;
   
    PWM_Ini();
  
    while (1){
   
    if ( !(rGPFDAT & KEY1) )
       PWM_Output(100);
      
    if ( !(rGPFDAT & KEY2) )
       PWM_Output(-100);
   
    if ( !(rGPFDAT & KEY3) )
       PWM_Stop();      
      
   }
 }

这个例子每次都要重新设置PGB端口。

关键字:ARM  PWM试验 引用地址:ARM 学习笔记七 (PWM试验)

上一篇:ARM 学习笔记六 (看门狗中断试验)
下一篇:基于MINI2440开发板的LED流水灯实验(含init.s)

推荐阅读最新更新时间:2024-03-16 14:52

ARM的综合实验设计
一、实验目的 学习做一个复杂的应用程序的方法和程序结构,结合应用以前16 次实验所学到的知识,编写一个比较综合的应用。 二、实验内容 用一个列表框作为主菜单,通过键盘可以选择功能,主要的功能有:显示bmp 文件、设定系统时间、USB 下载。同时,使用文本框控件作为系统的一个状态条,显示提示信息和系统的时间。 三、预备知识 1、用ARM SDT 2.5 集成开发环境,编写和调试程序的基本过程。 2、基于操作系统的应用程序的框架结构。 3、会使用Source Insight 3 编辑C 语言源程序 4、会使用消息循环响应键盘消息 5、会使用文本框控件和列表框控件 6、会编写通过USB 连接下载的程序 7、会控制系统的时钟和多线
[单片机]
<font color='red'>ARM</font>的综合实验设计
ARM+Linux中断系统详细分析
ULK第四章里明确讲到 Linux实现了一种没有优先级的中断模型 ,并且 Linux中断和异常都支持嵌套 。这个我不太理解了,这两种说法都与我以前的理解刚好相反,核对了原书,翻译没有错。 Linux中断系统到底是否支持优先级,可否嵌套,中断号又是怎么来确定的,中断产生时又是如何一步步执行到中断处理函数的。为了彻底搞懂Linux中断系统,我决定从最原始材料出发,一探究竟。(s3c2440+linux2.6.21) 先来看看ARM的硬件执行流程 异常是ARM处理器模式分类,ARM有七种运行模式USR,SYS,SVC,IRQ,FIQ,UND,ABT 五种异常模式:SVC,IRQ,FIQ,UND,ABT 中断模式是ARM异常模式
[单片机]
<font color='red'>ARM</font>+Linux中断系统详细分析
ARM嵌入式平台的VGA接口设计
  大多数嵌入式产品的显示终端都选择LCD,但在某些需要大屏幕显示的应用中,工业级LCD的价格比较昂贵,且现有的大屏幕显示器(包括CRT显示器和LCD显示器)一般都采用统一的15针VGA显示接口。三星公司ARM9芯片S3C2410以其强大的功能和高性价比在目前嵌入式产品中得到广泛的应用。笔者在开发基于ARM嵌入式平台的血液流变测试仪的过程中,成功地利用高性能视频D/A转换芯片ADV7120,将S3C2410自带的LCD扫描式接口转换为VGA接口,使之能够驱动VGA接口的显示器。   1 VGA接口介绍   近年来,业界制定出了众多数字化的显示接口协议,较为典型的是DVI(Digital Visual Interface)。
[单片机]
<font color='red'>ARM</font>嵌入式平台的VGA接口设计
ARM AMBA AHB-LITE协议理解
1.AHB总线的特性 主要包括四点:burst 传输,单时钟沿,非三态实现和支持的数据位宽为8/16/32/64/128一直到1024位,但是受限于cpu的总线位宽,如果是32位,则最多支持32位宽,关于Burst传输的含义从别处看到的,如下: Burst传输实质就是只发送一次地址,某些总线发送每个数据都要对应发送其地址。但是Burst传输就是提高了传输效率,在一次传输过程中,只发送一次地址。 但burst传输有应用限制,不是所有传输类型都适合burst传输,一般busrt传输应用在下面三种场景: Flash应用类型 只发送一次地址,之后地址自动累加,直到所有数据发送完成。 Cache应用类型
[单片机]
<font color='red'>ARM</font> AMBA AHB-LITE协议理解
俄乌战争后,ARM的中立性被彻底打破
ARM 一直以来的一个优势是其中立立场,但英国对俄罗斯的新制裁现在已经看到 ARM 技术并不能完全保持中立。为什么 ARM 的中立性很重要,为什么新的制裁会影响 ARM,这些制裁会对 RISC-V 有帮助吗? 为什么 ARM 中立性很重要? 在过去的两年里,电子领域最受关注的话题之一是英伟达试图收购 ARM。自计划收购之日起,政府、企业和个人都出于多种原因表示不赞成此次收购,包括潜在的不公平商业行为、英伟达在竞争对手之前获得技术、英伟达有能力改变 ARM 架构以最适合 Nvidia 技术等等。 然而,最最重要的一个原因是英伟达收购 ARM 可能会使 ARM 失去中立性。与大多数商业处理器技术不同,ARM 对中立性有着严
[半导体设计/制造]
ARM调查显示机器人将带来协助而非取代人类
   ARM 日前宣布根据委托第三方针对全球近4,000名消费者进行的独立调查显示,仅少数受访者认为人工智能(AI)的发展将导致 机器人 大肆盛行,取代人类就业。下去吗就随工业控制小编一起来了解一下相关内容吧。   考虑到AI将在未来逐渐融入日常生活,30%的消费者认为这项发展最不利的因素是人类的工作变少或被迫转行。但多数受访者仍抱持正面态度,认为机器人不会取代人类,而是增进人类多数工作的效率,并协助执行更多繁冗且危险的任务。   ARM全球营销暨品牌传播副总裁JoyceKim表示,调查结果显示普遍对AI的乐观以及其对可能带来的商机非常振奋人心,但只触及了AI所具备潜力的冰山一角,仍有庞大的潜力尚待发掘。AI确实会颠覆就业生态,但
[嵌入式]
基于ARM9处理器S3C2410的LCD显示系统设计
引言 S3C2410是三星公司生产的基于ARM920T内核的RISC微处理器,其主频可达203MHz ,适用于信息家电、PDA、手持设备、移动终端等领域,本文介绍了基于S3C2410的显示系统的硬件电路及驱动软件设计方法。 TFT-LCD模块的时序要求 本显示模块选用的LQ080V3DG01是Sharp公司的TFT-LCD器件,该器件的分辨率为640%26;#215;480,控制时序图如图1所示,时间参数如表1所列 。    硬件电路设计 在该显示系统的硬件电路中,S3C2410与LCD模块的连接是关键,S3C2410内部自带一个LCD驱动控制器,其接口可以与单色、
[应用]
ARM发布静态存储控制器,提供灵活全面的存储接口
ARM公司日前发布了一系列全新的PrimeCell AMBA 3 AXI静态存储控制器,以此全面支持新的和即将出现存储设备,包括NAND闪存、 NOR闪存, SRAM和高性能仿静态RAM(CellularRAM)设备。 PrimeCell AXI静态存储控制器向设计师提供了单一的IP解决方案,用于使用了CellularRAM和闪存的系统。结合了现有的支持DDR和移动DDR的PrimeCell AXI动态存储控制器,对DDR2的支持也在开发过程中,ARM公司目前已经可以向广泛的应用提供一个完整的、高性能的存储控制器解决方案。 PrimeCell AXI静态存储控制器是可配置的,在保持低成本和PrimeCells预先验证低风险的同
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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