sine wave产生1/3sin3wt的正弦波怎么设置

原标题:STM32 正弦波输出

是可以输出囸弦波的!怎么做要输出正弦波,需要好几个外设配合:Timer、DAC、DMATImer用来设置正弦波的频率的;DAC顾名思义将数字量转换成模拟量,在这里就昰转化成电压信号;DMA直接控制DAC输出而不用麻烦芯片内核。

下面讲讲它们之间如何配合工作首先要配置定时器的频率,并设置定时器为輸出触发然后配置DAC的触发源为定时器触发,并打开DAC的MDA功能接下去轮到DMA的工作了,设置DMA的操作对象为DAC按上面配置好后,三个外设就可鉯正常工作了:定时器每次计数值递增就触发DAC工作,然后DMA就控制DAC输出相对应的电压值在一个定时周期内,DAC输出电压值输出按正弦波的變化这样就产生了正弦波!

下面开始讲讲STM32的 代码,仍然还是在我自己的规范工程做修改

在代码中,我设置两路正弦波输出一路输出頻率为800Hz的正弦波,另一路输出频率为1600Hz的正弦波他们分别对应的DAC通道1的PA4引脚,与DAC通道2的PA5引脚所以代码中首先初始化这两个引脚:

接下去偠配置定时器了,定时器的作用就是设置正弦波的频率由于要输出两路频率不相同的定时器,所以这里需要配置两路的定时器一路设置频率为800Hz,另一路设置频率为1600Hz代码如下:

上面代码中宏定义中的sizeof(Sine12bit)是输出正弦波的数组的大小,它的类型是u16所以在要求出数组的元素的個数sizeof(Sine12bit)要除以2。之所以要用sizeof(Sine12bit)/2这张种方式而不是直接用常量256是因为在上面代码中,我定义了两个Sine12bit数组其中一个被我屏蔽掉了,如果想要使鼡被屏蔽的那个Sine12bit数组在解除它的屏蔽与屏蔽另一个Sine12bit数组后,_800Hz和_1600Hz的值就会自定改变以满足定时器的正确频率输出。上面两个Sine12bit[]数组中一個数组为Sine12bit[256]共256个元素,另一个屏蔽的是数组是Sine12bit[32]共32个元素这两个数组的元素如果在坐标上描点出来的话,就是一个周期的正弦波只不过具囿256个元素的数组描出来的曲线比只有32元素的数组描出来的曲线精确的多。这两个数组我都给出了,以便以后根据场合选择在这个工程裏我选着选择的是Sine12bit[256],画出精确的正弦波

接下去配置DAC,DAC总共2路通道由于要输出正弦波,所以这两个通道都需要配置代码如下:

DAC配置后,就临到DAM的配置了DMA配置代码如下:

首先需要说明的是为什么配置是DAM2,而且是DMA2的通道3与通道4这是因为不同外设都对应不同的DMA与DMA的通道,怹们的对应关系如下图所示:

上面的两幅图中看以找到DAC通道1对应的是DMA2的通道3,DAC通道2对应DMA的通道4

DMA_PeripheralBaseAddr = DAC_DHR12R1;这句话指定DAC外设的基地址,在宏定义中鉯已经给出了它的地址这个外设基地址地址取值可以查询产参考《STM32参考手册》。我以DAC通道1为例:查询《STM32参考手册》的2.3节可以查询到DAC的寄存器组地址范围为:0xx00077FF,如下图所示:

然后可以参考《STM32的11.5.14节》查找DAC寄存器映像表,选择DAC_DHR12R1寄存器查看其偏移为地址为0x08,如下图所示:

所以上媔定义的DAC_DHR12R1=基地址+偏移地址=0xx08=0x下面给出个寄存器的解释,可能过会有助于代码的理解:

后面还有其他一些代码就不细讲了自己看注释。

最後还需要定义一个总函数:SineWave_Init()它调用上面的这些函数来初始化与正弦波相关的代码:

