10、PIC系列-输出比较-PWM脉宽调制模式

发布者:创意小巨人最新更新时间:2022-07-26 来源: csdn关键字:PIC系列  输出比较  PWM 手机看文章 扫描二维码
随时随地手机看文章

1、PIC32参考资源

PIC32系列参考手册 中文版  链接地址:PIC32系列参考手册 第16章 输出比较


2、脉宽调制模式介绍

当控制位 OCM<2:0> (OCxCON<2:0>)被设置为 110 或 111 时,选定的输出比较通道被配置为 PWM (脉宽调制)工作模式。有以下两种 PWM 模式可供使用:


• 不带故障保护输入的 PWM


• 带故障保护输入的 PWM


第二种 PWM 模式需使用 OCFA 或 OCFB 故障输入引脚。在该模式下,OCFx 引脚上的异步逻辑电平 0 会使选定的 PWM 通道关闭。


在 PWM 模式下, OCxR 寄存器是只读从占空比寄存器, OCxRS 是缓冲寄存器,由用户写入数据来更新 PWM 占空比。在每次发生定时器与周期寄存器的匹配事件时 (PWM 周期结束),占空比寄存器 OCxR 会装入 OCxRS 的内容。 TyIF 中断标志在每个 PWM 周期边界处置为有效。


3、输出比较模块配置为 PWM 操作步骤

1. 通过写选定的定时器周期寄存器 (PRy),设置 PWM 周期。


2. 通过写 OCxRS 寄存器设置 PWM 占空比。


3. 向 OCxR 寄存器中写入初始占空比。


4. 如果需要,允许定时器和输出比较模块的中断。如果要使用 PWM 故障引脚,则必须设置输出比较中断。


5. 通过写输出比较模式位 OCM<2:0>(OCxCON<2:0>),将输出比较模块配置为两种 PWM工作模式中的一种。


6. 设置 TMRy 预分频值,并通过设置 TON (TxCON<15>) = 1 使能时基。


特别注意:在第一次使能输出比较模块之前,必须先初始化 OCxR 寄存器。当模块工作于 PWM模式时,OCxR 寄存器变为只读占空比寄存器。OCxR 中保存的值成为第一个 PWM周期的 PWM 占空比。占空比缓冲寄存器 OCxRS 的内容在发生时基周期匹配之后才会被传送到 OCxR。


4、PWM 输出波形

带故障保护输入引脚的 PWM


输出比较模式位 OCM<2:0>(OCxCON<2:0>)被设置为 111 。


故障保护通过 OCFA 和 OCFB 引脚提供。OCFA 引脚与输出比较通道 1 至 4 关联,而 OCFB 引脚与输出比较通道 5 关联。


如果在 OCFA/OCFB 引脚检测到逻辑 0,则选定的 PWM 输出引脚被置为高阻抗状态。PWM 输出立即关闭,不连接到器件时钟源。该状态将保持直到满足以下条件:


• 外部故障条件已经消除


• 通过写相应的模式位 OCM<2:0> (OCxCON<2:0>)重新使能 PWM 模式


PWM 周期 = [(PR + 1) • T PB • (TMR 预分频值 )]


PWM 周期一定不能超出所选定模式的周期寄存器宽度


PWM占空比


通过写入 OCxRS 寄存器来指定 PWM 占空比。可以在任何时候写 OCxRS 寄存器,但是在 PRy和 TMRy 发生匹配 (即周期结束)前占空比值不会被锁存到 OCxR 中。这可以为 PWM 占空比提供双重缓冲,对于 PWM 的无毛刺操作是极其重要的。在 PWM 模式下,OCxR 是只读寄存器。


PWM 占空比有一些重要的边界参数,包括:


• 如果占空比寄存器 OCxR 中装入 0x0000,则 OCx 引脚将保持低电平 (占空比为 0%)。


• 如果 OCxR 大于 PRy (定时器周期寄存器),则引脚将保持高电平 (占空比为 100%)。


• 如果 OCxR 等于 PRy,则 OCx 引脚在一个时基计数值内为低电平,而在所有其他计数值内均为高电平。


PWM输出时序图

I/O 引脚控制


