【经验】武汉芯源CW32系列MCU PWM输出功能指南

【经验】武汉芯源CW32系列MCU PWM输出功能指南

脉冲宽度调制(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波形实例图:

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

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

另外比较通道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输出,但仍可用作内部控制,比如触发ADC或DMA。

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

实例演示

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

1、配置不同的系统时钟。

void RCC_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口

void GPIO_Configuration(void)

{

/* PB08作为GTIM1的CH3 PWM 输出 */

__RCC_GPIOB_CLK_ENABLE();

PB08_AFx_GTIM1CH3();

PB08_DIGTAL_ENABLE();

PB08_DIR_OUTPUT();

PB08_PUSHPULL_ENABLE();

}

3、配置中断使能

void NVIC_Configuration(void)

{

__disable_irq();

NVIC_EnableIRQ(GTIM1_IRQn);

__enable_irq();

}

4、配置GTIM为PWM输出功能

void PWM_OutputConfig(void)

{

GTIM_InitTypeDef GTIM_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, >IM_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标志清零函数

void GTIM_ClearITPendingBit(GTIM_TypeDef *GTIMx, uint32_t GTIM_IT)

{

GTIMx->ICR = ~GTIM_IT;

}

6、GTIM 比较值设置函数

void GTIM_SetCompare3(GTIM_TypeDef *GTIMx, uint32_t Value)

{

GTIMx->CCR3 = 0x0000FFFF & Value;

}

7、GTIM中断处理函数

void GTIM1_IRQHandler(void)

{

/* USER CODE BEGIN */

// 中断每500us进入一次,每50ms改变一次PosWidth

static uint16_t TimeCnt = 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);

}

/* USER CODE END */

}

8、主函数

uint32_t Period = 500; // 周期,单位us

uint32_t PosWidth = 0; // 正脉宽,单位us

uint8_t Dir = 1; // 计数方向 1增加,0 减少

int32_t main(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的溢出周期为500μs。GTIM1每500μs进入一次中断,每50ms改变一次CH3的CCR寄存器的值,即改变PWM的正脉宽,步长为5μs,先递增到ARR,然后递减到0,如此反复。通过示波器图像显示,PB08处的信号波的占空比随时间进行周期性变化。截取2个波形如下:

🌈 相关推荐

4月21日是什么星座 金牛座性格特点
365网络股份有限公司总部

4月21日是什么星座 金牛座性格特点

📅 06-28 👁️ 9552
小米手机6抢购技巧全攻略:教你轻松拿下心仪机型
365bet备用网站

小米手机6抢购技巧全攻略:教你轻松拿下心仪机型

📅 07-28 👁️ 6944
热血尖兵
365bet备用网站

热血尖兵

📅 07-14 👁️ 2799