STM32G474有3路12位1MSPS的DAC通道
通过STM32CubeMX软件可以很方便的进行配置
比如下边就介绍如何使用NUCLEO-G474实现正弦信号发生器
首先是配置时钟,可以根据需求配置时钟频率和时钟源,G474最大支持170MHz的主频,这里设置成最大170MHz
然后左边找到DAC1,单击后在中边的DAC1 Mode and Configuation里选择OUT1 mode为Connected to external pin only意思是配置DAC1_OUT1为外部输出
为了精准控制DAC的输出频率需要配置为定时器触发,我准备使用TIMER4来触发DAC1_OUT1输出,所以在Trigger里选择Timer r Trigger Out event
在DAC的DMA选项卡中将DMA Request选择为DAC1_CH1(也只能选这个),Channel选择DMA1 Channel 1,DMA Request Settings的Mode设置为Circular,Mode是用来选择数据输出的模式,假如有10个数据,模式选择Normal时输出完第10个数据时DAC会停止输出,直到再次执行HAL_DAC_Start_DMA函数,选择Circular时数据会循环输出,当输出到完第 10个数据后会从0开始循环输出,重复将一组数据正弦数据通过DAC输出就能生成连续的正弦波了,Data Width的Peripheral处选择Word其它默认即可。
配置好DAC以后需要再对定时器进行配置
选择TIM4(也可以是任意定时器,只要DAC的Trigger选择对应的定时器即可),Clock Source选择Internal Clock,下边的Prescaler分频值设置为0,Counter Period选择170-1,TriggerEventSelectionTRGO选择Update Event,主频是170MHz,每170个周期产生一个Update Event事件,这样DAC的更新频率就是1MHz。
配置好以后生成工程文件,然后打开对应工程
在工程里加入正弦数据数组
在主函数里加入启用DAC和定时器的函数即可
将工程下载到开发板并支行,就能看到漂亮的正弦信号,频率是DAC的更新频率除正弦表的长度,1Msps/60=16.66KHz,如果要修改频率可以修改Timer4的Update Event时间,也可以修改正弦表的数据长度
工程文件:
此内容由EEWORLD论坛网友littleshrimp原创,如需转载或用于商业用途需征得作者同意并注明出处
多年前用STM32做LCR玩,用的是片上DAC来生成正弦波参考信号,总是发现相位跳动严重,后来就放弃了,当时就是怀疑是STM32的DAC的关系,直到今年年初的时候偶尔看到ST官方新出的关于DAC的一篇文章,里面就用了一页的篇幅说明了DAC的触发问题,貌似用TIMER触发DAC转换有个延时,这个延时官方资料好像是2.5个周期,实际上因为同步关系运行时是2~3个时钟是不确定的随机变化的,故此由STM32的内置DAC来产生波形会有一定的抖晃。最近又在找这篇文章想确认下可是一直没找到,现在看到这个G474貌似DAC时钟树貌似跟之前的好像有不一样,不知道是不是还存在这个问题,这个也只能等ST官方来给出答案了
引用: jackfrost 发表于 2019-9-3 09:48 多年前用STM32做LCR玩,用的是片上DAC来生成正弦波参考信号,总是发现相位跳动严重,后来就放弃了,当时就 ...
STM32的DAC产生正弦波频率应该很低,十几纳秒的抖动对测量影响大吗?
jackfrost 发表于 2019-9-3 18:06 应该是不止十几纳秒,LCR测量上面就大了,相位不稳副参数就跳得厉害,后来改成直接用PWM产生方波滤波成正弦 ...
LCR需要的相位这么严格吗?
扫频仪好像一般使用DDS吧?
stm32的DAC波动是否在ISR中刷新DAC的内部寄存器,导致DAC瞬间的输出有不可控的混乱期?
我在看stm32的手册,好像也看到这个瞬间
本帖最后由 threetigher 于 2020-2-18 17:51 编辑
引用: jackfrost 发表于 2019-9-3 18:06 应该是不止十几纳秒,LCR测量上面就大了,相位不稳副参数就跳得厉害,后来改成直接用PWM产生方波滤波成正弦 ...
例如这个pwm两次切换就导致不可控的瞬态pwm
引用: jackfrost 发表于 2019-9-3 18:06 应该是不止十几纳秒,LCR测量上面就大了,相位不稳副参数就跳得厉害,后来改成直接用PWM产生方波滤波成正弦 ...
非常感谢,参考你的代码试下了DAC功能