历史上的今天
返回首页

历史上的今天

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

2019年01月26日 | PIC单片机-PWM波

2019-01-26 来源:eefocus

一、编写程序,使用RC2的PWM功能生成频率250Hz的正弦波

#include

 

#define uint8 unsigned char

#define uint16 unsigned int

 

__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位

//WDTE_OFF:disable watchdog timer       看门狗禁止

//LVP_OFF:low voltage programming disabled  低电压编程禁止

//FOSC_HS:high speed crystal/resonator  4M以上晶振选择HS高速

//PWRTDIS:disable power up timer

//BOREN_OFF:disable brown out reset

 

uint8 gDutycount = 0;

const char SINETABLE[40] = {50, 55, 60, 65, 70, 75, 80, 85, 90, 95,

                            100, 95, 90, 85, 80, 75, 70, 65, 60, 55,

                            50, 45, 40, 35, 30, 25, 20, 15, 10, 5,

                            0, 5, 10, 15, 20, 25, 30, 35, 40, 45

                           };

 

/*******************************************************************************

* 函 数 名: PWM_Init(void)

* 函数功能: PWM初始化设置

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void PWM_Init(void)

{

    CCPR1L = 0x7F;      //初始值,通过调节CCPR1L:CCP1[5:4]的值来达到调节占空比的目的

    CCP1CON = CCP1CON | 0x3C;   //CCP1[5:4] = 11

    TRISC2 = 0;         //设置RC2为输出模式

}

 

/*******************************************************************************

* 函 数 名: Time2_Init(void)

* 函数功能: 定时器2初始化

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void Time2_Init(void)

{

    T2CON = 0x0C;       //启用后分频器,分频比1:2,TIMER2计数允许,前置分频器分频比1:1

    PR2 = 255;          //正弦波周期为250Hz

    TMR2IF = 0;         //定时器2中断标志位清零

    GIE = 1;            //开总中断

    PEIE = 1;           //开外设中断

    TMR2IE = 1;         //开定时器中断

}

 

/*******************************************************************************

* 函 数 名: main(void)

* 函数功能: 用PWM输出,调节占空比来调节LED灯的亮度

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

void main(void)

{

    PWM_Init();

    Time2_Init();

    while(1)

    {

    }

}

 

/******************************************************************************

* 函 数 名: Timer2_ISR(void)

* 函数功能: 中断函数

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void interrupt Timer2_ISR(void)

{

    if(TMR2IF)

    {

        ++gDutycount;

        if(gDutycount == 39)

        {

            gDutycount = 0;

        }

        CCPR1L = SINETABLE[gDutycount]; // 根据sin表改变PWM波周期

        TMR2IF = 0;

    }

}

电路接法:

PIC单片机生成正弦波

二、编写程序,实现呼吸灯

利用上述程序,动态改变PWM占空比,以实现动态改变LED供给电压的大小,加以适当延时,即可实现呼吸灯。


跳线接法:取下RC2和RD0的短接帽,用杜邦线一头接RC2里面,一头接RD0外面,再短接P14。


#include

 

#define uint8 unsigned char

#define uint16 unsigned int

 

__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位

//WDTE_OFF:disable watchdog timer       看门狗禁止

//LVP_OFF:low voltage programming disabled  低电压编程禁止

//FOSC_HS:high speed crystal/resonator  4M以上晶振选择HS高速

//PWRTDIS:disable power up timer

//BOREN_OFF:disable brown out reset

 

uint8 gDutycount = 0;

uint16 count = 0 ;

const char SINETABLE[40] = {50, 55, 60, 65, 70, 75, 80, 85, 90, 95,

                            100, 95, 90, 85, 80, 75, 70, 65, 60, 55,

                            50, 45, 40, 35, 30, 25, 20, 15, 10, 5,

                            0, 5, 10, 15, 20, 25, 30, 35, 40, 45

                           };

 

/*******************************************************************************

* 函 数 名: PWM_Init(void)

* 函数功能: PWM初始化设置

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void PWM_Init(void)

{

    CCPR1L = 0x7F;      //初始值,通过调节CCPR1L:CCP1[5:4]的值来达到调节占空比的目的

    CCP1CON = CCP1CON | 0x3C;   //CCP1[5:4] = 11

    TRISC2 = 0;         //设置RC2为输出模式

}

 

/*******************************************************************************

* 函 数 名: Time2_Init(void)

* 函数功能: 定时器2初始化

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void Time2_Init(void)

{

    T2CON = 0x0C;       //启用后分频器,分频比1:2,TIMER2计数允许,前置分频器分频比1:1

    PR2 = 255;          //正弦波周期为250Hz

    TMR2IF = 0;         //定时器2中断标志位清零

    GIE = 1;            //开总中断

    PEIE = 1;           //开外设中断

    TMR2IE = 1;         //开定时器中断

}

 

/*******************************************************************************

* 函 数 名: main(void)

* 函数功能: 用PWM输出,调节占空比来调节LED灯的亮度

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

void main(void)

{

    PWM_Init();

    Time2_Init();

    while(1)

    {

    }

}

 

/******************************************************************************

* 函 数 名: Timer2_ISR(void)

* 函数功能: 中断函数

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void interrupt Timer2_ISR(void)

{

    if(TMR2IF)

    {

        ++count;

        if(count == 75)

        {

            ++gDutycount;

            if(gDutycount == 39)

            {

                gDutycount = 0;

            }

            CCPR1L = SINETABLE[gDutycount]; // 根据sin表改变PWM波周期

            count = 0;

        }

        TMR2IF = 0;

    }

}


推荐阅读

史海拾趣

GarrettCom公司的发展小趣事

并购:2011年,全球领先的信号传输解决方案提供商Belden成功收购了GarrettCom。这一并购标志着GarrettCom正式成为Belden大家庭的一员,也为其带来了更广阔的发展空间和资源支持。

融合:加入Belden后,GarrettCom继续发挥其在工业通信领域的专长,并与Belden的其他业务线形成协同效应。双方共同为客户提供更全面的信号传输和通信解决方案,进一步提升了市场竞争力。

长园维安(CYGWAYON)公司的发展小趣事

长园维安始终关注环保和可持续发展。公司积极推行绿色制造和循环经济模式,降低生产过程中的能耗和排放。同时,长园维安还注重产品环保性能的研发和改进,为客户提供更加环保、节能的产品。这些努力使长园维安在电子行业中树立了绿色发展的典范。

AIM公司的发展小趣事

AIM公司自创立以来,便以其前瞻性的视野和独特的技术理念,在电子行业中崭露头角。创始团队凭借对市场的敏锐洞察和对技术的深刻理解,将公司定位为提供创新解决方案的引领者。在创立初期,AIM便投入大量资源进行技术研发,逐渐在行业中建立了自己的技术优势和品牌形象。

Cree(科瑞)公司的发展小趣事

2015年初,Cree曾计划将其射频产品线独立出来,并以近3.5亿美金卖给英飞凌。然而,由于某些限制原因,收购计划最终终止。面对这一变故,Cree不得不重新建立射频微波器件团队,并创立了新的品牌wolfspeed。这一举措不仅彰显了Cree的应变能力和创新精神,也为其在射频领域的发展注入了新的活力。

ACCUTEK公司的发展小趣事

随着技术的不断进步,ACCUTEK公司意识到要想在竞争激烈的电子行业中脱颖而出,必须不断进行技术创新和产品升级。公司加大了对研发的投入,引进了一批高素质的研发人才,并与多所高校和研究机构建立了合作关系。经过数年的努力,公司成功开发出了多款具有自主知识产权的高精度数控设备,这些产品在市场上获得了广泛好评,为公司的发展奠定了坚实基础。

Cambridge Electronic Industries Ltd公司的发展小趣事

随着公司实力的增强和产品线的丰富,CEI开始积极寻求市场拓展的机会。公司不仅在国内市场取得了显著的成绩,还开始拓展国际市场。CEI与国际电子巨头建立了紧密的合作关系,共同研发新产品,分享技术和市场资源。这些合作不仅提升了CEI的技术水平和市场竞争力,也为其带来了更广阔的发展空间。

问答坊 | AI 解惑

求一基于单片机和LabVIEW制作的数据采集系统设计

内容:本系统由两部分组成,以MCS-51单片机作为下位机采集数据部分设计和 MCS-51与LabVIEW之间数据通讯部分设计。 要求: 1、查阅相关的文献资料,撰写开题报告并完成外文资料翻译。 2、熟练掌握掌握相关元器件的功能,并会加以运用。 3、熟练 ...…

查看全部问答>

关于单片机硬件抗干扰

在研制带处理器的电子产品时,如何提高抗干扰能力和电磁兼容性? 一、下面的一些系统要特别注意抗电磁干扰: 1、微控制器时钟频率特别高,总线周期特别快的系统。 2、系统含有大功率,大电流驱动电路,如产生火花的继电器,大电流开关等。 ...…

查看全部问答>

求助:网页下载

我在evc的模拟器上下载网页,编程中用到套接字,代码如下: WSADATA  wsaData;   if(  WSAStartup(MAKEWORD(2,0),  &wsaData)   ? ?  LOBYTE(wsaData.wVersion)!=  2&n ...…

查看全部问答>

ISP FLASH 擦除失败

按照周公的配置顺序开始擦除 因为Tiny M0没弄复位键 所以擦除时拔掉USB 然后上电 测试过串口可以收发 P0.1接地了 可是还是失败 …

查看全部问答>

2808编译时出现的ERROR请教

在build的时候出现这样的错误: >>   error: illegal relocation type 050002 found in section .debug_info, file             C:\\\\tidcs\\\\DMC\\\\c28\\\\v32x\\\\lib\\\\dmclib\\\\c ...…

查看全部问答>

DSP的归一化

 在DSP中如何对坐标数据进行归一化,有没有函数什么的呀 还有如何将DSP中的数据导出来 放在excel中…

查看全部问答>

“Vds-id”门级电压步步高

运行Vds-id DC ITM漏极[1]扫描电压的默认设置是0-4V,以100 mV为一个步长,同时门极电压有三级:1.5,2.0,2.5V(图1,图2)。当改变这些设置时,请注意,电压和步长的设置可以用于Vds-id-pulse测试的设置。 图1.    &nbs ...…

查看全部问答>

【设计工具】Xilinx 常见问题及答案

问:我在ISE4.1中,用fpga express verilog编译的某些文件,用modelsimxe只能前仿,不能后仿,不知 5.1i是否有改进? 问:和 5.1结合比较好的验证工具除了Modelsim外,PC机上可运行的有什么?  问:ISE在综合的时候,把很多中间信号、特别是组 ...…

查看全部问答>

[haner]第三周、M4在M3基础上的提升

  第三周:试用笔记:分别比较了浮点计算、电机控制、冬眠模式。   直接上附件吧。   视频1楼…

查看全部问答>

ALTERA 官网登陆

为什么每次登陆Altera 官网时总是提示 “您的进程已经过期。请重新登录。” ?…

查看全部问答>