下载讲讲SineWave.h文件,它也仅仅声明了SineWave_Init()函数以方便其他文件调用。

main函数需要调用上面定义的SineWave_Init()函数以初始化相关代码:

用 检查输出波形可以检测到频率分别为800Hz与1600Hz的正弦波。其实这不是测试的重点重点是观察使用Sine12bit[32]与Sine12bit[256]输出波形的区别。我采集输出频率为1600Hz的波形分别使用Sine12bit[32]与Sine12bit[256],他们分别对应下面的第一张图与第二张图:

两张图对比中可以看出使用Sine12bit[32]作为描点输出的波形中间有点断续,而使用Sine12bit[256]作为描点输出的正弦波则是非常地连续平滑的

}
翻译小组成员介绍: Alex
Alex英语爱好者,现工作于洛阳

正弦波(正弦曲线)曾使我迷惑不解我可以一边念叨“正弦,余弦正切”,一边画着三角形但它意义何在?

我一直误认為正弦源于其他形状设想场景:

  • 你:几何讲的是形状、线条之类...
  • Alien:哦?老师能举一个线条的例子吗
  • 你(左顾右盼):嗯……看到那块砖頭了吗?线条就是砖头的一条边
  • Alien:所以,线条是形体的一部分是吗?
  • 你:差不多可以这么理解大多数图形中包含线条。但线条本身昰一个基本概念比如一束光,地图上的一条路径甚至...
  • Alien:砖头包含线条,线条来自砖头砖头、砖头、砖头。

数学课几乎就是这个样子“圆包含正弦,正弦来自圆圆,圆圆。”

哎呀!不对!圆只不过是正弦的一个例子一句话:正弦是一种自然摆动,象征着平滑咜使得圆很“圆”,如同直线使得正方形很“方”

让我们正确看待正弦形状本身以建立直觉,然后弄清楚这家伙和圆形等的关系!开始啦!

概念和例子是有区别的:线条是一个基本的概念而正方形只它的一个例子。同理正弦也是一个基本概念,并非圆的一部分是不昰开始柳暗花明。

我们通过下面的程序观察正弦注意观察:

  • 首先请点击开始键。好了程序开始运行了!看到黄色小球正平稳地来回运動吗?那就是正弦!它是一种自然的摆动如同弹簧的弹跳,钟摆的摆动琴弦的振动...自然界中很多物体都可以做这种运动。
  • 现在请将“垂直”选项设置为“线性”是不是变化很大 - 运动变得固定和机械,如同一场乒乓球比赛

通过视频我们能看得更清下面请看

  • 线性运动是恒速的:以固定的速度运动,到边界后立即转身机器人舞蹈就是这种不自然的线性运动(注意07秒的无缓冲线性反弹和38秒的迟滞效应)。
  • 囸弦运动是变速的:开始快慢慢减速直至停止,然后又开始加速液体波动就是这种迷人的平稳运动(注意12秒和23秒的正弦运动以及47秒的洎然反弹)。

遗憾的是教科书并不用动画或者舞蹈来阐述正弦波,更喜欢把正弦波画在时间轴上(请将“水平”选项设置为“时间轴”)

惊讶吧,这就是我们经常看到的正弦波示意图从这张图里你能找到正弦运动的感觉吗?反正我是找不到还是先观察正弦运动,然後记录它的运动轨迹吧

圆的确包含正弦,但是要从圆里看出正弦来其难度不亚于从煎蛋饼里挑出鸡蛋。全混在一块儿啦!

不着急慢慢来。我们回到上面的程序重新设置为:

看黄色小球是不是开始水平摆动?那就是正弦运动只不过我们做了些微调:正常情况下,正弦从中间点开始运动迅速移动至最大点,然后返回中间点周而复始。这次黄色小球是从最大点开始,然后返回中间点我们称从最夶点开始的正弦为余弦。其实余弦只是正弦的一个不同版本(如同水平线是垂直线的不同版本大家都是直线,只是方向不同罢了)

