用过stm32定时器的朋友都知道,定时器的CCR寄存器,可以用来配置PWM的输出,但同样也可以用来配置spwm。废话不多说,直接上代码。

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

1.同步调制还是异步调制。

      2.载波比N设置为多少

3.spwm计算法

4.prescaler和period的值

     5.改变CCR还是改变ARR

下面是程序的大致情况:

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)离散化处理,

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

  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);

stm32高级定时器的应用——spwm的更多相关文章

  1. Stm32高级定时器(四)

    Stm32高级定时器(四) 1 编码器接口模式 1.1 编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向.根 ...

  2. Stm32高级定时器(三)

    Stm32高级定时器(三) 1 互补输出和死区插入 1.1 死区:某个处于相对无效状态的时间或空间 本来OCX信号与OCXREF时序同相同步,OCXN信号与OCXREF时序反相同步.但为了安全考虑,以 ...

  3. Stm32高级定时器(二)

    Stm32高级定时器(二) 1 主从模式:主?从? 谈论主从,可知至少有两个以上的触发或者驱动信号,stm32内部有多个定时器,可以相互之间驱动或者控制. 主模式:定时器使能只受驱动时钟控制或者输出控 ...

  4. Stm32高级定时器(一)

    Stm32高级定时器(一) 1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波 ...

  5. Stm32高级定时器(转自:luowei_memory)

    1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波形 增量正交编码器驱动电机获 ...

  6. STM32高级定时器用于普通定时,定时周期变长

    最近在用stm32定时器控制步进电机,由于普通定时器不够用,只能把TIM1当普通定时器用,我随手就把普通定时器的代码搬过去. void cs_Timer_Init(void) //TIM1 us级 { ...

  7. STM32高级定时器TIM1产生两路互补的PWM波(带死区)

    测试环境:Keil 5.20.0.0 STM32F103RBT6 固件库版本:STM32F10x_StdPeriph_Lib_V3.5.0(2011) 本文使用TIM1的通道1,通道2,产生两路1kh ...

  8. stm32高级定时器1互补输出 验证代码

    GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDe ...

  9. 高级定时器TIM1&TIM8

                                               高级定时器 初识stm32高级定时器:      (1)高级控制定时器(TIM1 和 TIM8)和通用定时器在基本 ...

随机推荐

  1. 一起学HBase——简单介绍HBase各种组件

    HBase是谷歌BigTble的开源实现.谷歌的三篇论文拉开了大数据江湖的序幕,铸就了现在以Hadoop为主的大数据技术生态圈.而HBase是开源的大数据数据库,和传统的行式数据库不同的是,HBase ...

  2. 分布式session解决——Spring-data-redis

    1.如果没有集成shiro来管理session,可以直接使用spring-session 2.若集成了shiro,需要Spring-data-redis (或 shiro-redis) 3.nginx ...

  3. 15,EasyNetQ-高级API

    EasyNetQ的使命是为基于RabbitMQ的消息传递提供最简单的API. 核心IBus接口有意避免公开AMQP概念,如交换,绑定和队列,而是实现基于消息类型的默认交换绑定队列拓扑. 对于某些场景, ...

  4. sublime 学习笔记

    一.subline text 常用快捷键1.安装插件:ctrl + shift + p -> packages controll -> 输入插件的名字即可2.python 的脚本的运行 c ...

  5. PostgreSQL自学笔记:与python交互

    与python交互教程 原文地址:https://www.yiibai.com/html/postgresql/2013/080998.html 1. Python psycopg2 模块APIs 连 ...

  6. NEO智能合约开发(一)不可能完成的任务

    悬赏任务 兹有如下合约 public static object Main(string method, object[] args) { if (Runtime.Trigger == Trigger ...

  7. Class.forName()+Class.forName().newlnstance()和new语句和初始化块+static初始化块+构造方法之间的关系

    先上代码 class A{     int a;     static {System.out.println("载入类时执行");}     public A() {       ...

  8. css 定位布局

    文档流: 文档流,是指盒子按照html标签编写的顺序依次从上到下,从左到右排列.块元素占一行,行内元素在一行之内从左到在排列,先写的先排列,后写的排在后面,每个盒子都占据自己的位置. 关于定位: 可以 ...

  9. php+ajax文件上传

    php+ajax文件上传 html: <input id="user_real_name" class="input_show" type="t ...

  10. 【函数式编程】reducer为什么叫reducer

    最近学习前端的技术,在了解react对DOM的组件抽象,但不提供整体的组件通讯时候,了解了redux,然后就是react-redux: 抽象后,视图完全由对象决定,而用户只能接触视图,所以对象的改变必 ...