STMCU小助手
发布时间:2022-4-8 23:30
|
前言3 y8 Y5 H6 z/ p3 a3 ? 正弦波曲线的函数公式是:y=sin(x) y的范围区间是[-1:1] $ i% l; P, d) P- z% u x的取值范围是任意实数# {6 k" I& ^2 H: o 9 Y7 s5 E2 Q% N! I. C: J 周期为2π ; ?8 J4 n: f. Q: i& v# D3 z$ w H# I 如下图所示的蓝色函数曲线: ' U/ I! e8 F ]0 s* k0 J5 H& u
$ w+ h+ j( A5 a1 C( i+ t) f 使用DAC生成正弦波比较方便的方法是预先生成一个正弦波的数据点表,为了能够快速设置到DAC上所有会使用到DMA,然后通过定时器控制DAC的出样频率就达到了生成正弦波的效果。 那么这个正弦波数据点表是怎么生成的呢?下面就来讲解一下。1 K" [" g' O# v2 Z5 `: f( c3 A+ A; p 将这个y=sin(x)函数映射成我们现在的这个正弦波,那么y就是代表的电压,x代表的周期。# |, f6 Y# T/ I$ T% V' V / q* x+ r) Q8 F9 C/ p1 D 由于y=sin(x)的值范围在[-1:1]之间,DAC设置的时候不存在负数,所以就需要加1让公式生成的值都在正数范围内,公式就变成了y=six(x) + 1,现在值范围就成了[0:2],但是这样最高能表示到2V,而DAC是能输出到3.3V的,也就是说y=six(x) + 1输出2V的时候代表3.3V,所以就需要对y=six(x) + 1进行扩大,比值关系就是3.3V:2V,所以公式又变成了y=(sin(x) + 1)*(3.3/2),这样值范围就变为了[0:3.3],然后再将电压转为DAC数值就可以了。 , }+ R# L, a1 N t+ e, e) J 因为正弦波每周期的波形都是一样的,所以我们生成一个周期的数据表即可。 5 ]5 ^( y3 h6 g% Q1 m0 c 经试验所得,一个周期内满足32个点就能近似逼近正弦波的效果,这里为了波形更好看,我选择了100个点。 周期为2π,一共100个点,那么每两个点的间距就是2π/100。 ; v7 g# `+ Z6 T; O: z
工程配置 时钟配置到72M主频: . [2 ]% _- t; l' V: }% R
配置DAC 0 l3 ~8 I$ a& f* o0 I: U3 N
, w( H# N: P8 l( [+ n 说明: Output Buffer:输出缓存7 s- Y$ P# B5 t# ^" O2 J 8 ~- Z- Q" H4 Y% Z/ T DAC 集成了 2 个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个 DAC 通道输出缓存可以通过设置 DAC_CR 寄存器的 BOFFx 位来使能或者关闭。如果带载能力还不行,后面就接一个电压跟随器,选择运放一定要选择电流大的型号。 使能输出缓冲后,DAC 输出的最小电压为 0.2V,最大电压为 VREF±0.2,而未使能输出缓冲则输出可达到0V。4 [4 M7 n5 o5 f2 f0 G: x + y3 M5 M* C# C5 t3 }* T) q Tigger:触发方式 1 p/ Y0 I, T9 \. \, _8 ^! L 选择DAC的触发方式,可以选择为定时器触发、外部中断触发和软件触发。这里我选择了定时器6来触发DAC,因为通过设置定时器的频率就可以很方便的控制DAC输出的正弦波频率。 Wave generation mode:波形发生器: M$ d& Z; m7 w# a5 x ; V8 O% ^3 o' {0 o+ `/ ?0 x 我这里没有使用。 配置DMA8 ?; j8 T. K1 R! w; K ' K) R* q0 Y1 e+ g" C2 [3 r
( j# L! \) \7 e! |! F 配置定时器
定时器6的时钟主频为72MHz,我这里没有分频,那么把重载值设置为72,这样就得到了72M/72=1MHz的触发频率。 上面说到过我的设置是一个周期内100个点,定时器触发频率为1MHz,触发一百次才能完成一个周期的波形,所以生成的波形频率就是1MHz/100个点=10KHz。 8 ~6 h4 I3 `% p3 M' s2 S$ {& L 最后启动定时器和DMA传输即可:
生成的波形用示波器查看如下:
|
经验分享 | 通过STM32 TIMER的PWM功能模拟输出正弦波
SPI 32位宽DMA方式收发失败问题
多通道DMA传输为何有一路异常?
经验分享 | STM32N6 ADC DMA 传输失败案例分享
经验分享 | DMA发送函数只能第一次调用有效?
经验分享 | 使用EXIT0同步触发SPI的DMA发送话题
【开发经验】LAT1500 如何通过DMA配合CRC功能
我心中的ST中文论坛
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
经验分享 | 使用GPIO+DMA+TIM模拟SPI通信演示
微信公众号
手机版