万倳俱备。是时候让两个正弦波同时动起来了:请将程序设置为:

见证奇迹的时刻到了我们居然得到了一个圆!

水平向和垂直向的正弦运動组合得到圆周运动,多神奇!但是教科书从不这么解释它们总是先画一个圆,然后试图从中分解出正弦但是相对于“分解”,我更囍欢“组合”:先画水平正弦和垂直正弦然后组合得到圆。

我初学正弦时可没有这些认识:

正弦波在1个维度摆动现实中,我们常常把囸弦波画在时间轴上而且正弦运动的物体有时确实是在向前移动的。这给我们造成了一个假象:正弦运动是2维的但并非如此!在1个维喥弹跳的弹簧做得就是完美的正弦运动。

圆和正方形均是基本单元(正弦和线条)的组合圆由1个水平向和1个垂直向的1维正弦波关联组合洏成。

但是圆并不是正弦波的源同样正方形也不是线条的源。它们仅仅是例子

正弦值位于-1和1之间。它开始于0逐渐增大至1.0(最大值),然后减小至-1.0(最小值)最后返回到0。如果把正弦值看成一个百分数那么正弦运动就如同急行军,从0开始加速到100%(全速前进)后来又從-100%(全线撤退)回到0

正弦sin(x)的输入x指的又是什么?

虽然有些费解但是也可以弄清楚。sin(x)是一个无限循环而输入x就是我们在这个循环里的位置。

  • 假设你沿着一个在正方形的边行走,走完每条边需要10秒钟
  • 1秒后,你走完一条边的10%
  • 5秒后你走完那条边的50%
  • 10秒后,你走完整条边

线性运动就是这样平淡无奇现在看看正弦(注意“0到最大值”这个区间):

  • 这次,我们沿着正弦波行走从0(中间值)走到1.0(最大值)。此过程需时10秒
  • 5秒后,我们走完行程的70%!正弦运动在起始点的速度很快然后慢慢减速。前5秒内就完成了大半行程
  • 剩下的5秒,我们将走唍剩下的70%到100%这段行程而且,最后98%到100%这段我们将整整走1秒钟

尽管初始速度很快,但是正弦运动就是这样它会温柔地减速,直至停在最夶值然后华丽转身。就是这份从容使得正弦波格外与众不同

快速问答:线性循环的10%和正弦循环的10%,哪一个距离原点更远答案是正弦。前面提到正弦运动在原点的速度最快。当正弦运动完成循环的50%时它的速度降低到线性运动的平均速度,之后正弦运动继续减速直臸停在最大点,然后返回所以,在开始阶段正弦运动跑得比线性运动快

可见,输入x是指完成循环的量那么,循环又是什么呢

这和應用背景密切相关。

  • 在基础三角学中'x'为角度,一个循环为360度
  • 在高阶三角学中,'x'为弧度(弧度更自然)一个循环为单位圆一周(2pi)

问題又来了,循环依赖于圆!我们还能摆脱圆的纠缠吗

书接上文(点击查看), 让我们继续探索正弦曲线/正弦波...

假设Alien本人视力极差,仅能模糊地汾辨明暗阴影怎样向他描述 π 呢?因此就很难让Alien明白圆周的概念对吧?

退一步以旁观者的角度来观察。正弦是一个循环图案意味著它要不断地重复!从0增加到1,然后开始减小到0继续减小到-1,然后又回到0周而复始。

定义π为正弦从0增加到1并回到0所需要的时间这樣一来,就可以脱离圆来使用π了。其实π的概念只是凑巧被显示在圆内罢了

  • 正弦是一种平缓的来回摆动
  • π是正弦从中间位置摆动到最大值然后回到中间位置所需要的时间
  • n*π(0*π,1*π,2*π,如此类推)是正弦运动处于中间位置的时刻
  • 2*π,4π,6*π等等,是正弦运动完成整数倍循环的时刻

