pwm控制蜂鸣器实验(转)

实验名称PWM 控制实验

实验目的熟悉ADS使用,熟悉pwm 的相关控制,实现按键改变蜂鸣器频率

实验原理:

 

 

 

GPB0可以设置成TOUT0,使用PWM的控制改变输出频率

实验步骤:

Main.c 代码如下:

 

#define GPBCON (*(volatile unsigned *)0x56000010)

#define GPBDAT (*(volatile unsigned *)0x56000014)

#define GPBUP  (*(volatile unsigned *)0x56000018)

#define GPFCON (*(volatile unsigned *)0x56000050)

#define GPFDAT (*(volatile unsigned *)0x56000054)

#define GPFUP  (*(volatile unsigned *)0x56000058)

#define TCFG0  (*(volatile unsigned *)0x51000000)

#define TCFG1  (*(volatile unsigned *)0x51000004)

#define TCON   (*(volatile unsigned *)0x51000008)

#define TCNTB0 (*(volatile unsigned *)0x5100000C)

#define TCMPB0 (*(volatile unsigned *)0x51000010)

 

 

 

void timer0_ini(unsigned int temp)

{

       GPBCON &=~3;                     //GPB0设成TOUT0

       GPBCON|=2;

       TCFG0 &=~0xff;

       TCFG0|=15;               //prescaler=15+1

       TCFG1&=~0x0f;

       TCFG1|=2;                 //mux=1/8

       TCNTB0=(100000000)/temp;

       TCMPB0=TCNTB0>>1;   //50%

      

      

      

       /*TCFG0=0x00000018;    //precscaler=24

       TCFG1=0x0;                     //divider value 2     输入时钟频率= PCLK/(precscaler+1)/devider

                                          //                                                             25000/(24+1)/2=100

       TCNTB0=0x0001;            //                                 输出时钟频率=输入频率/TCNTB0

       TCMPB0=0x0002;           //                                 输出占空比=TCMPB0/TCNTB08  */

       TCON&=~0x1f;        //5为清零,不影响其他位

       TCON|=0xb;                     //自动装载,不反向,手动更新,开启timer0

       TCON&=~2;                     //清除更新位

      

}

void key_ini()

{

       GPFCON=0xfcc0;//GPF0,1,2,4设为输入,其他RESERVED

       GPFUP=0xff;//不上拉    

}

 

void Main()

{     unsigned int temp=100;

       key_ini();

       timer0_ini(temp);

       while(1)

       {    

              if((0x02&GPFDAT)==0)

                     {

                            if(temp<1000)

                            temp+=50;

                            timer0_ini(temp);

                     }                                        //GPF1-->K1,低电平 按下

              if((0x10&GPFDAT)==0)

                     {

                            if(temp>100)

                            temp-=50;

                            timer0_ini(temp);

                     }                                      //GPF4-->K2

             

                                  

       }

}           

      

实验心得:

最初本次实验失败,程序运行结果是蜂鸣器以很低的频率响。按键没有效果,调试显示相关的寄存器值都改变,按键值也能读入,temp也可以改变,但是蜂鸣器频率一直不变。后来检查按键时才发现错误,我原来是这么写的:

if((0x02&GPFDAT)==0)

                     {if(temp<1000) temp+=50;}       //GPF1-->K1,低电平 按下

if((0x10&GPFDAT)==0)

                     {if(temp>100) temp-=50;}           //GPF4-->K2

                  timer0_ini(temp);

本意是只要有按键按下,temp改变,就可以改变频率。但是这是在while内,没有按键时,会不停调用timer0_ini(temp),这样可能影响pwm的频率。

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值