关于timer产生pwm出现一个周期异常波形分析(Linux)

本文探讨了在调整占空比时遇到的闪屏问题,通过分析发现是由于timer匹配中断触发延迟导致的溢出中断忽视。文章提出了设置共享中断和时机把握策略,以避免定时器中断漏触发。解决方法涉及中断响应速度和PWM周期管理。
摘要由CSDN通过智能技术生成

1、问题描述:在调整占空比中,发现在缩小占空比过程中有概率出现闪屏问题,从示波器抓取图像如下

 

2、原因分析异常波形(如下图)中,timer匹配中断没有触发电平翻转,导致timer溢出中断被忽视,直到下次timer匹配中断触发电平翻转

 

3、 timer产生pwm原理:TLDR决定PWM的频率,TCRR决定PWM的占空比,TCLR决定周期的起始电平

4、得出结论:设置TCRR值过程中,需要把握好设置的时机,如果现在TCRR的值小于原本TCRR且刚好定时器计数值刚好在这两个TCRR之间就会引发定时器匹配中断漏触发,接着定时器溢出中断也被忽视,造成上述问题点

5、问题解决:设置一个共享中断绑定定时的匹配中断,当匹配中断触发时,设置TCRR值,这样子基本可以避免上述出现的问题,除非中断响应速度跟不上PWM周期时间

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
我可以为您提供一个示例代码,它可以帮助您在STM32上产生PWM:#include<stdio.h> #include "stm32f4xx.h" //定义PWM输出引脚 #define PWM_OUTPUT_PIN_1 GPIO_Pin_9 #define PWM_OUTPUT_PIN_2 GPIO_Pin_11 //定义PWM引脚的端口 #define PWM_OUTPUT_PIN_GPIO_PORT GPIOA //定义PWM波形的频率 #define PWM_FREQUENCY 10000 //定义PWM模块的通道 #define PWM_CHANNEL_1 TIM_Channel_2 #define PWM_CHANNEL_2 TIM_Channel_4 //定义PWM模块 #define PWM_TIMER TIM4 //定义PWM模块的定时器时钟 #define PWM_TIMER_CLK RCC_APB1Periph_TIM4 //定义PWM模块的引脚时钟 #define PWM_OUTPUT_PIN_GPIO_CLK RCC_AHB1Periph_GPIOA //定义PWM模块的初始化结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; //PWM初始化函数 void PWM_Init(void) { //使能PWM模块的时钟 RCC_APB1PeriphClockCmd(PWM_TIMER_CLK, ENABLE); //使能PWM引脚的时钟 RCC_AHB1PeriphClockCmd(PWM_OUTPUT_PIN_GPIO_CLK, ENABLE); //配置PWM引脚的GPIO GPIO_InitStructure.GPIO_Pin = PWM_OUTPUT_PIN_1 | PWM_OUTPUT_PIN_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_Init(PWM_OUTPUT_PIN_GPIO_PORT, &GPIO_InitStructure); //将GPIO与TIM4相连接 GPIO_PinAFConfig(PWM_OUTPUT_PIN_GPIO_PORT, GPIO_PinSource9, GPIO_AF_TIM4); GPIO_PinAFConfig(PWM_OUTPUT_PIN_GPIO_PORT, GPIO_PinSource11, GPIO_AF_TIM4); //设置PWM模块的定时器参数 TIM_TimeBaseStructure.TIM_Period = (SystemCoreClock / PWM_FREQUENCY) - 1; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(PWM_TIMER, &TIM_TimeBaseStructure); //设置PWM模块的输出参数 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 0; //初始化PWM模块的通道1 TIM_OC2Init(PWM_TIMER, &TIM_OCInitStructure); TIM_OC2PreloadConfig(PWM_TIMER, TIM_OCPreload_Enable); //初始化PWM模块的通道2 TIM_OC4Init(PWM_TIMER, &TIM_OCInitStructure); TIM_OC4PreloadConfig(PWM_TIMER, TIM_OCPreload_Enable); //使能PWM模块 TIM_Cmd(PWM_TIMER, ENABLE); } //设置PWM输出的占空比 void PWM_SetDutyCycle_Channel1(u16 DutyCycle) { TIM_SetCompare2(PWM_TIMER, DutyCycle); } //设置PWM输出的占空比 void PWM_SetDutyCycle_Channel2(u16 DutyCycle) { TIM_SetCompare4(PWM_TIMER, DutyCycle); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只很笨很懒的肥猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值