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单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RSTK1(保持一段时间的高电平)即可实现STC芯片的复位 4.电源电路 电路图:

单片机XTAL引脚引出的晶振分析

51单片机的18,19脚XTAL1,XTAL2用来提供外部振荡源给片内的时钟电路。 XTAL1和XTAL2引脚,该单片机可以使用外部时钟也可以使用内部时钟。 当使用内部时钟时,此二引线端用于外接石英晶体和微调电容; 当使用外部时钟时,用于接外部时钟信号,NMOS接XTAL2,CMOS接XTAL1。 原理: XTAL1和XTAL2分别是一个反相器的输入和输出。NMOS的反相器是

STM32CubeMX 3 解锁PWM模块

今天在底层高手的指导下又学习了PWM模块的配置!汪! 首先打开上次配置好的文件,如下: 然后,我们要用TIM1来进行PWM 的设置: 然后,clock configuration 不用动 然后 双击自动弹出以下,窗口:

STM32F103调试DMA+PWM 实现占空比逐渐增加的软启效果

实现效果:DMA+PWM 实现PWM输出时,从低电平到输出占空比逐渐增加再到保持高电平的效果,达到控制 MOS 功率开关软启的效果。 1.配置时钟 2.TIM 的 PWM 功能配置 选择、配置 TIM 注意:选择 TIM 支持 DMA 控制输出 PWM 功能的通道,有的TIM通道支持PWM 但不支持PWM注意选择。 PWM参数设置 Counter Period :

飞凌单片机开发IDE环境

飞凌单片机 资料下载选择芯片类型:MCU->GPIO选择芯片型号:FM8PE53B IDE工具安装: 资料下载 飞凌官网 选择芯片类型:MCU->GPIO 选择芯片型号:FM8PE53B IDE工具安装: 运行Generic ICE 0.02-250.03 setup,一直点击“下一步”即可。 双击运行:Generic ICE