免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 947 | 回复: 0
打印 上一主题 下一主题

PWM脉宽调制定时 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:51 |只看该作者 |倒序浏览

//======================================================================

//  工程名称:  PWM.mcp

//  功能描述:  实现占空比为50%PWM输出,按第一、二个键可增加或减少频率

//  IDE环境:   ADS v1.2 TX2440A

//  组成文件:  main.c

//  硬件连接: 

//  维护记录:  Lzy     2011-7-13  V1.0       

//======================================================================

 

#include "2440addr.h"   

#include "string.h"

#include "def.h"

#include "2440lib.h"

 

extern unsigned int PCLK;

 

//====================================================

// 语法格式:void Buzzer_Freq_Set(U32 freq)

// 功能描述: 设置蜂鸣器频率函数

// 入口参数: freq

// 出口参数:

//====================================================

void Buzzer_Freq_Set(U32 freq)

{  

    rTCFG0 &= ~0xff;

    rTCFG0 |= 15;         //prescaler = 15+1  timer0的时钟频率为50M/16 = 3.125MHz

    rTCFG1 &= ~0xf;

    rTCFG1 |= 2;          //mux = 1/8   timer0的时钟频率为50M/16/8 = 0.39MHz    

 

    rTCNTB0 = (PCLK>>7)/freq;  //设置timer0初值

    rTCMPB0 = rTCNTB0>>1;    // 50%

 

    rTCON &= ~0x1f;

   

    rTCON |= 0xb;         //自动重载, 反向关闭, 手动刷新, 启动timer0

    rTCON &= ~2;          //clear manual update bit

}

 

int Main(void)

{

    U16 freq =800;  //默认频率为800;

   

    memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);

 

    /*初始化系统时钟*/

    SetSysFclk(FCLK_400M);      //设置系统时钟 400M    

    ChangeClockDivider(2, 1);      //设置分频 148

    CalcBusClk();                     //计算总线频

 

    rGPFCON = (rGPFCON | 0xFFFF) & 0xFFFF0055;  //GPF0--GPF3设置为output,GPF4--GPF5为输入      

   rGPFUP  = rGPFUP & 0xFFF0;                  //使能GPF上拉电阻

   rGPFDAT = 0xFF;                            //GPF4位初始化为1  

   

    rGPBCON &= ~3;            //设置GPB B0TOUT0输出 PWM输出管脚

    rGPBCON |= 2;

   

    Buzzer_Freq_Set(freq);  

 

    while(1)

    {

        if(!(rGPFDAT & 0x10))           

        {

            if((freq > 20))  //最大频率为2000

            {

                freq -= 10;

                Buzzer_Freq_Set(freq);

               

                rGPFDAT = 0xfe;       //点亮第一个灯 

                Delay(20);

                rGPFDAT = 0xff;              

            }      

        }

       

        if(!(rGPFDAT & 0x20))

        {

            if((freq < 2000))   //最大频率为2000

            {

                freq += 10;

                Buzzer_Freq_Set(freq);

               

                rGPFDAT = 0xfd;       //点亮第二个灯 

                Delay(20);

                rGPFDAT = 0xff;                  

            }

        }

    }

}

 

 

 

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP