题目:《单片机-PWM》
引用:脉冲宽度调制
一、了解概况
PWM基本原理:又称脉宽调制,控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等但宽度不一致的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形。通常,我们将PWM的高电平称为1,低电平为0。产生PWM的方式有单片机的外设产生PWM波,或者IO口模拟产生PWM波等。
二、说明
本篇文章是基于雅特力AT32F421C8T7的外设–PWM,与其他MCU不同的是,该MCU把PWM并到定时器中,而不是单独的PWM模块。定时器包括一个基本定时器(TRM6)、5个通用定时器(TRM3,TRM14,TRM15,TRM16/17)、1个高级定时器(TRM1)。其中基本定时器和高级定时器具有输出PWM波形的功能,
三、详细参数
通俗的讲,PWM的产生的原理就是通过定时输出CCRx的值和CNT比较大小,通过判断结果来决定输出是高电平还是低电平。
ARR:最值,定时器最值
CCRx:PWM的比较值
CNT:为计数器值
PWM重要的几个参数;占空比、周期、时间
四、上代码
IO口的配置
*********************************************************************************************************
* 函 数 名: bsp_InitTMR3_PWM1
* 功能说明: 配置TMR3通道1的PWM相关的GPIO
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitTMR3_PWM1(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_TMR3, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinsSource4, GPIO_AF_1);
/* 配置GPIO */
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pins = GPIO_Pins_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; /* 复用模式 */
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
PWM的配置
/* 周期 */
#define CYCLE_1KHZ 1000
/*
*********************************************************************************************************
* 函 数 名: bsp_TMR3_PWM1_SetPeriod
* 功能说明: 配置PWM占空比
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_TMR3_PWM1_SetPeriod(uint16_t ucPeriod)
{
/* Time Base configuration */
TMR_TimeBaseStructInit(&TMR_TimeBaseStructure);
TMR_TimeBaseStructure.TMR_DIV = 8 - 1;;
TMR_TimeBaseStructure.TMR_CounterMode = TMR_CounterDIR_Up;
TMR_TimeBaseStructure.TMR_Period = ucPeriod - 1;
TMR_TimeBaseStructure.TMR_ClockDivision = 0;
TMR_TimeBaseStructure.TMR_RepetitionCounter = 0;
TMR_TimeBaseInit(TMR3, &TMR_TimeBaseStructure);
/* Channe2,Configuration in PWM mode */
TMR_OCStructInit(&TMR_OCInitStructure);
TMR_OCInitStructure.TMR_OCMode = TMR_OCMode_PWM2;
TMR_OCInitStructure.TMR_OutputState = TMR_OutputState_Enable;
//TMR_OCInitStructure.TMR_OutputNState = TMR_OutputNState_Enable;
TMR_OCInitStructure.TMR_Pulse = (uint32_t)((float)PWM_DUTY/ 100 * CYCLE_1KHZ); /* PWM占空比 */; //百分之50
TMR_OCInitStructure.TMR_OCPolarity = TMR_OCPolarity_Low;
TMR_OC1Init(TMR3, &TMR_OCInitStructure);
TMR_CtrlPWMOutputs(TMR3, ENABLE);
/* TMR1 counter enable */
TMR_Cmd(TMR3, ENABLE);
}
也可以通过该库函数控制PWM输出的占空比
void TMR_SetCompare2(TMR_Type* TMRx, uint32_t Compare2)