stm32高级定时器的应用——spwm
用过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的更多相关文章
- Stm32高级定时器(四)
Stm32高级定时器(四) 1 编码器接口模式 1.1 编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向.根 ...
- Stm32高级定时器(三)
Stm32高级定时器(三) 1 互补输出和死区插入 1.1 死区:某个处于相对无效状态的时间或空间 本来OCX信号与OCXREF时序同相同步,OCXN信号与OCXREF时序反相同步.但为了安全考虑,以 ...
- Stm32高级定时器(二)
Stm32高级定时器(二) 1 主从模式:主?从? 谈论主从,可知至少有两个以上的触发或者驱动信号,stm32内部有多个定时器,可以相互之间驱动或者控制. 主模式:定时器使能只受驱动时钟控制或者输出控 ...
- Stm32高级定时器(一)
Stm32高级定时器(一) 1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波 ...
- Stm32高级定时器(转自:luowei_memory)
1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波形 增量正交编码器驱动电机获 ...
- STM32高级定时器用于普通定时,定时周期变长
最近在用stm32定时器控制步进电机,由于普通定时器不够用,只能把TIM1当普通定时器用,我随手就把普通定时器的代码搬过去. void cs_Timer_Init(void) //TIM1 us级 { ...
- STM32高级定时器TIM1产生两路互补的PWM波(带死区)
测试环境:Keil 5.20.0.0 STM32F103RBT6 固件库版本:STM32F10x_StdPeriph_Lib_V3.5.0(2011) 本文使用TIM1的通道1,通道2,产生两路1kh ...
- stm32高级定时器1互补输出 验证代码
GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDe ...
- 高级定时器TIM1&TIM8
高级定时器 初识stm32高级定时器: (1)高级控制定时器(TIM1 和 TIM8)和通用定时器在基本 ...
随机推荐
- Java Spring Boot VS .NetCore (七) 配置文件
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- Angular路由——辅助路由
一.辅助路由语法 同时控制多个插座内容. 第一步: 模版上除了主插座,还需要声明一个带name属性的插座 第二步: 路由配置中配置name为aux的插座上可以显示哪些组件,比如显示xxx和yyy组件. ...
- 【转】GB2312、GBK和UTF-8三种编码的简要说明
原文地址:http://www.cnblogs.com/hust-yingjie/p/5481966.htmlGB2312.GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码.只是对于我们 ...
- hdu4791-Alice's Print Service
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 题目解释:给你一组数据s1,p1,s2,p2...sn,pn,一个数字q,问你当要打印q张资料时 ...
- 001.Ansible部署RHCS存储集群
一 前期准备 1.1 前置条件 至少有三个不同的主机运行monitor (MON)节点: 至少三个直接存储(非外部SAN硬件)的OSD节点主: 至少两个不同的manager (MGR)节点: 如果使用 ...
- Hibernate根据实体类自动创建表
Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码<propert ...
- PHP定界符<<<EOF
PHP定界符<<<EOF 一.为什么需要使用定界符: 因为在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况, 如果用传统的输出方法 ——按字符串输 ...
- ECMA Script 6_唯一容器 Set_映射容器 Map
唯一容器 Set ES6 提供了新的数据结构 Set Set 结构没有键名,只有键值(或者说 键名 和 键值 是同一个值) 它类似于数组,但是成员的值都是唯一的,没有重复的值 Set 内部判断两个值是 ...
- FJUT3260
不是啊..不是说双栈嘛,,怎么是个**题啊. 链接: http://120.78.128.11/Problem.jsp?pid=3260 从左到右扫一遍,把相交的区间扔到一起算,那么就变成了一 ...
- 随笔二-https://www.cnblogs.com/shang1680/p/9657994.html
作业要求来自https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 GitHub远程仓库的地址:https://github.com/ ...