0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32 PWM输出功能介绍

jf_pJlTbmA9 来源:武汉芯源半导体 作者:武汉芯源半导体 2023-09-27 16:12 次阅读

脉冲宽度调制(PWM),即“Pulse Width Modulation”的缩写,简称脉宽调制,是在数字电路中达到模拟输出效果的一种手段,常见应用电机调速,照明灯调光等。

MCU中,主要通过定时器单元来时实现PWM输出,以CW32L083VxTx为例,LPTIM,GTIM,ATIM都可以输出PWM信号

低功耗寄存器(LPTIM)中,LPTIM 在连续模式下可以输出 PWM 波,在单次模式下可以输出单脉冲波或单次置位波形。连续模式下输出PWM波的周期和占空比由自动重载寄存器 LPTIM_ARR 和比较寄存器 LPTIM_CMP决定。

通用定时器(GTIM)中,通过设置输出比较功能,可以产生一个由重载寄存器 GTIMx_ARR 确定频率、由比较捕获寄存器 GTIMx_CCRy 确定占空比的PWM信号。每个GTIM对应有4个GTIMx_CCRy寄存器,可输出4路PWM信号。向 GTIMx_CCMR 寄存器中的 CCyM 位写入 0xE 或 0xF,能够独立地控制每个 CHy 输出PWM信号的波形。

●设置 GTIMx_CMMR.CCyM 为 0xE,当 GTIMx_CNT >= GTIMx_CCRy 时,CHy 通道输出高电平,否则输出低电平。如果 GTIMx_CCRy 中的比较值大于重载寄存器 GTIMx_ARR 的值,则 CHy 通道输出保持为低电平;如果 GTIMx_CCRy 中的比较值为 0,则 CHy 通道输出保持为高电平。

●设置 GTIMx_CMMR.CCyM 为 0xF,当 GTIMx_CNT < GTIMx_CCRy 时,CHy 通道输出高电平,否则输出低电平。如果 GTIMx_CCRy 中的比较值大于重载寄存器 GTIMx_ARR 的值,则 CHy 通道输出保持为高电平;如果 GTIMx_CCRy 中的比较值为 0,则 CHy 通道输出保持为低电平。

下图是 GTIMx_CMMR.CCyM 为 0xE、GTIMx_ARR 为 0x08 时PWM波形实例图:

wKgaomUDzMmAW16SAADHibrdpf4990.png

高级定时器(ATIM)中有独立PWM输出模式和互补PWM输出两种模式。

●独立PWM模式可独立输出6路PWM,PWM的周期和占空比由重载寄存器ATIM_ARR和比较捕获寄存器ATIM_CHxCCRy寄存器确定。PWM 输出模式需要设置控制寄存器 ATIM_CR、滤波寄存器 ATIM_FLTR 和死区寄存器 ATIM_DTR,如下表所示:

wKgaomUDzMuAQcIaAAFLeu2Af_c356.png

另外比较通道 CHx 的 A 路可通过控制寄存器 ATIM_CR 的 PWM2S 位域配置为单点比较或双点比较 工作方式。在单点比较方式下,使用比较捕获寄存器 ATIM_CHxCCRA 控制比较输出;在双点比较方式下,使用 比较捕获寄存器 ATIM_CHxCCRA 和 ATIM_CHxCCRB 控制比较输出。比较通道的 B 路只能使用单点比较,由比较 捕获寄存器 ATIM_CHxCCRB 控制比较输出。

●互补PWM模式可输出3对互补输出的PWM波形,通常用于电机控制。设置控制寄存器 ATIM_CR 的 COMP 位域为 1 选择互补 PWM 输出模式,比较输出通道 CHxA 与通道 CHxB 产生一 对互补 PWM。在互补 PWM 输出模式下,通道 CHx 的 A 路控制输出信号, B 路比较捕获寄存器 CHxCCRB 不再控制 CHxB 输出,但仍可用作内部控制,比如触发 ADCDMA

另外互补 PWM 输出模式,也可通过控制寄存器 ATIM_CR 的 PWM2S 位域选择单点比较或双点比较工作方式:单点比 较时使用比较捕获寄存器 ATIM_CHxCCRA 控制比较输出;双点比较时使用比较捕获寄存器 ATIM_CHxCCRA 和 ATIM_CHxCCRB 控制比较输出。

实例演示

以CW32L083VxTx的通用定时器GTIM1为例,实现PWM输出例程:GTIM1的CH3通道(PB08)输出周期为500uS,占空比递增递减循环改变的PWM信号。

1.配置不同的系统时钟

