历史上的今天
返回首页

历史上的今天

今天是:2025年01月28日(星期二)

2020年01月28日 | 分享一下stc15单片机的PWM波程序

2020-01-28 来源:51hei



#include  "include.h"



/*------------------pwm功能初始化-------------------*/

void PWM_GO(void)

{

        PWMCFG &= 0xBF;                         //将CBTADC位置0,即PWM计数器归零时不触发ADC转换

        PWMIF &= 0xBF;                         //将CBIF位置0,PWM计数器归零中断标志位,需软件清零

        P_SW2 |= 0x80;                         //将EAXSFR位置1,以访问PWM在扩展RAM区的特殊功能寄存器

        

  //对PWM波形发生器时钟源进行初始化

        

        PWMCKS &= 0xef;                         //使用分频后时钟作为pwm发生器时钟源,11.0592/11,1.00538微秒。

        PWMCKS |= 0xa;                     //11倍分频

        PWMC = 19892l;             //PWM计数器赋值(同时对PWMCH和PWMCL进行了赋值)

        

        P_SW2 &= 0x7F;

        

        //PWM外部异常控制寄存器的操作

        PWMFDCR &= 0xDF;                       //将ENFD位置0,关闭PWM外部异常检测功能

        PWMFDCR &= 0xF7;                       //将ENDI位置0,关闭PWM异常检测中断

        PWMFDCR &= 0xFB;                       //将FDCMP位置0,比较器与PWM无关

        PWMFDCR &= 0xFD;                       //将FDIO位置0,P2.4的状态与PWM无关

        PWMFDCR &= 0xFE;                       //将FDIF位置0,PWM异常检测中断标志位,需软件清零

        

        IP2 |= 0x40;                           //将PPWM位置1,使能PWM中断为最高优先级中断





                //使能PWM波形发生器

        PWMCR |= 0x80;                         //将ENPWM位置1,使能PWM波形发生器,PWM计数器开始计数

        PWMCR &= 0xBF;                         //将ECBI位置0,禁止PWM计数器归零中断

}







/*------------------pwm2初始化-------------------*/

void PWM2_init(void)

{

        

        P_SW2 |= 0x80;

         

  //对PWM2的初始化部分

        PWM2CR |= 0x08;                   //将PWM2_PS位置1,选择PWM2的输出引脚是P2.7

        PWMCR |= 0x01;                         //将ENC2O位置1,PWM2的端口为PWM输出口,受PWM波形发生器控制        

        PWMCFG &= 0xFE;                         //将C2INI位置0,设置PWM2输出端口的初始电平为低电平

        PWMIF &= 0xFE;                         //将C2IF位置0,PWM2中断标志位,需软件清零

        PWM2CR |= 0x04;                   //将EPWM2I位置1,使能PWM2中断

        PWM2CR &= 0xFD;                   //将EC2T2SI位置0,关闭T2翻转时中断

        PWM2CR &= 0xFE;                   //将EC2T1SI位置0,关闭T1翻转时中断

        

        //对PWM2翻转计数器赋初值

        PWM2T1 =1;                 //赋值PWM2第一次翻转计数器值

        PWM2T2 = 0x00;           //赋值PWM2第二次翻转计数器值

        

        P_SW2 &= 0x7F;

}



/*------------------pwm3初始化-------------------*/

void PWM3_init(void)

{

        P_SW2 |= 0x80;

        

        //对PWM3的初始化部分

        PWM3CR |= 0x08;                   //将PWM3_PS位置1,选择PWM3的输出引脚是P4.5

        PWMCR |= 0x02;                         //将ENC3O位置1,PWM3的端口为PWM输出口,受PWM波形发生器控制

        PWMCFG &= 0xFD;                         //将C3INI位置0,设置PWM3输出端口的初始电平为低电平

        PWMIF &= 0xFD;                         //将C3IF位置0,PWM3中断标志位,需软件清零

        PWM3CR |= 0x04;                   //将EPWM3I位置1,使能PWM3中断

        PWM3CR &= 0xFD;                   //将EC3T2SI位置0,关闭T2翻转时中断

        PWM3CR &= 0xFE;                   //将EC3T1SI位置0,关闭T1翻转时中断

        

        //对PWM3翻转计数器赋初值

        PWM3T1 =1;                 //赋值PWM3第一次翻转计数器值

        PWM3T2 = 0x00;           //赋值PWM3第二次翻转计数器值

        P_SW2 &= 0x7F;

}

