Chinaunix首页 | 论坛 | 博客
  • 博客访问: 241591
  • 博文数量: 181
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 422
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-09 15:34
个人简介

你好 世界

文章分类

全部博文(181)

文章存档

2016年(181)

我的朋友

分类: 嵌入式

2016-06-06 17:54:28

PWM实验
实验目的:用PWM驱动蜂鸣器发出声音
人耳能听到的频率范围是20 - 20000Hz


一、看原理图
    1. 发现驱动蜂鸣器的引脚是XpwmTOUT0/LCD_FRM/GPD0_0
         我们需要的是XpwmTOUT0功能,用PWM驱动蜂鸣器

二、看芯片手册
    1. 配置GPD0_0引脚为XpwmTOUT0功能
       GPD0CON
       GPD0CON[0]  [3:0]:0x2 = TOUT_0
       GPD0PUD    //禁止上拉电阻
       GPD0PUD[0]  [1:0]:0x0 = Disables Pull-up/Pull-down
    2. 看PWM这一章节芯片手册
       1)看综述(Overview)
                  1. 时钟源:PCLK   100MHz
                  2. Timer0和1共享一个8位的一级预分频器,Timer2.3.4共享另一个一级预分频器
                  3. 每一个定时器都有一个私有的二级分频器,分频系数是2、4、8、16
                  4. TCNTBn控制PWM的周期,TCMPBn寄存器控制占空比,TCNTBn的值第一次需要手动初始化进减法计数器,以后都会自动重装载
       2)根据需要,看引脚描述
       3)根据需要,看时序图
       4)分析要操作的寄存器
    
         Timer Input Clock Frequency = PCLK/({prescaler value + 1})/{divider value}
                                      = 100M / (249+1) / 4
                                      = 100KHZ    10us
          {prescaler value} = 1 to 255 
          {divider value} = 1, 2, 4, 8, 16
         

          TCFG0                  //配置寄存器0,设置一级分频系数
            Prescaler 0  [7:0]:Prescaler 0 value for timer 0 and 1           249
          TCFG1                  //配置寄存器1,设置二级分频系数
            Divider MUX0  [3:0]:0000 = 1/1       
                                 0001 = 1/2 
                                 0010 = 1/4 
                                 0011 = 1/8
                                 0100 = 1/16 
          TCON                   //PWM控制寄存器
          Timer 0 auto reload on/off [3]: 1 = Interval mode (auto-reload)   //自动重装载TCNTB0的值到减法计数器
          Timer 0 manual update      [1]: 1 = Updates TCNTB0 andTCMPB0      //手动装载TCNTB0的值到减法计数器 
          Timer 0 start/stop         [0]: 1 = Starts Timer 0
          TCNTB0                 //决定PWM输出脉冲的周期
          Timer 0 count buffer [31:0]:Timer 0 Compare Buffer register   100 * 10us = 1ms  ==》1000Hz
          TCMPB0                 //决定PWM输出脉冲的占空比
          Timer 0 compare buffer [31:0]:Timer 0 Compare Buffer register 50


点击(此处)折叠或打开

  1. #include "exynos_4412.h"


  2. int main()
  3. {
  4.     /* 1. 配置GPD0_0引脚为PWM功能,并且禁止上下拉电阻 */
  5.     GPD0.CON = GPD0.CON & (~(0xf<<0)) | (0x2<<0);
  6.     GPD0.PUD = GPD0.PUD & (~(0x3<<0));

  7.     /* 2. 配置一级分频系数 */
  8.     PWM.TCFG0 = PWM.TCFG0 & (~(0xff<<0)) | (249<<0);

  9.     /* 3. 配置二级分频系数 */
  10.     PWM.TCFG1 = PWM.TCFG1 & (~(0xf<<0)) | (0x2<<0);

  11.     /* 4. 设置周期和占空比 */
  12.     PWM.TCNTB0 = 100;
  13.     PWM.TCMPB0 = 50;

  14.     /* 5. 手动装载TCNTB0的值到减法计数器 */
  15.     PWM.TCON = PWM.TCON | (0x1<<1);

  16.     /* 6. 关闭手动装载,打开自动重装载 */
  17.     PWM.TCON = PWM.TCON & (~(0x1<<1));
  18.     PWM.TCON = PWM.TCON | (0x1<<3);

  19.     /* 7. 开启timer0 */
  20.     PWM.TCON = PWM.TCON | (0x1<<0);

  21.     while(1);

  22.     return 0;
  23. }
阅读(1283) | 评论(0) | 转发(1) |
0

上一篇:Cortex_A9----ADC

下一篇:Cortex_A9----WDT:看门狗

给主人留下些什么吧!~~