voidRCC_Configuration(void)
{
/*0.HSI使能并校准*/
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
/*1.设置HCLK和PCLK的分频系数*/
RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
RCC_PCLKPRS_Config(RCC_PCLK_DIV1);
/*2.使能PLL,通过HSI倍频到48MHz*/
RCC_PLL_Enable(RCC_PLLSOURCE_HSI,8000000,6);
//PLL输出频率48MHz
RCC_PLL_OUT();
///< 当使用的时钟源HCLK大于24M,小于等于48MHz:设置FLASH 读等待周期为2 cycle
    ///< 当使用的时钟源HCLK大于48M,小于等于72MHz:设置FLASH 读等待周期为3 cycle    
    __RCC_FLASH_CLK_ENABLE();
    FLASH_SetLatency(FLASH_Latency_2);
    /* 3. 时钟切换到PLL */
    RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);
    RCC_SystemCoreClockUpdate(48000000);
}

2.配置GPIO口

voidGPIO_Configuration(void)
{
/*PB08作为GTIM1的CH3PWM输出*/
__RCC_GPIOB_CLK_ENABLE();
PB08_AFx_GTIM1CH3();
PB08_DIGTAL_ENABLE();
PB08_DIR_OUTPUT();
PB08_PUSHPULL_ENABLE();
}

3.配置中断使能

voidNVIC_Configuration(void)
{
__disable_irq();
NVIC_EnableIRQ(GTIM1_IRQn);
__enable_irq();
}

4.配置GTIM为PWM输出功能

voidPWM_OutputConfig(void)
{
GTIM_InitTypeDefGTIM_InitStruct={0};
__RCC_GTIM1_CLK_ENABLE();
GTIM_InitStruct.Mode=GTIM_MODE_TIME;/*!< GTIM的模式选择。*/
    GTIM_InitStruct.OneShotMode = GTIM_COUNT_CONTINUE;
    /*!< GTIM的单次/连续计数模式选择。*/
    GTIM_InitStruct.Prescaler = GTIM_PRESCALER_DIV16; 
    /*!< GTIM的预分频系数。*/  
    // DCLK = PCLK / 16 = 48MHz/16 = 3MHz
    GTIM_InitStruct.ReloadValue = Period * 3 - 1; /*!< GTIM的重载值。*/
    //ARR设置为1499
    GTIM_InitStruct.ToggleOutState = DISABLE;
    GTIM_TimeBaseInit(CW_GTIM1,  GTIM_InitStruct);
    //GTIM的基础参数初始化
    GTIM_OCInit(CW_GTIM1, GTIM_CHANNEL3, GTIM_OC_OUTPUT_PWM_HIGH);
    //比较输出功能初始化
    GTIM_SetCompare3(CW_GTIM1, PosWidth);
    GTIM_ITConfig(CW_GTIM1, GTIM_IT_OV, ENABLE);
    GTIM_Cmd(CW_GTIM1, ENABLE);// GTIM使能
}

5.GTIM标志清零函数

voidGTIM_ClearITPendingBit(GTIM_TypeDef*GTIMx,uint32_tGTIM_IT)
{
GTIMx->ICR=~GTIM_IT;
}

6.GTIM 比较值设置函数

voidGTIM_SetCompare3(GTIM_TypeDef*GTIMx,uint32_tValue)
{
GTIMx->CCR3=0x0000FFFF Value;
}

7.GTIM中断处理函数

voidGTIM1_IRQHandler(void)
{
/*USERCODEBEGIN*/
//中断每500us进入一次,每50ms改变一次PosWidth
staticuint16_tTimeCnt=0;
GTIM_ClearITPendingBit(CW_GTIM1,GTIM_IT_OV);
if(TimeCnt++>=100)//50ms
{
TimeCnt=0;
if(Dir)
{
PosWidth+=15;//5us
}
else
{
PosWidth-=15;
}
if(PosWidth>=Period*3)
{
Dir=0;
}
if(0==PosWidth)
{
Dir=1;
}
GTIM_SetCompare3(CW_GTIM1,PosWidth);
}
/*USERCODEEND*/
}

8.主函数

uint32_tPeriod=500;//周期,单位us
uint32_tPosWidth=0;//正脉宽,单位us
uint8_tDir=1;//计数方向1增加,0减少

