STM32定时器的PWM模式主要可以分为两大类,一类是边沿对齐模式,另一类时中间对齐模式。中间对齐模式又有三种对齐方式,这篇文章就来简单的谈一下中间对齐模式种三种对齐方式的区别。
我们可以看参考手册里面的内容
从中断的角度来说,三种对齐模式的差别在于:
模式一 仅在向下计数溢出时产生中断(前提是使能了中断),模式一二仅在向上计数溢出时产生中断,模式三则在两种情况下都会产生中断。如图:
接下来我们用一段程序简单说明
cubemx关于定时器的配置
说明:例子中所采用的芯片主频为170M,经过以下配置,为每1ms计数一次。
冲断频率 = 170M / (170 * 1000) = 1000(Hz)
主函数部分:
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 */
/* 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_Base_Start_IT(&htim1);//一定要打开
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_1);//一定要打开
/* 定时器通道1输出PWM */
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
/* 定时器通道1互补输出PWM */
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,500);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
中断函数部分:(注意函数名)
对于模式1与模式2:
理论上产生中断的频率为1KHz,但是由于其在向上计数和向下计数一整个过程中只有一处中断,所以进入中断的频率应为500Hz。所产生的PWM波的频率也应为500Hz。
对于在中断函数里面进行反转的PD4IO口,进入一次中断翻转一次,进入两次中断才能反转出一个周期,所以其频率应为250Hz。
对于模式三,IO翻转的频率要乘以二。
我们通过比较PWM输出的波形,与中断函数中反转的IO的波形开观察三种对齐方式的区别。
红色为PWM输出通道,黑色为反转的IO口。
模式一: 红色500Hz,黑色250Hz。
模式二:红色500Hz,黑色250Hz,但是两个波形的“相对位置”与模式1不同。
模式三:黑红都50Hz。
以上阐述了PWM输出中断的三种对齐方式的不同之处。
参考文章: