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)和通用定时器在基本 ...
随机推荐
- 小程序 wx.request
wx.request({ url: 'https://hanwslh5.qcloud.la/weapp/HelloWorld', 对于 GET 方法的数据,会将数据转换成 query string(e ...
- MySQL和B树的那些事
一.零铺垫 在介绍B树之前,先来看另一棵神奇的树——二叉排序树(Binary Sort Tree),首先它是一棵树,“二叉”这个描述已经很明显了,就是树上的一根树枝开两个叉,于是递归下来就是二叉树了( ...
- python中的while循环和for循环
1.while循环 Gif 演示 Python while 语句执行过程 while 语句时还有另外两个重要的命令 continue,break 来跳过循环,continue 用于跳过该次循环,bre ...
- Vue 增删改查 demo
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- python开发环境搭建及numpy基本属性-【老鱼学numpy】
目的 本节我们将介绍如何搭建python的开发环境以及numpy的基本属性,这样可以检验我们的numpy是否安装正确了. python开发环境的搭建 工欲善其事必先利其器,我用得比较顺手的是Intel ...
- Python学习(三十九)—— Django之Form组件
一.构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method=&qu ...
- Linux系统挂载Windows系统下的共享文件
声明:本文是小编借鉴大神们的经验,仅供学习使用. 第一步:在Windows系统上选择要共享的文件夹,右击“属性”-“共享”-“高级共享”-勾选“共享此文件”-设置共享名-“权限”-“添加”-“高级”- ...
- mysql的event(事件)用法详解
SELECT * FROM mysql.event;SET GLOBAL event_scheduler = 1; -- 开启定时器 0:off 1:on SHOW VARIABLES LIKE 'e ...
- docker备份mongodb数据,导入导出
场景:服务器要升级,之前在linux部署的mongodb没有用docker,升级后,mongodb要用docker部署,并将原有的mongodb数据导入到docker部署的mongodb中. 1.在l ...
- Jupyter notbook& REVEAL.JS& nbconvert 使用jupyter notebook制作slides
使用Jupyter notebook作为slide主要有两个方面: 在运行notebook 的时候可以幻灯片播放 这样幻灯片就有了notebook可交互的功能,而notebook就有了幻灯片全屏容易分 ...