你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

产生两种交替的高频pwm输出

[复制链接]
黑皮男 发布时间:2018-3-27 20:49
本帖最后由 黑皮男 于 2018-3-27 20:57 编辑

产生两种交替的高频pwm,最佳的组合就是使用主从定时器模式。一个定时器做主,用来产生pwm,另一个从定时器对主定时器进行计数,当产生足够数量的脉冲后,在从定时器的中断中更改主定时器的ARR和CCR的值,来更改定时器的pwm频率。但是当频率很高的时候,两种频率进行切换的时候,中间由于代码的延时,切换处的脉冲信号会有误差,不会和两种频率PWM的周期相同,这个对我的应用是能够满足的。目前测的2M以下的频率计数比较准确。下面是部分代码实现,只做原理说明,代码无法拿来直接用,需要一些其他相关配置,平台是nucleo-f303,主定时器是TIM2,从定时器是TIM15。请见谅,没有准备图

主要步骤:
1、主定时器初始化,设置好初始pwm频率
2、从定时器初始化,连接到主定时器
3、启动定时器
4、从定时器计数符合要求脉冲数,产生中断,切换主定时器的pwm频率

主定时器初始化
  1.     LL_TIM_SetClockSource(TIM2, LL_TIM_CLOCKSOURCE_INTERNAL);
  2.     LL_TIM_SetClockDivision(TIM2, LL_TIM_CLOCKDIVISION_DIV1);
  3.    
  4.     LL_TIM_SetTriggerOutput(TIM2, LL_TIM_TRGO_UPDATE);//主定时器主模式,更新事件产生触发信号到从定时器
  5.    
  6.     LL_TIM_SetCounterMode(TIM2, LL_TIM_COUNTERMODE_UP);
  7.    
  8.     LL_TIM_SetPrescaler(TIM2, SLOW_FREQ_PRESCALER);
  9.    
  10.     LL_TIM_EnableARRPreload(TIM2);
  11.    
  12.     LL_TIM_SetAutoReload(TIM2, SLOW_FREQ_RELOAD);

  13.     LL_TIM_OC_SetMode(TIM2, PWM_CHANNEL, LL_TIM_OCMODE_PWM2);
  14.    
  15.     LL_TIM_OC_SetPolarity(TIM2, PWM_CHANNEL, LL_TIM_OCPOLARITY_HIGH);
  16.    
  17.     LL_TIM_OC_SetCompareCH2(TIM2, SLOW_FREQ_PULSE);
  18.    
  19.     LL_TIM_OC_EnablePreload(TIM2, PWM_CHANNEL);
  20.    
  21.     LL_TIM_CC_EnableChannel(TIM2, PWM_CHANNEL);
  22.    
  23.     LL_TIM_GenerateEvent_UPDATE(TIM2);
  24.    
  25.     LL_TIM_DisableCounter(TIM2);
复制代码
从定时器初始化
  1.     NVIC_SetPriority(TIM15_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),10, 0));
  2.     NVIC_EnableIRQ(TIM15_IRQn);
  3.     //从模式,连接到TIM2
  4.     LL_TIM_SetClockSource(TIM15,LL_TIM_CLOCKSOURCE_EXT_MODE1);
  5.     LL_TIM_EnableMasterSlaveMode(TIM15);
  6.     LL_TIM_SetTriggerInput(TIM15, LL_TIM_TS_ITR0);
  7.    
  8.     LL_TIM_SetClockDivision(TIM15, LL_TIM_CLOCKDIVISION_DIV1);
  9.     LL_TIM_SetCounterMode(TIM15, LL_TIM_COUNTERMODE_UP);
  10.     LL_TIM_SetPrescaler(TIM15, 0);
  11.     LL_TIM_SetAutoReload(TIM15, SLOW_PULSE_NUM);//第一组脉冲的数量
  12.     LL_TIM_SetOnePulseMode(TIM15, LL_TIM_ONEPULSEMODE_SINGLE);
  13.     LL_TIM_GenerateEvent_UPDATE(TIM15);
  14.     LL_TIM_DisableCounter(TIM15);
  15.     LL_TIM_ClearFlag_UPDATE(TIM15);
  16.     LL_TIM_EnableIT_UPDATE(TIM15);
复制代码



从定时器中断函数
  1. void TIM1_BRK_TIM15_IRQHandler(void)
  2. {
  3.     if(LL_TIM_IsActiveFlag_UPDATE(TIM15))
  4.     {
  5.         LL_TIM_ClearFlag_UPDATE(TIM15);
  6.         LL_TIM_OC_SetMode(TIM2, PWM_CHANNEL, LL_TIM_OCMODE_FORCED_INACTIVE);
  7.         LL_TIM_DisableCounter(TIM2);
  8.         LL_TIM_SetAutoReload(TIM2, HIGH_FREQ_RELOAD);
  9.         LL_TIM_OC_SetCompareCH2(TIM2, HIGH_FREQ_PULSE);
  10.         LL_TIM_SetCounter(TIM2, 0);
  11.         LL_TIM_EnableCounter(TIM2);
  12.         LL_TIM_OC_SetMode(TIM2, PWM_CHANNEL, LL_TIM_OCMODE_PWM2);
  13.     }
  14. }
复制代码



启动定时器
  1.     LL_TIM_EnableCounter(TIM15);
  2.     LL_TIM_EnableCounter(TIM2);
  3.     LL_TIM_OC_SetMode(TIM2, PWM_CHANNEL, LL_TIM_OCMODE_PWM2);
复制代码







收藏 评论0 发布时间:2018-3-27 20:49

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版