STM32产生异相方波

这几天一直在做蓝桥杯嵌入式开发历年的题目 在第七届决赛的模拟题中 有一个要求PA6和PA7产生两个异相并且频率可调的方波 后来我研究了一下STM32的Output comare mode,

因为要调节频率 所以选择了toggle 模式 使方波产生异相在中断中设置就行 先上手册的图

那 这是张老图了

STM32产生异相方波_第1张图片

在来看一下 官方StdLib3.5的OCToggle模式下的中断函数

void TIM1_BRK_TIM9_IRQHandler(void)
{
  /* TIM9_CH1 toggling with frequency = 366.2 Hz */
  if (TIM_GetITStatus(TIM9, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM9, TIM_IT_CC1 );
    capture = TIM_GetCapture1(TIM9);
    TIM_SetCompare1(TIM9, capture + CCR1Val );
  }

  /* TIM9_CH2 toggling with frequency = 732.4 Hz */
  if (TIM_GetITStatus(TIM9, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM9, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM9);
    TIM_SetCompare2(TIM9, capture + CCR2Val);
  }
}
OCToggle的运行方式基本是这样的:

如果TIMx_CNT=TIM_CCR1 那么就发生上面的中断 在中断里 他会将CCR1的值加上你自己设定的CCR1Val值 再赋值到CCR1 上 每发生一次中断 就会将电平翻转(toggle)

因为两者的频率一样 所以发生两个通道中断也应该是紧挨着的 

所以为了保持俩通道的相位差 在通道1发生中断时 再根据你的CCR2Val值的加上相应的值赋给CCR2 就相当于在通道1中端时 把通道2的时刻往后延时了一会儿

像下面这样

void TIM3_IRQHandler(void)
{

  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
    capture = TIM_GetCapture1(TIM3);
    TIM_SetCompare1(TIM3, capture + CCR1Val );
		TIM_SetCompare2(TIM3, capture +200);
  }


  if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM3);
    TIM_SetCompare2(TIM3, capture + CCR2Val);
  }
}
我CCR1Val和CCR2Val都设定的1000 加上200后CH2就产生了相移
STM32产生异相方波_第2张图片

原理是这样 在初始化时可以赋予不同的初值  就不需要开中断进行toggle了



你可能感兴趣的:(STM32工程中遇到的一些问题)