本章介绍使用STM32CubeMX对PWM进行配置的方法,PWM的基本原理,并通过示波器来测试实现结果,如果有LED灯也可以,PWM控制LED灯的亮度。
PWM(Pulse Width Modulation)脉冲宽度调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制电流。例如输出占空比为50%,频率为10Hz的脉冲,高电平为3.3V.则其输出的模拟效果相当于输出一个1.65V的高电平。脉冲调制有两个重要的参数,第一个就是输出频率,频率越高,则模拟的效果越好。第二个就是占空比。占空比就是改变输出模拟效果的电压大小。占空比越大则模拟出的电压越大。
广泛应用在从测量、通信到功率控制与变换的许多领域中。STM32内置多个IO输出PWM通道。
脉冲宽度调制模式可以生成一个信号,该信号频率由自动重载寄存器(TIMx_ARR)寄存器值决定,其占空比则由捕获/比较寄存器(TIMx_CCRx) 寄存器值决定。
在 PWM 模式下,计数器寄存器(TIMx_CNT )总是与捕获/比较寄存器(TIMx_CCRx )进行比较,以确定是TIMx_CCRx>TIMx_CNT 还是 TIMx_CNT
当CCRX=4时,当捕获/比较寄存器(TIMx_CCRx)比计数器小时,输出高电平,反之则输出低电平。
因此改变CCRx的值就可以改变PWM输出的占空比,改变ARR的值就可以改变PWM输出的频率.
选择芯片stm32f103c6t6,新建工程
设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。
配置时钟树,这里使用官方推荐的配置
配置引脚功能,从datasheet中可以PA9可以复用为TIM1_CH2输出,因此将管脚PA9配置为定时器1的通道2输出。同时TIM1的通道2配置为PWM,这样就可以在PA9管脚得到PWM输出。datasheet截图如下:
前面设置HSE时钟为72MHz;TIM1的时钟挂载在APB2 Time Clocks上为72MHz
预分频系数设置为72-1,向上计数,自动重装载值设为500-1,则计时器时钟频率为1MHz,计时器周期为1us,定时器溢出周期(即PWM周期)为 500 * 1 = 500us,溢出频率(即PWM频率)为1/500us = 2KHz
Code Generator中设置只拷贝使用到的库,分离.c和.h文件
设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。
实现一个周期为500us,占空比不断变化的pwm输出功能,代码如下
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
uint16_t pwmVal=0; //PWM占空比
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); //开启定时器PWM输出
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, pwmVal); //修改占空比
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, pwmVal); //修改占空比
HAL_Delay(1);
}
HAL_Delay(200);
/* USER CODE END 3 */
}
/* USER CODE END 3 */
}
代码编译成功
在下载前检查keil是否检测到ST-LINK,选择魔法棒进行设置
如图所示,已经检测到ST-LINK 下载器
点击load,自动下载固件
烧录器ST-LINK V2和最小系统板的连接如图所示: 四线连接 SWDIO,GND,SWCLK,和3.3V电源
由于没有找到LED灯,所以使用示波器进行测量,从测试结果可以看到,输出了PA9脚输出了电压为3.3V,周期为500 us的方波,且占空比在不断变化,如下图所示。
本章介绍STM32CubeMX对PWM进行配置的方法,PWM的技术实现原理,最后使用示波器来测试实验结果。