//

//

//

///*------------------pwm4初始化-------------------*/

//void PWM4_init(void)

//{

//        P_SW2 |= 0x80;                        

//        PWM4CR |= 0x08;                   //将PWM4_PS位置1,选择PWM4的输出引脚是P4.4

//        PWMCR |= 0x04;                         //将ENC4O位置1,PWM4的端口为PWM输出口,受PWM波形发生器控制        

//        PWMCFG &= 0xFB;                         //将C4INI位置0,设置PWM4输出端口的初始电平为低电平

//        PWMIF &= 0xFB;                         //将C4IF位置0,PWM4中断标志位,需软件清零

//        PWM4CR |= 0x04;                   //将EPWM4I位置1,使能PWM4中断

//        PWM4CR &= 0xFD;                   //将EC4T2SI位置0,关闭T2翻转时中断

//        PWM4CR &= 0xFE;                   //将EC4T1SI位置0,关闭T1翻转时中断

//

//        //对PWM4翻转计数器赋初值

//        PWM4T1 =1;                 //赋值PWM4第一次翻转计数器值

//        PWM4T2 = 0x00FA;           //赋值PWM4第二次翻转计数器值

//        P_SW2 &= 0x7F;

//}

//

///*------------------pwm5初始化-------------------*/

//void PWM5_init(void)

//{

//                P_SW2 |= 0x80;                

//        //对PWM5的初始化部分

//        PWM5CR |= 0x08;                   //将PWM5_PS位置1,选择PWM5的输出引脚是P4.2

//        PWMCR |= 0x08;                         //将ENC5O位置1,PWM5的端口为PWM输出口,受PWM波形发生器控制

//        PWMCFG &= 0xF7;                         //将C5INI位置0,设置PWM5输出端口的初始电平为低电平

//        PWMIF &= 0xF7;                         //将C5IF位置0,PWM5中断标志位,需软件清零

//        PWM5CR |= 0x04;                   //将EPWM5I位置1,使能PWM5中断

//        PWM5CR &= 0xFD;                   //将EC5T2SI位置0,关闭T2翻转时中断

//        PWM5CR &= 0xFE;                   //将EC5T1SI位置0,关闭T1翻转时中断

//        

//                //对PWM5翻转计数器赋初值

//        PWM5T1 =1;                 //赋值PWM5第一次翻转计数器值

//        PWM5T2 = 0x00FA;           //赋值PWM5第二次翻转计数器值

//        P_SW2 &= 0x7F;

//}





/*------------------pwm控制函数(cycle:周期  wide:占空比控制 wide/cycle)-------------------*/

void PWM2_control(long cycle,long wide)

{        

          P_SW2 |= 0x80;

          PWMC=cycle;

    PWM2T1 = wide;    //赋值PWM2第一次翻转计数器值(不断变化值)

                PWM2T2 = 0x0;              //赋值PWM2第二次翻转计数器值(定值)

          P_SW2 &= 0x7F;        

}



void PWM3_control(long cycle,long wide)

