dql2016 发表于 2023-9-27 22:40

【NUCLEO-H743ZI】4、DAC产生正弦信号&片上运放输出

本帖最后由 dql2016 于 2023-10-16 22:29 编辑

<p>官方例程en.stm32cubeh7_v1-11-0\STM32Cube_FW_H7_V1.11.0\Projects\NUCLEO-H743ZI\Examples\DAC\DAC_SignalsGeneration提供了参考。STM32H7的DAC输出采样率高达18M,足以满足一般简单应用的需求。</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>打开DAC1的通道1(PA4 ):</p>

<div style="text-align: center;"></div>

<p>DAC 集成了输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。<br />
使能输出缓冲后,DAC 输出的最小电压为 0.2V,最大电压为 VREF&plusmn;0.2,而未使能输出缓冲则输出可达到0V,因此本次配置将输出缓存关闭。</p>

<p>选择DAC的触发方式为定时器触发,选择定时器6来触发DAC,这样通过设置定时器的频率就可以方便的控制DAC输出的正弦波频率。</p>

<p>DMA的配置如下:</p>

<div style="text-align: center;"></div>

<p>时钟配置如下,定时器在APB1总线上,时钟频率为200MHz:</p>

<div style="text-align: center;"></div>

<p>触发事件选择为更新事件,计数周期为(19+1),因此触发频率为200M/20=10000kHz:</p>

<div style="text-align: center;"></div>

<p>定时器的配置和波形点数共同决定了DAC输出的正弦波的频率,<strong><span style="color:#e74c3c;">正弦波的频率=主频 /(TIM_Prescaler+1)/(TIM_Period+1)/ 波形点数</span></strong></p>

<p>配置好后生成代码,先定义1个全局数组存储正弦波形数据,通过公式计算幅度数据,点数为128:</p>

<pre>
<code class="language-cpp">uint16_t SineData;
void GenSineWaveData()
{
    uint16_t i;
    for( i=0;i&lt;128;i++)
    {
      SineData=(uint16_t)((2047*sin(i*2*3.14159/128))+2048);
    }
}</code></pre>

<p>正弦波频率为f=200M/(0+1)/(19+1)/128=78.125kHz,在主函数中启用定时器和DAC即可:</p>

<pre>
<code class="language-cpp">GenSineWaveData();
HAL_TIM_Base_Start(&amp;htim6);
HAL_DAC_Start_DMA(&amp;hdac1,DAC_CHANNEL_1,(uint32_t *)SineData,128,DAC_ALIGN_12B_R);</code></pre>

<p><strong>PA4管脚产生的正弦波效果:</strong></p>

<div style="text-align: center;"></div>

<div style="text-align: center;"></div>

<div style="text-align: center;">&nbsp;</div>

<p>跟理论计算有一定差距,总体而言波形质量较好。</p>

<p>4b365da4716a02e7d98a008527bd9ba5<br />
&nbsp;</p>

<p>代码:</p>

<div></div>

<div style="text-align: center;">&nbsp;</div>

<p>&nbsp;</p>

wang12011201 发表于 2023-10-17 09:16

<p>这个很详细啊,感谢楼主,这样的贴子多多益善啊,谢谢</p>

dql2016 发表于 2023-10-17 18:32

wang12011201 发表于 2023-10-17 09:16
这个很详细啊,感谢楼主,这样的贴子多多益善啊,谢谢

<p>感谢支持!</p><br/>
页: [1]
查看完整版本: 【NUCLEO-H743ZI】4、DAC产生正弦信号&片上运放输出