1.cubemx设置
参考文章
时钟设置
高速时钟配置
将HCLK设置为最大频率72MHz
定时器设置
Internal Clock
:(内部时钟)
Prtscaler
: 14400 -1(具体见实验现象,建议改小一点)
Counter Mode
: Up
Counter Period
: 100 -1
CKD
:No Division (不分频)
auto-reload-preload
: Enable
定时器的通道是定时器功能中非常关键的一部分,它们允许定时器与外部事件或内部计数操作进行交互。在本文中用于PWM输出。
STM32的每个通用定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。
实验使用了连接PA8的LED,所以对应开启TIM1 CH1,即定时器1的通道1。
Mode
: PWM mode 1
Pulse
: 0
Output compare preload
: Up
其他选项
: 默认值即可
2.使用函数
CCR设置
__HAL_TIM_SetCompare(&htim, Channel, Compare)
是一个宏定义,用于设置定时器的比较值
htim
: 指向使用的TIM句柄的指针。这个句柄包含了定时器实例的配置信息和当前状态。Channel
: 指定哪个通道被配置。每个定时器可以有多个通道,例如TIM_CHANNEL_1
,TIM_CHANNEL_2
等。Compare
: 新的比较值。这个值将被加载到相应的输出比较寄存器中。
启动定时器在PWM模式下的运行
HAL_TIM_PWM_Start(&htim, Channel)
3.PWM基础知识
PWM定义
PWM(Pulse Width Modulation,脉冲宽度调制)是一种通过调整信号的占空比来控制模拟信号电平的技术。占空比是指在一个周期内,信号处于高电平状态的时间与总周期时间的比例。PWM广泛应用于各种电子控制系统中,因为它提供了一种有效的方式来控制模拟电路的输出,如电机速度、灯光亮度、以及其他需要变化的电力负载。
占空比 % = T o n T × 100 % 占空比 \; \% = \frac{T_{on}}{T} \times 100\% 占空比%=TTon×100%
区分四个寄存器
1. ARR (Auto-Reload Register)
- 功能:ARR寄存器用于设置定时器的最大计数值。当定时器计数值达到ARR设定的值时,根据定时器的配置,计数器可以重置回0(在向上计数模式)或设置的最大值(在向下计数模式),并且可以生成一个更新事件(如中断)。
2. PSC (Prescaler Register)
- 功能:PSC寄存器用于设置定时器的预分频值。此寄存器的值决定了定时器时钟频率与定时器计数频率之间的分频比。具体来说,定时器的输入时钟频率通过此预分频器被降低,从而减慢计数器的增加速度。预分频值等于PSC寄存器的值加1(即预分频比 = PSC值 + 1)。这允许更灵活地控制定时器的时间基准,适用于不同的计时和计数需求。
3. CNT (Counter Register)
- 功能:CNT寄存器是定时器的当前计数值。它根据配置的时钟源和分频值,自动增加或减少。
4. CCR (Capture/Compare Register)
- 功能:CCR寄存器主要用于捕获或比较操作。在定时器的捕获模式下,CCR可以捕获外部事件发生时的CNT值,用于测量时间间隔或频率。在比较模式下,CCR保存一个预设的值,当CNT值达到CCR值时,可以触发动作,如改变输出引脚的状态或生成中断。
stm32中的应用
占空比
%
=
C
C
R
A
R
R
+
1
×
100
%
占空比 \% = \frac{CCR}{ARR+1} \times 100\%
占空比%=ARR+1CCR×100%
频率 = 72 M H z ( P S C + 1 ) × ( A R R + 1 ) 频率 = \frac{72 MHz}{(PSC+1) \times (ARR+1)} 频率=(PSC+1)×(ARR+1)72MHz
4.代码
main
int main(void)
{
/*----------------------- 把语句加到这下面 -----------------------*/
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4); //开启PWM
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
int duty_cycle[] = {100, 80, 60, 40, 20, 40, 60, 80, 100}; //设置几个亮度状态
for (int i = 0; i < sizeof(duty_cycle) / sizeof(duty_cycle[0]); i++)
{
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_4, duty_cycle[i]-1);
HAL_Delay(200);
}
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
5.效果展示
可能是PSC的值给大了,导致定时周期太长。肉眼没发现频闪,但是手机拍出来格外明显。LED呼吸有点不顺畅,像风烛残年的老人。
附
PWM的几种模式
cubeMX配置时有选择PWM的几种模式,之前也没有具体了解过除mode1之外的其他几种,这次找了相关资料,以查漏补缺。
-
基本PWM模式:
在基本PWM模式下,输出波形是由一个计数器和一个比较器生成的。计数器以固定的频率计数,并且当计数器值达到比较器值时,PWM输出切换。这种模式适用于简单的PWM应用,如驱动LED、电机控制等。 -
中断PWM模式:
中断PWM模式是基本PWM模式的扩展,它添加了中断功能。当计数器的值达到比较器的值时,可以生成一个中断请求。这种模式适用于需要精确控制PWM周期的应用,如音频处理、通信协议等。 -
中央对齐PWM模式:
在中央对齐PWM模式下,PWM波形的周期由两个比较器决定,一个比较器用于递增计数器,另一个用于递减计数器。因此,PWM脉冲的上升沿和下降沿都位于计数器的中间。这种模式适用于需要对称输出波形的应用,如电机控制、音频放大器等。 -
带死区的PWM模式:
带死区的PWM模式允许在PWM输出的上升沿和下降沿之间添加一段死区,防止在切换时产生短路。这种模式适用于需要驱动功率器件(如MOSFET、IGBT等)的高功率应用,如电机驱动、逆变器等。 -
同步PWM模式:
同步PWM模式允许多个PWM输出通道在同一时钟周期内同步更新,以确保它们之间的相位关系一致。这种模式适用于需要多路PWM输出的应用,如多相电机控制、功率因数校正等。