当输出比较模块被使能时,I/O 引脚方向由比较模块控制。当比较模块被禁止时,它会将 I/O 引脚控制权归还给相应的引脚 LAT 和 TRIS 控制位。


当使能了具有故障保护输入模式的 PWM 时,必须通过将相应的 TRIS SFR 位置 1 以将 OCFx 故障引脚配置为输入。选择 PWM 故障模式时, OCFx 故障输入引脚不会自动配置为输入。

节能和调试模式下的操作


SLEEP (休眠)模式下


当器件进入 SLEEP(休眠)模式时,系统时钟被禁止。在 SLEEP(休眠)模式期间,输出比较模块会将引脚驱动为与在进入 SLEEP (休眠)模式之前相同的有效状态。然后模块将暂停在该状态。


例如,如果引脚原先为高电平,则在 CPU 进入 SLEEP(休眠)状态后,引脚将保持高电平。类似地,如果引脚原先为低电平,则在 CPU 进入 SLEEP(休眠)状态后,引脚将保持低电平。在这两种情况下,当器件唤醒时,输出比较模块将继续工作。


当模块在 PWM 故障模式下工作时,故障电路的异步部分将保持工作状态。如果检测到故障,比较输出使能信号会置为无效,OCFLT(OCxCON<4>)被置 1。如果允许了相应中断,还将产生中断,并且器件将从 SLEEP (休眠)模式唤醒。


IDLE (空闲)模式下


当器件进入 IDLE (空闲)模式时,系统时钟源保持工作,但 CPU 停止执行代码。 SIDL 位(OCxCON<13>)用于选择比较模块在器件进入 IDLE (空闲)模式时是停止工作还是在 IDLE


(空闲)模式下继续正常工作。


• 如果 SIDL = 1,则在 IDLE (空闲)模式下模块将停止工作。模块在 IDLE (空闲)模式下停止工作时将执行与在 SLEEP (休眠)模式下相同的程序。


• 如果 SIDL = 0,则只有选定时基设置为在 IDLE (空闲)模式下工作时,模块才能在 IDLE


(空闲)模式下继续工作。如果 SIDL 位为逻辑 0,则输出比较通道将在 CPU IDLE(空闲)模式期间工作。此外,还必须将相应的 SIDL 位设为逻辑 0 以使能时基。


• 当模块在PWM故障模式下工作时,故障电路的异步部分将保持工作状态。如果检测到故障,比较输出使能信号会置为无效,OCFLT(OCxCON<4>)被置 1。如果允许了相应中断,还将产生中断,并且器件将从 IDLE (空闲)模式唤醒。


DEBUG (调试)模式下


各种复位的影响


MCLR 复位


在发生 MCLR 事件之后,每个输出比较模块的 OCxCON、 OCxR 和 OCxRS 寄存器会复位为值0x00000000。


上电复位


在发生上电(Power-on,POR)事件之后,每个输出比较模块的 OCxCON、OCxR 和 OCxRS寄存器会复位为值 0x00000000。


看门狗定时器复位


在发生看门狗定时器 (Watchdog Timer, WDT)事件之后, OCMP 控制寄存器的状态取决于WDT 事件之前 CPU 的工作模式。


如果器件不处于 SLEEP (休眠)模式,则 WDT 事件会将 OCxCON、 OCxR 和 OCxRS 寄存器强制为复位值 0x00000000。


如果在发生 WDT 事件时器件处于 SLEEP (休眠)模式,则 OCxCON、 OCxR 和 OCxRS 寄存器值不受影响。


5、PWM脉宽调整模式Harmony配置

1、在Project Graph界面中添加定时器TMR2以及输出比较OCMP1,并配置定时器(可参考前面文章配置,不赘述);


2、配置输出比较参数,其中Select Output Compare Mode选择为PWM mode on OCx: Fault pin disabled 即简单脉宽调制模式,不带故障保护输入;并配置Compare value(OCxR)值,初始只读占空比寄存器;


3、组件配置完成后点击左侧的Generate Code按钮生成代码;


4、生成的代码与原始代码存在差异,需进行确认;


5、代码生成后需要的操作;


1、初始化完成后添加TMR2以及OCMP1的启动;


2、写修改占空比函数;


