stm32高级定时器的应用——spwm

 

          用过stm32定时器的朋友都知道,定时器的CCR寄存器,能够用来配置PWM的输出,但一样也能够用来配置spwm。废话很少说,直接上代码。算法

  首先,你得考虑一下几个因素:异步

                1.同步调制仍是异步调制。函数

      2.载波比N设置为多少3d

                3.spwm计算法blog

                4.prescaler和period的值同步

     5.改变CCR仍是改变ARRit

 

     下面是程序的大体状况:io

                1.使用同步配置

      2.载波比设置为N = 360遍历

                3.采用对称规则采样法

                4.经过中断时实改变CCR的值

                5.使用stm32f429,它的高级定时器时钟频率为180M(不分频的状况下)

                6.计数器采用递增递减的方式技术

——————————————————————————————————————————

1.GPIO的复用

使用了TIM8_CH1和TIM8_CH1N,两个引脚。

这两个脚是复用功能,因此在配置GPIO口的时候,要调用

这段代码在GPIO配置以前,仍是GPIO_Init()以后都没有太大的影响。

 

2.ARR值与CCR

          定义计数频率,TIM_CLk,和滤波后正弦波的频率,Sin_F那么

                          prescaler = 定时器计数频率 / TIM_CLK - 1;

                           period  = TIM_CLK / (2*Sin_F *N) - 1;

3.定时器计数方式的设定

            不要死记什么TIM_CountMode_CenterAligned1,等,每款板子可能不同。

       在这块stm32f4的板子上面,CMS = 01 ,对应定时器递减计数的时候,当计数的值等于CCR的值时,就触发中断,查看对应的寄存器

4.中断函数的处理

       首先进行中断向量表的配置,这你们都会吧

        根据对称规则采样的公式  D = 载波的周期 / 4 *(1 -   调制比 * sin(x)).

        这里将sin(x)离散化处理,由于sin函数的值是小于1的,因此Sin_Tab[]应该是float或者double型

      

          若是正弦波的周期定了,那么载波的定时器的周期也定了,参考下面的函数,

  float n1_RET(float Sin_F)
  {
    static float temp;
    temp = TIM_CLK;
    temp = temp/Sin_F;
    temp = temp/N;
    temp = temp/4;
    return temp;
  }

   这个函数就是计算载波周期的四分之一,当它的返回值乘以占空比就获得公式的第二个参数,

  

  float n2_RET(float M,float AN_RET)
  {
    static float temp;
    temp = AN_RET;
    temp *= M;
    return temp;
  }

最后在中断处理函数里面更新CCR的值,记住一次只更新一个值,并非让你更新N个,

     因此在中断处理函数中不须要对 i 进行 1 ~ 360 的遍历 , 只须要 每次递增就好了。

     当 i 超过 N 时,进行复位就能够了。

  TIM_ClearITPendingBit(ADVANCE_TIM, TIM_IT_CC1);

  NewChannelValue = (int)(n1_Temp - n2_Temp*Sin_Tab[i++]);

  if ( i == 360)   {     i = 0;   }   TIM_SetCompare1(ADVANCE_TIM,NewChannelValue);

相关文章
相关标签/搜索