细说MCU输出两路PWM波形及改变占空比的实现方法

目录

一、硬件及工程 

二、建立工程

三、代码修改

四、下载运行

五、改变PWM波形占空比

1、定义两个全局变量

2、启动定时器

3、重写TIM3中断回调函数

六、下载并运行


一、硬件及工程 

        文章依赖的硬件及工程配置参考本文作者的其他文章:细说ARM MCU的串口接收数据的实现过程-CSDN博客 https://wenchm.blog.csdn.net/article/details/139541112

二、建立工程

        通过PB4输出配置一个通道TIM3_CH1、通过PB5输出配置一个通道TIM3_CH2。用示波器进行观察PB4和PB5引脚的输出信号波形。

        在NUCLEO-G474RE板上,PB4通过CN9端子的第6引脚引出,PB5通过CN9端子的第5引脚引出。

        外部时钟、Serial Wire;

         配置定时器:在TIM3的模式(Mode)配置界面,将时钟源设置为Internal Clock;选择PWM Generation CH1和选择PWM Generation CH2。然后,将预分频因子(Prescaler)和计数器周期(Counter Period)分别设置为999和8499(这两个参数从0开始计数),计数模式(Counter Mode)设置为升模式(Up),并使能自动重载(auto-reload preload)。

        预分频因子决定着两次计数之间的时间间隔,这里设置的1000(999+1),是将时钟脉冲分频1000倍。假如时钟频率为170 MHz,则分频1000倍后就是170 kHz。

        将计数周期设置为8499,也就是计数到8499后,重新从0开始计。在计数频率170 kHz之下,计数器的周期为(1/170×10³)×8500≈50(ms),对应的频率为20 Hz。在PWM Generation Channel 1的参数配置中,选择PWM mode 1,脉冲数(Pulse)设置为2125(该参数从1开始),通道极性设置为High。通道极性参数用于指定在Pulse个计数期间,输出的是高电平还是低电平。这里脉冲数Pulse决定着占空比,这里设为2125,是计数器周期的1/4,所以占空比刚好为25%。

        在PWM Generation Channel 2的参数配置中,选择PWM mode 1,脉冲数(Pulse)设置为4250(该参数从1开始),通道极性设置为High。通道极性参数用于指定在Pulse个计数期间,输出的是高电平还是低电平。

        使能TIM3的全局中断。将其抢占式优先级设为1,响应优先级设为0。将System tick timer的抢占式优先级设为最高(0级)。

        将系统时钟(SYSCLK)频率配置为170 MHz。

三、代码修改

        硬件配置完成后,编译、自动生成代码。 

/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim3);
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
/* USER CODE END 2 */

四、下载运行

        通道2为PB5输出的波形,通道1还是PB4输出的波形。PB5输出波形脉冲宽度为25 ms,周期50 ms,占空比刚好为50%。

五、改变PWM波形占空比

         上面例子中,所输出的PWM波形占空比是固定的,要想改变占空比,就需要调整PWM产生通道(PWM Generation Channel)参数中的脉冲数(Pulse)这一参数。不过,在固件库中,没有专门的函数可以改变这个参数。实际上,这个参数对应的是TIM3的捕捉/比较寄存器CCRx(x=1~4),脉冲数即该寄存器的值。因为TIM3有四个通道,所以它有四个CCR寄存器:TIM3_CCR1、TIM3_CCR2、TIM3_CCR3和TIM3_CCR4,分别对应TIM3_CH1、TIM3_CH2、TIM3_CH3和TIM3_CH4四个PWM输出通道的脉冲数(Pulse)。

        在代码中给这些寄存器赋值,以给TIM3_CCR1赋值为例,可以直接采用下面的语句:

TIM3->CCR1 =PwmValCH1;

        在这条语句中,PwmValCH1为一变量,是将要设定的TIM3_CH1的脉冲数的值。TIM3在STM32CubeIDE中已经被声明为一个指针型结构体,指向TIM3寄存器的基地址,所以可直接用“→”访问其成员变量CCR1。       

         建立工程时,与固定占空比的最大区别是,不配置PWM Generation Channel的参数。

1、定义两个全局变量

        为了达到可变占空比的效果,可以在main.c中定义两个全局变量,放到注释对中: 

/* USER CODE BEGIN PV */
uint16_t PwmValCH1 = 0;
uint16_t PwmValCH2 = 8500;
/* USER CODE END PV */

2、启动定时器

/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim3);
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
/* USER CODE END 2 */

3、重写TIM3中断回调函数

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	PwmValCH1 = PwmValCH1 +500;
	PwmValCH2 = PwmValCH2 -500;
	if(PwmValCH1 >= 8500)
		PwmValCH1 = 500;
	if(PwmValCH2 <= 500)
		PwmValCH2 = 8500;
	TIM3 ->CCR1 = PwmValCH1;
	TIM3 ->CCR2 = PwmValCH2;
}
/* USER CODE END 4 */

六、下载并运行

        从图中可以看出,通道2的占空比有逐步减小趋势,通道1的占空比在逐步增加。 

         输出更多的路PWM,依法炮制。

最近更新

  1. TCP协议是安全的吗?

    2024-06-19 09:38:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-19 09:38:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-19 09:38:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-19 09:38:04       20 阅读

热门阅读

  1. MongoDB基础知识

    2024-06-19 09:38:04       6 阅读
  2. 十三、数论基础

    2024-06-19 09:38:04       5 阅读
  3. Ruby 数据库访问 - DBI 教程

    2024-06-19 09:38:04       8 阅读
  4. 安卓交叉编译——ndk

    2024-06-19 09:38:04       10 阅读
  5. Swarm 集群管理

    2024-06-19 09:38:04       11 阅读
  6. PostgreSQL源码分析——创建用户

    2024-06-19 09:38:04       10 阅读
  7. Linux 上的 TTY 是什么?

    2024-06-19 09:38:04       9 阅读
  8. USB 端点停止

    2024-06-19 09:38:04       7 阅读