8、编译运行将代码烧录到开发板中;


6、具体代码分析

文件plib_ocmp1.c


void OCMP1_Initialize (void)

{

    /*Setup OC1CON */

    /*OCM = 6 */ // OCM<2:0> 为 110 简单脉宽调制模式,不带故障保护输入

    /*OCTSEL = 0 */ // 输出比较定时器选择位,0:TMR2,1:TMR3

    /*OC32 = 0 */ //32 位比较模式位

    /*SIDL = false */ //空闲模式停止位

    OC1CON = 0x6; //输出比较控制寄存器

 

    OC1R = 10; //初始只读占空比寄存器

    OC1RS = 10; //缓冲寄存器

 

    IEC0SET = _IEC0_OC1IE_MASK; //中断允许控制

}

 

//使能输出比较外设

void OCMP1_Enable (void)

{

    OC1CONSET = _OC1CON_ON_MASK; //输出比较外设使能位

}

 

//禁止输出比较外设

void OCMP1_Disable (void)

{

    OC1CONCLR = _OC1CON_ON_MASK; //输出比较外设使能位

}

 

//获取只读占空比寄存器值

uint16_t OCMP1_CompareValueGet (void)

{

    return (uint16_t)OC1R; //只读占空比寄存器值

}

 

//设置缓冲寄存器值(占空比)

void OCMP1_CompareSecondaryValueSet (uint16_t value)

{

    OC1RS = value; //缓冲寄存器值

}

 

//获取缓冲寄存器值(占空比)

uint16_t OCMP1_CompareSecondaryValueGet (void)

{

    return (uint16_t)OC1RS; //缓冲寄存器值

}

 

//

void OCMP1_CallbackRegister(OCMP_CALLBACK callback, uintptr_t context)

{

    ocmp1Obj.callback = callback;

 

    ocmp1Obj.context = context;

}

 

//中断服务函数

void OUTPUT_COMPARE_1_InterruptHandler (void)

{

    IFS0CLR = _IFS0_OC1IF_MASK;    //Clear IRQ flag

 

    if( (ocmp1Obj.callback != NULL))

    {

        ocmp1Obj.callback(ocmp1Obj.context);

    }

}


占空比调节函数


//占空比调节函数

int tempvalue=100;

int flag=1;

void PWM_Modify(void)

{

    if(flag==1)

    {

        if(tempvalue<15000)

        {

            tempvalue+=30;

        }

        else

        {

            flag=0;

        }

    }

        

    if(flag==0)

    {

        if(tempvalue>100)

        {

            tempvalue-=30;

        }

        else

        {

            flag=1;

        }

    }

        

    OCMP1_CompareSecondaryValueSet(tempvalue);

}


7、实验验证

点击编译按钮,编译提示BUILD SUCCESSFUL,点击烧录,提示Programming/Verify complete,开发板上的LED灯呈呼吸灯变化。

关键字:PIC系列  输出比较  PWM 引用地址:10、PIC系列-输出比较-PWM脉宽调制模式

上一篇:11、PIC系列-串口通讯模块
下一篇:9、PIC系列-输出比较-双比较模式

推荐阅读最新更新时间:2024-11-13 13:58