int32_tmain(void)
{
/*系统时钟配置*/
RCC_Configuration();
/*GPIO配置*/
GPIO_Configuration();
PWM_OutputConfig();
/*NVIC配置*/
NVIC_Configuration();
while(1)
{
/*中断服务程序见GTIM1_IRQHandler()*/
}

9.实验演示

系统时钟由HSI提供,通过PLL倍频到48MHz。GTIM1经16分频后,以3MHz的频率计数,ARR设置为1499,GTIM1的溢出周期为500us。GTIM1每500us进入一次中断,每50ms改变一次CH3的CCR寄存器的值,即改变PWM的正脉宽,步长为5us,先递增到ARR,然后递减到0,如此反复。通过示波器图像显示,PB08处的信号波的占空比随时间进行周期性变化。截取2个波形如下:

wKgZomUDzMyADxsvAAXQ714RA-8104.png

wKgZomUDzM-AKEcRAAXkmkHucmI050.png

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5037

    浏览量

    117763
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4901

    浏览量

    209958
  • 定时器
    +关注

    关注

    23

    文章

    3148

    浏览量

    112051
收藏 人收藏

    评论

    相关推荐

    CW32移植Free-RTOS】CW32开发者扶持计划

    CW32配置Free-RTOS全过程,CW32开发者扶持计划
    的头像 发表于 04-18 09:38 5576次阅读
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>开发者扶持计划

    CW32开发者扶持计划#CW32 #芯片

    CW32
    CW32生态社区
    发布于 :2023年05月24日 16:56:14

    如何基于CW32系列MCU实现VBAT功能

    介绍了如何基于 CW32 系列 MCU,通过增加简单的外部电路配合软件实现 VBAT 功能,在系统电源掉电后仍能保持 RTC 时钟正常计时,以及如何降低系统功耗,从而延长后备电池的使用寿命。
    发表于 09-15 07:24

    cw32和stm32的区别

    cw32和stm32的区别 CW32和STM32是两种常见的单片机,被广泛应用于各种电子设备中。在本文中,我们将深入探讨CW32和STM32之间的区别和优劣势。 1. 硬件性能 硬件性能是衡量单片机
    的头像 发表于 08-16 11:15 2263次阅读

    基于CW32的无刷水泵方案

    基于CW32的无刷水泵方案
    的头像 发表于 11-03 17:28 449次阅读
    基于<b class='flag-5'>CW32</b>的无刷水泵方案

    CW32单片机低电压检测器的使用介绍

    CW32单片机低电压检测器的使用介绍
    的头像 发表于 09-18 10:56 625次阅读
    <b class='flag-5'>CW32</b>单片机低电压检测器的使用<b class='flag-5'>介绍</b>

    CW32单片机UART波特率设置介绍

    CW32单片机UART波特率设置介绍
    的头像 发表于 10-24 17:35 497次阅读
    <b class='flag-5'>CW32</b>单片机UART波特率设置<b class='flag-5'>介绍</b>

    CW32单片机UART基本数据收发功能介绍

    CW32单片机UART基本数据收发功能介绍
    的头像 发表于 10-24 16:50 417次阅读
    <b class='flag-5'>CW32</b>单片机UART基本数据收发<b class='flag-5'>功能</b><b class='flag-5'>介绍</b>

    CW32单片机I2C接口读写EEPROM芯片介绍

    CW32单片机I2C接口读写EEPROM芯片介绍
    的头像 发表于 11-09 17:42 597次阅读
    <b class='flag-5'>CW32</b>单片机I2C接口读写EEPROM芯片<b class='flag-5'>介绍</b>

    CW32的SPI单工模式主从通信介绍

    CW32的SPI单工模式主从通信介绍
    的头像 发表于 10-24 15:50 420次阅读
    <b class='flag-5'>CW32</b>的SPI单工模式主从通信<b class='flag-5'>介绍</b>

    CW32实时时钟(RTC)介绍

    CW32实时时钟(RTC)介绍
    的头像 发表于 10-24 15:36 528次阅读
    <b class='flag-5'>CW32</b>实时时钟(RTC)<b class='flag-5'>介绍</b>

    CW32通用输入输出端口详解

    CW32通用输入输出端口详解
    的头像 发表于 10-30 17:33 580次阅读
    <b class='flag-5'>CW32</b>通用输入<b class='flag-5'>输出</b>端口详解

    2023电赛A题国奖CW32 开源分享

    电赛A题开源分享,主控为CW32
    的头像 发表于 11-02 10:16 787次阅读
    2023电赛A题国奖<b class='flag-5'>CW32</b> 开源分享

    基于CW32的物联网应用

    CW32】基于CW32的物联网应用
    的头像 发表于 11-02 15:55 337次阅读
    基于<b class='flag-5'>CW32</b>的物联网应用

    CW32单片机在智能马桶的应用介绍

    和调节。本文将介绍CW32单片机在智能马桶的详细应用。图:CW32的智能马桶控制板CW32单片机在智能马桶的应用介绍1.温度感应与控制智能马
    的头像 发表于 12-20 10:09 261次阅读
    <b class='flag-5'>CW32</b>单片机在智能马桶的应用<b class='flag-5'>介绍</b>