这就是π经常出现在公式里的原因!π和0和1一样并不属于圆 - π用于描述正弦运动回到中心位置的时刻。而圆只是一个与π相关的图形,它不断重复,并每2*π个单位时间回到原位一次。其实,弹簧,琴弦震荡等正弦运动也是每π个单位时间回中心位置一次。

如果π是半个循环,为何不是一个简单的整数呢?

这得先从另外一个问题入手为何一个边长为1的正方形有一个长度为根号2(=1.414...一个无理数)的对角线?

当數学遇到难以解释的自然现象时就会带来哲学上的困惑。虽然直觉不佳但我仍然本能的意识到简单的规则(边长为1的正方形配上勾股萣理)同样可以解决复杂的问题。

前面我“设想正弦运动从0到最大值需要10秒”。现如今我又说正弦运动从0到最大值然后返回0需要π秒。那么正弦运动到底有多快呢?

  • sin(x)是正弦波的一种最为常见的表达式。它的确需要π个单位时间从0到最大值并返回0(或者需要2*π个单位时间完成一个循环)

以此类推我们可用sin(n*x)来获得指定速度的正弦波。但通常情况下“正弦波”指一种图形,而非速度


这部分内容有些费脑 --洳觉必要可先放松一下。通过上述学习希望已经对正弦有了基本概念。接下来学习正弦的常用定义研究之间的相互关系,并建立起“囸弦直觉”

定义1:三角形的高和圆

正弦首先是在三角形里发现的。你也许还记得我在文首念叨的“正弦余弦,正切”

  • 正弦: 正弦是对边除以斜边
  • 余弦:余弦是邻边除以斜边
  • 正切:正切是对边除以邻边

直角三角形中sin(x) 是角x的对边除以斜边。如果定义斜边为1可以简化为:

进一步,我们可以将斜边为1的三角形画在半径为1的圆内

如果使用等比缩放的方法,一个圆可以包含所有的直角三角形例如:

  • 将一根100英尺长竹竿一端抬高与地面形成45度角。则竹竿的最高点离地面10 * sin(45) = 7.07英尺

这种方法对建筑业意义非凡(不用实测金字塔就可得到相关尺寸)。遗憾的是千年之后,我们却开始相信正弦是三角形的高我们对正弦误解太深,它其实是一种显示在圆(和三角形)中的形状

实际上,在许多問题上我们都会运用“图形模式”思考想着正弦等于三角形的高,以提高解题效率这很好,但别局限于此

我们此前避开了一个重大問题:怎样计算正弦值?计算器是通过画圆并测量长度得到正弦值的吗

只是开个玩笑而已。下面来解开正弦的秘密:

正弦是与当前位置楿反的加速度

以银行账户为例:你有一个固执的老板他执意根据银行账户来确定你的工资增幅,并且增幅与你账户余额恰好相反比如賬户现有50美元,那么你下周工资增幅就是-50美元当然,假如你当前本周工资是75美元因此下周你仍然有25美元的收入(75-50)。但是当这种“负的增幅”最终超过你的收入时,你账户就开始透支了

但是,也用不着担心!一旦你的账户变成负的(比如为-50美元)老板会给你每周50美元嘚增幅。下周你的收入可能仍然负的但是“正增幅”最终增幅会超过它,你的账户就开始增长

恒定的向心力使循环得以持续:上升时,向心力会偷偷把你拉回来这也解释了为什么正弦波在中间位置速度最快:从最大值开始的回落过程不断积累“负增长”。到达中间位置时“负增长”达到最大。一旦越过中间位置开始获得正能量,并逐渐放缓

题外话:既然正弦是与当前位置相反的加速度,而圆又昰由水平和垂直正弦波组成...所以圆周运动可以描述为:在“一个持续的与当前位置相反的朝向水平和垂直中心的向心力”牵引下的运动。

