PIC单片机-PWM波

2023-12-24 00:08
文章标签 单片机 pwm pic

本文主要是介绍PIC单片机-PWM波,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、编写程序,使用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;
    }
}

电路接法:PIC单片机生成正弦波

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

利用上述程序,动态改变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波的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/529934

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

STM32单片机PWR电源控制详解

文章目录 1. PWR概述 2. 电源结构框图 3. 上电复位和掉电复位 4. 可编程电压监测器 5. 低功耗模式 6. 模式选择 6.1 睡眠模式 6.2 停止模式 6.3 待机模式 7. 代码示例 1. PWR概述 PWR(Power Control)电源控制,负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能。 可编程电压监测器

【单片机毕业设计选题24024】-房间自动除湿控制系统

系统功能: 系统分为手动和自动模式,上电默认为自动模式。自动模式下如果获取到湿度 值大于设定的湿度值则自动打开风扇,手动模式下手动开关风扇。 系统上电后显示“欢迎使用除湿控制系统请稍后”,两秒钟后进入主页面显示。 第一行显示系统模式,手动或自动模式 第二行显示获取到的温湿度 第三行显示设置的湿度阈值 第四行显示风扇状态和系统报警状态,风扇状态有开关状态,系统状态和OK和 NG状态。

STM32G030F6使用CubeMx配置PWM实验

1. 使用 CubeMx 创建 PWM 工程 打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject. 配置定时器 配置定时器1的通道1和通道2 产生PWM; 设置定时器1的主频:设置了( 63 + 1) 分频即定时器主频为1M 设置PWM定时的周期计数为 1000 即 1000HZ 设置通道一 翻转的计数值为 500 即

基于51单片机抽奖系统

基于51单片机抽奖系统 (仿真+程序) 功能介绍 具体功能: 1.利用5片74HC495对单片机的IO进行串并转换,进而控制5个1位数码管; 2.采用一个独立按键用于抽奖系统的启停控制; 3.8位拨码开关是用于设定随机数发生器的“种子值”(初始值); ​演示视频: 基于51单片机抽奖系统  添加图片注释,不超过 140 字(可选) 程序 #inclu

江协科技51单片机学习- p16 矩阵键盘

🚀write in front🚀   🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​  💬本系列哔哩哔哩江科大51单片机的视频为主以及自己的总结梳理📚  前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习

【深海王国】小学生都能玩的单片机?零基础入门单片机Arduino带你打开嵌入式的大门!(8)

Hi٩(๑o๑)۶, 各位深海王国的同志们,早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督继续为大家带来系列——小学生都能玩的单片机!带你一周内快速走进嵌入式的大门,let’s go! (8)软串口与SoftwareSerial库使用 在第六节中我们提到了,如果我们Arduino开发板的0、1号引脚接线了,即硬件串口被占用了,想给Arduino下载程序,就需要先

江协科技51单片机学习- p11 Proteus安装模拟51单片机

前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用: Proteus快速入门(最详细教程)-CSDN博客  数码管显示: 【51单片机实验笔记】LED篇(三) 数码管的基本控制_51单片机数码管-CSDN博客 https

51单片机STC89C52RC——6.1 中断系统

一,文字层面理解          反正我看下面的几段文字时脑壳没有正常运转。一个头几个大         中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。         当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件