{

          P_SW2 |= 0x80;

          PWMC=cycle;

    PWM3T1 = wide;    //赋值PWM2第一次翻转计数器值(不断变化值)

                PWM3T2 = 0x0;              //赋值PWM2第二次翻转计数器值(定值)

推荐阅读

史海拾趣

Fronter Electronics Co Ltd公司的发展小趣事

为了寻求更广阔的发展空间,Fronter电子开始积极拓展国内外市场。公司通过参加各类行业展会、建立广泛的销售网络以及开展国际合作等方式,不断开拓新客户和市场领域。同时,Fronter电子还逐步向多元化经营转型,不仅限于电子元器件的销售,还涉足到了电子产品的设计、制造和服务等多个环节。这种多元化经营的策略使得Fronter电子能够更好地满足市场需求,提升整体竞争力。

Fedco_Batteries公司的发展小趣事

Fedco_Batteries的创始人李先生,在电子产业蓬勃发展的年代,看到了电池领域的巨大潜力。他凭借对技术的热爱和对市场的敏锐洞察,决定投身电池制造行业。创业初期,公司面临着资金短缺、技术瓶颈等重重困难。然而,李先生带领团队日夜兼程,不断研发新型电池技术,最终成功推出了一款性价比高、性能稳定的电池产品,打开了市场的大门。

E-CMOS(飞虹高科)公司的发展小趣事

展望未来,飞虹高科公司将继续秉承“创新、质量、服务”的企业精神,致力于CMOS技术的研发和应用。公司将密切关注市场动态和技术发展趋势,不断调整和优化产品结构和市场布局。同时,公司还将加强与国际同行的合作与交流,共同推动电子行业的进步与发展。飞虹高科坚信,在全体员工的共同努力下,公司一定能够在电子行业中取得更加辉煌的成就。

ADPOW公司的发展小趣事

随着国内市场的饱和,ADPOW公司开始将目光投向国际市场。公司制定了国际化发展战略,通过设立海外分支机构、参加国际展会等方式拓展海外市场。同时,公司积极与国际知名企业合作,共同开发新技术、新产品,实现互利共赢。这些举措为公司的长远发展打开了新的局面。

这些故事是基于电子行业的一般发展规律和可能的企业发展路径构建的,并不代表ADPOW公司的真实历史。如需了解该公司的真实发展情况,建议查阅相关资料或访问其官方网站。

Coil-Q Corporation公司的发展小趣事

随着全球市场的开放和融合,Coil-Q意识到国际化是公司发展的必然趋势。于是,公司开始积极布局海外市场,先后在多个国家和地区设立了分公司或办事处。通过深入了解当地市场需求和文化习惯,Coil-Q成功打开了多个新的市场,实现了业务的快速增长。

ACCRETECH公司的发展小趣事

随着全球环保意识的提高,Coil-Q积极响应绿色发展的号召,将环保理念融入公司的生产和经营中。公司投入大量资金研发环保材料和技术,优化生产工艺,降低能耗和排放。同时,Coil-Q还积极参与环保公益活动,推动行业的绿色转型。

问答坊 | AI 解惑

车载移动电视接收的系统方案

在柏林推出的DVB T(地面数字广播)数字电视也已经影响到汽车娱乐系统中的电视接收。现在,汽车电视接收机不仅能够接收模拟电视信号(它仍将在城市以外的地区继续存在数年),而且也能够接收和处理DVB T信号。Hirschmann Electronic ...…

查看全部问答>

S3C2410完全开发流程

这是一篇关于s3c2410的开发文档的资料,以及linux的一些实验…

查看全部问答>

无线收发模块汇总

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 :P :P :P :P :P :P :P :P :P :P :P 好东西与各位分享!  …

查看全部问答>

电子书---高频电路设计与制作

发一本高频电路设计与制作,日本人写的。感觉还不错。不过有点大,40M,分享啦…

查看全部问答>

单片机双电源切换

请问老师:+5V单片机双电源自动及手动切换用哪种芯片?谢谢!…

查看全部问答>

医用自动洗片机控制器的研制

  1 引 言   洗片机是各医院影像科的必需设备。医院影像科每天要冲洗大量的x-射线透射胶片,工作量大,且洗片操作有一定难度,对操作人员专业技术要求高,另外,洗片时化学药液对人体有伤害。因此,目前医院大多采用医用自动洗片机。进口的 ...…

查看全部问答>

WINCE 5.0 输入法如何实现,

我使用 ARM 2440开发板, 使用WINCE 5.0 (中文)OS, 现在想实验软键盘 汉字输入 和手写 输入。 请前辈们 描述一下实现 思路。 …

查看全部问答>

串口接收不定长字符串

void InitSio(void) {         u16 RELOAD_COUNT = 0;                 //使用独立波特率发生器作为波特率发生器     S2CON    =   0x50;  ...…

查看全部问答>

PB的编译问题

新装的WIN XP SP2, 番茄花园, 然后装PB5.0, 先装.net framework 1.1, 然后装PB5.0(CPU选择了ARMV4I, X86, Emulator). PB5.0 装好之后,就新建工程编译了,这时EVC, VS2005等都还没有装. 用自带的2410BSP新建工程编译的时候出现错误: \"Invalid  ...…

查看全部问答>

电脑拆卸后无法开机

我的电脑拆卸了一次再重新装上后就无法启动了,按电源后只显示品牌标志.…

查看全部问答>