用微积分描述正弦曲线/正弦波如同 e,正弦波可以分解为更细微的起伏:

  • 正弦波从0开始以单位速度增长
  • 此过程中一个相反的加速度企圖将它拉回原点

该如何理解这个过程?上述力量如何改变正弦波离原点的距离

  • 初始推力使得距离线性增长:y (离原点距离) = x (时间)
  • 随时受到一個大小为 -x 的反方向作用力。通过双重积分将负的加速度转换为距离:

加速度对距离的影响如同上例中工资增幅对银行账户的影响。“工資增幅”势必改变收入而收入又改变银行账户(两个改变累‘积’发生作用)。

因此不难猜到,x 秒之后正弦值为 x(初始值)减去 x?/3!(負加速度的影响):

但是好像哪里出错了 -- 正弦是一个平稳的过程,并不会骤然下降!e是 通过“增长产生增长”的模式逐渐缓缓递增的囸弦实质上也一样。“反作用力”使正弦离原点的距离减小 x?/3!而这个‘减小’又产生了另外一个“反作用力”。观察弹簧不难发现:拉伸的弹簧向平衡点运动然而它在向下回弹时又会越过平衡点,继而产生一个向上的拉力(同理弹簧在向上回弹时也会越过平衡点)。瘋狂的弹簧!

每一个“反作用力”都需要被考虑到:

  • y = x是初始状态产生一个“反作用力”
  • y = -x?/3!,产生一个“反作用力”
  • y= x^5/5!产生一个“反作用仂”

如同e,正弦可以描述为一个无穷级数:

当我将正弦看作初始推力和反作用力的组合时这个公式就容易理解了。初始推力(y=x正方向)最终会被反作用力超过,而这个反作用力最终又会被它自己的反作用力所超过周而复始,无限循环

余弦是位移后的正弦。既然已经悝解了正弦余弦当然不在话下!

  • 余弦:开始于1,无初始推力

所以开始时余弦待在1这个地方,静候反作用力来推:

同理, 我们对-1双重积分嘚到第一个反作用力-x?/2! 这个反作用力产生了第二个反作用力,第二个又产生了第三个...结果就得到下面的式子:

上式用特定的方程描述正弦其实,一个更简洁的方法是用微积分方程:

这个公式极具数学之美:

  • 加速度(二阶导数y'')与当前位置相反(-y)

这个公式在正弦和余弦裏都能得到验证可是,一开始我是拒绝这个定义的它和正弦的形象简直差之千里。然而我没意识到它揭示了正弦的实质(“与当前位置相反的加速度”)。

正弦和 e 相互关联而且e^x可用下式表述:

与正弦公式相似,只是符号变为正即“加速度与当前位置相等”。然而如果正弦仍然被表述为“圆内高度”,那么我们很难将它和 e 联系起来

我很遗憾没有学好微分方程。但是现在我想学了因为微分方程使得正弦表述起来更简洁,并且我觉得对正弦和e拥有直觉对学会数学尤为重要

本文目标是展示更多更多正弦的内容(基本的图形和的概念),而不是数学中一个微不足道的角色(圆的一部分)

  • 正弦是在极大值(1)和极小值(-1)之间的平稳摆动从数学角度看,就是加速度與当前位置相反这个“负增长”使得正弦永不停歇的摆动下去。
  • 正弦并非圆的一部分只是碰巧出现在了圆和三角形里(弹簧,钟摆琴弦震荡,声波等都是正弦波)
  • pi是sin(x)从中间位置出发然后又回到中间位置所需的时间同样地,pi并不属于圆也碰巧出现在圆里罢了。

把正弦装进“头脑工具箱”(以便用于产生平滑运动)最终,我们将直观地理解这些基础概念(epi,弧度虚数,正弦等等)并用它们做絀一道美味的数学“大餐”!享受吧!(完)

「予人玫瑰, 手留余香」感谢支持微信号 [遇见数学]!

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信