STM32通用定时器TIM实现PWM波配置步骤
//1、开启定时器时钟和需要用到的IO口 void Clock_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//因为准备把PB5口作为输出端口,所以接下来AFIO使能,如果使用默认的PA7 输 //出则不用使能AFIO,但需要使能GPIOA } //2、IO口并重映射TIM3 void GPIO_Out_Init(void) { GPIO_InitTypeDef GPIO_Init
[单片机]
STM32F103VCT6 高级定时器的PWM输出
要求得到下列 波形 ,死区时间1us,CH1和CH1之间的相位差事3us,频率50HZ。 1,To get TIM1 counter clock at 72MHz,the prescaler is computer as follows: Prescaler = (TIM1CLK / TIM1 counter clock) - 1 To objective is to genterate PWM signal at 50KHz: -TIM1_Priod = (SystemCoreClock / 50000) - 1 To get TIM1 output clock at 50KHz , the pe
[单片机]
STM32F103VCT6 高级定时器的<font color='red'>PWM</font><font color='red'>输出</font>
MEMS麦克风中PDM和I²S数字输出接口的比较和选择
本文将详细讨论脉冲密度调制 (PDM) 和集成电路内置音频 (I²S) 两种数字接口,简介它们的独特特性以及在系统设计时的优缺点。工程师具体选择哪一种,将取决于对两种技术的研究,并要了解哪种协议对于特定应用更适合。具体要考虑的几个关键因素包括: 音质 功耗 物料成本 设计的空间限制 硬件的运行环境 如果您在MEMS 麦克风的数字输出接口选择上有需求,相信本文会有所帮助。 麦克风用在嵌入式系统中已经有很多年了。自其诞生以来,由于家居、汽车和可穿戴设备中基于语音的应用范围不断扩大,MEMS 麦克风的市场使用率迅速增加。MEMS 麦克风不仅具有显著减少电路板空间、低功率要求和提高抗电噪声能力的优点,而且还具有更高的设
[嵌入式]
MEMS麦克风中PDM和I²S数字<font color='red'>输出</font>接口的<font color='red'>比较</font>和选择
关于PWM和精确延时输出的方波
绝大部分AVR单片机都会带有PWM硬件部分,今天小编来探测下PWM和精确延时产生的方波哪个更精准,欢迎讨论 小编就以输出4KHz的方波为例 1、下图是小编用PWM输出的4K方波 从图中,我们可以看到PWM输出的频率是4.03KHz; 2、下面小编带来精确延时的输出图形(小编精确延时用的是IAR编译器中intrinsic.h中的cycles函数) 从图中我们看到的精确延时产生的频率是4.01KHz,而且处于一个向4KHz跳变的状态
[单片机]
关于<font color='red'>PWM</font>和精确延时<font color='red'>输出</font>的方波
STM8 控制电脑风扇转速 4PIN PWM
程序代码: #include stm8s.h #include stm8s_gpio.h #define PWM_F 640 uint8_t HexTable ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; uint16_t CCR1_Val = 100; void DelayApi
[单片机]
STM8 控制电脑风扇转速 4PIN <font color='red'>PWM</font>
同步、低 EMI LED 驱动器具集成式开关和内部 PWM 调光能力
LED 的应用范围不断扩大,已经涉及从通用照明到汽车、工业和测试设备、招牌以及安全设备的各种领域。因此,对 LED 驱动器的设计要求也越来越多了。最新 LED 解决方案要求驱动器具备紧凑的尺寸、高效率和低噪声,并提供高的调光比和先进的故障保护功能。LT3922 非常容易满足这些要求。 LT3922 具集成式开关和内部 PWM 调光能力 LT3922 是一款 36V、同步 LED 驱动器,集成了 2A 开关,可配置为升压、降压或升压-降压型 LED 驱动器。该器件集成了高效率、同步电源开关,采用纤巧的 4mm x 5mm QFN 封装。这款器件采用了ADI最先进的开关技术,虽然封装尺寸很小,却能够提供很大的功率,同时还能够控
[电源管理]
同步、低 EMI LED 驱动器具集成式开关和内部 <font color='red'>PWM</font> 调光能力
STM8S103的三路PWM波形
博客是个不错的记事本 把我怕忘掉的,都记下来 STM8S物美价廉,TIM2可同时产生三路PWM波形来,最快可达5MHZ #include stm8s.h uint16_t CCR1_Val = 500; uint16_t CCR2_Val = 250; uint16_t CCR3_Val = 100; static void TIM2_Config(void); void main(void) {CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//16/1=16MHZ TIM2_Config(); while (1) {} } static void TIM2_Conf
[单片机]
PIC16F877A编程PID+PWM+1602液晶显示
#include string.h #include stdio.h #include pic.h #define uchar unsigned char #define uint unsigned int #include cd1602.h uint adsc ,adjz ,adsr ; //定义3个A/D转换临时变量 uint resultjz,resultsr,resultsc; //PWM为jz2,PID为jz1 double scdy,jzdy,srdy,pidsc,tjkz,jzxs,scxs,srxs,PWMsr,jzzkb; __CONFIG(HS&WDTDIS); typedef struct PID{
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved