用过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. Java Spring Boot VS .NetCore (七) 配置文件

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  2. Angular路由——辅助路由

    一.辅助路由语法 同时控制多个插座内容. 第一步: 模版上除了主插座,还需要声明一个带name属性的插座 第二步: 路由配置中配置name为aux的插座上可以显示哪些组件,比如显示xxx和yyy组件. ...

  3. 【转】GB2312、GBK和UTF-8三种编码的简要说明

    原文地址:http://www.cnblogs.com/hust-yingjie/p/5481966.htmlGB2312.GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码.只是对于我们 ...

  4. hdu4791-Alice's Print Service

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 题目解释:给你一组数据s1,p1,s2,p2...sn,pn,一个数字q,问你当要打印q张资料时 ...

  5. 001.Ansible部署RHCS存储集群

    一 前期准备 1.1 前置条件 至少有三个不同的主机运行monitor (MON)节点: 至少三个直接存储(非外部SAN硬件)的OSD节点主: 至少两个不同的manager (MGR)节点: 如果使用 ...

  6. Hibernate根据实体类自动创建表

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码<propert ...

  7. PHP定界符<<<EOF

    PHP定界符<<<EOF 一.为什么需要使用定界符: 因为在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况, 如果用传统的输出方法 ——按字符串输 ...

  8. ECMA Script 6_唯一容器 Set_映射容器 Map

    唯一容器 Set ES6 提供了新的数据结构 Set Set 结构没有键名,只有键值(或者说 键名 和 键值 是同一个值) 它类似于数组,但是成员的值都是唯一的,没有重复的值 Set 内部判断两个值是 ...

  9. FJUT3260

    不是啊..不是说双栈嘛,,怎么是个**题啊. 链接:  http://120.78.128.11/Problem.jsp?pid=3260    从左到右扫一遍,把相交的区间扔到一起算,那么就变成了一 ...

  10. 随笔二-https://www.cnblogs.com/shang1680/p/9657994.html

    作业要求来自https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 GitHub远程仓库的地址:https://github.com/ ...