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

#include <htc.h>#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 resetuint8 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;
    }
}

电路接法:

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

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

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

#include <htc.h>#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 resetuint8 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;
    }
}

PIC单片机-PWM波相关推荐

  1. PIC单片机之PWM PWM原理

    1,什么是PWM      什么是PWM,专业点说脉宽调制,通俗点说 就是不断的输出高低电平. 比如 单片机 40ms的时间 输出高电平然后60ms的时间 输出低电平接着一直不断周期性的交替输出高低电 ...

  2. STM32单片机一个定时器输出不同频率PWM波

      在使用STM32单片机输出PWM波形的时候,通常可以直接使用定时器提供的PWM模式.可以通过自动重装载寄存器(TIMx_ARR)来设置定时器的输出频率,然后通过捕获/ 比较寄存器 1(TIMx_C ...

  3. STM32F103单片机生成16路PWM波

    单片机输出pwm波在项目中是恨常用的一个功能,今天就总结一下用STM32F103C8T6单片机输出16路 pwm波. 使用keil5软件,用标准库函数来实现. 首先看定时器初始化 void TIM1_ ...

  4. STM32单片机:定时器TIM输出PWM波

    学习32单片机过程中使用的工具:MDK Keil5 + 正点原子精英版(STM32F103ZET6)+ STM32CubeMX + HAL开发 一.PWM的产生原理 关于PWM的产生原理网上有很多教程 ...

  5. STM32 cubeMX下配置STM32单片机使无源蜂鸣器输出PWM波并放音乐

    1.首先我们要了解定时器(timer) timer分为三种:高级定时器(tim1,tim8),基本定时器(tim6,tim7),通用定时器(tim2,tim3,tim4,tim5). 基本定时器:它有 ...

  6. spwm单片机4路输出C语言,基于PIC单片机的正弦波逆变器设计与实现

    描述 目前,SPWM信号主要有3种生成方式: 1)使用比较器.振荡器等模拟电路产生三角波和方波进行比较,产生SPWM波,但是此种方法电路复杂,受元器件精度影响大,且不易控制: 2)利用专用SPWM集成 ...

  7. PIC单片机(PIC16F873)小项目五(电路工作原理)

    怎么上传图片呀? 1.系统简介 本系统为xxx检测仪,用于检测xxx载重量,并以模拟输出量形式把载重量传递给主控制系统. 检测仪根据电梯轿底橡胶块随载重做弹性变化的原理,通过霍尔传感器检测其位移变化且 ...

  8. ioca0中断 pic单片机_关于PIC单片机的一些经验总结 -单片机-电子工程世界网

    为了给前一段时间学习PIC16F616型单片机的一个总结和方便大家的交流,我写了这篇关于PIC单片机的学习心得,都是在看了手册和编程调试后用自己的语言组织的,其中有不足或者有疑问的地方希望大家能及时的 ...

  9. stm32f4 输出pwm波_stm32的pwm输出代码及注释

    stm32是非常常用的单片机.脉冲宽度调制(PWM),是英文"Pulse WidthModulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非 ...

最新文章

  1. 《Ext JS权威指南》节选:在Visual Studio中实现Ext JS智能提示
  2. 作业06-接口、内部类
  3. Ubuntu 16.04修改显示字体大小(包括GNOME/Unity)
  4. 组件面板 html 页面,Html - Bootstrap Panel面板
  5. Socket IO与NIO(三)
  6. 如何启动免安装版Tomcat并将Tomcat添加到服务中
  7. 博思得标签打印机驱动_惠普LaserJet 5200n驱动-惠普HP LaserJet 5200n打印机驱动下载 v61.074.561.43官方版...
  8. tensorflow之数据加载
  9. 07 -模型层ORM
  10. GoF的23种设计模式
  11. 三天掌握三菱FX系列PLC视频教程-IT学院-专题视频课程
  12. 一文读懂 delete和delete[ ]
  13. Photoshop for Mac(图像处理软件)破解版安装
  14. 【原理图专题】OrCAD Capture CIS中元件产生A,B属性解决办法
  15. 微应用 qiankun 项目搭建
  16. 深度好文:一篇Paper带您读懂HTAP | StoneDB学术分享会第①期
  17. Framer X 21 特别版 Mac 强大的移动应用交互原型设计神器工具
  18. 运动型蓝牙耳机怎么佩戴的,运动蓝牙耳机的不同款式盘点
  19. caj转换word转换器怎么操作?
  20. [Bash]LeetCode195. 第十行 | Tenth Line

热门文章

  1. 抖音怎么实现落地页跳转微信加好友?
  2. Graphite 介绍
  3. 如何批量将 Word 文档转为 ePub 格式
  4. 谷歌地图JavaScript API第3版 地理编码服务
  5. php slim get,php – 在Slim上获取请求参数
  6. getchar()和gets()
  7. 职业规划以兴趣为导向,而不是盲目跟风
  8. bat 脚本修改IE浏览器代理服务器
  9. 计算机睡眠状态能挂游戏,windows10睡眠挂游戏
  10. 了解MVC模式与MVC框架