细说MCU的DAC1和DAC2各自输出一通道模拟信号的方法

44 篇文章 0 订阅
42 篇文章 0 订阅

目录

一、参考硬件

二、 建立新工程

1.配置DAC1  

2.配置DAC1的DMA

3.配置DAC2

4.配置DAC2的DMA

5.配置定时器       

6.配置时钟和Debug

三、修改代码

四、 查看结果


一、参考硬件

        本项目依赖的软件和硬件工程参考本文作者写的文章:   细说MCU的DAC1实现两个通道同时输出的方法-CSDN博客  https://wenchm.blog.csdn.net/article/details/140775537 icon-default.png?t=N7T8https://wenchm.blog.csdn.net/article/details/140775537         参考文件中中使用了DAC1的两个通道CH1和CH2。本文修改硬件配置,分别使用 DAC1的通道1和DAC2的通道1(DAC2只有一个通道)输出参考文件中的两个波形。

二、 建立新工程

1.配置DAC1  

        在DAC1的模式(Mode)区,将通道的模式(OUT1 mode)选择为连接到外部引脚(Connected to external pin only)。

        在DAC1通道的设置区,先将它们的输出缓冲(Output Buffer)禁止 (也可以保持使能),随后分别将它们的Trigger参数选择为Timer3 Trigger Out event。

2.配置DAC1的DMA

        增加一个DAC1_CH1 请求。DMA请求模式选择Circular,让它循环工作;将外设 (Peripheral)选择为按字(Word)的方式,存储器(Memory)的数据宽度选择为按半字(Half Word)的方式。其余参数保持默认值。

        由于要使用两路DAC输出 具有一定相位差的信号,所以两路DAC要做同步参数配置。具体配置方式是在DMA请求同 步设置(DMA Request Synchronization Settings)栏,勾选上使能参数(Enable Synchronization)和使能事件(Enable event)。 

3.配置DAC2

        在DAC2的模式(Mode)区,将通道的模式(OUT1 mode)选择为连接到外部引脚(Connected to external pin only)。

        在DAC1通道的设置区,先将它们的输出缓冲(Output Buffer)禁止 (也可以保持使能),随后分别将它们的Trigger参数选择为Timer3 Trigger Out event。

4.配置DAC2的DMA

        增加一个DAC2_CH1 请求。DMA请求模式选择Circular,让它循环工作;将外设 (Peripheral)选择为按字(Word)的方式,存储器(Memory)的数据宽度选择为按半字(Half Word)的方式。其余参数保持默认值。

        在同步参数配置界面中,也勾选上使能参数(Enable Synchronization) 和使能事件(Enable event),然后将同步信号(Synchronization signal)选择为DMAMUX1 channel0(DMA1 Channell ) event。由于DAC1用的是DMA1 Channel1,依此方式,就可以实现两个DAC之间的同步(也可以在DAC1中配置同步信号)。

5.配置定时器       

        选择TIM3,时钟源(Clock Source)选择为内部时钟(Internal Clock)。将预分频因子设置为0,计数器周期设为169,并将触发事件(Trigger Event Selection TRGO)选择为Update Event,其余参数保持默认值。

6.配置时钟和Debug

        将高速时钟(HSE)设置为 Crystal/Ceramic Resonator,使用片外时钟晶体作为HSE的时钟源。最后,在SYS中将 Debug设置为Serial Wire。由于没有使用中断,所以不用配置NVIC。

三、修改代码

        在初始化代码中加入启动定时器、启动DAC的代码。由于本例中用了两个DAC,所以要分别对它们进行初始化:

/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim3);
  HAL_DAC_Start_DMA(&hdac1,DAC_CHANNEL_1,(uint32_t*)
		  SineWaveDataPh90,DAC_BUFFER_SIZE,DAC_ALIGN_12B_R);
  HAL_DAC_Start_DMA(&hdac2,DAC_CHANNEL_1,(uint32_t*)
		  SineWaveDataPh0,DAC_BUFFER_SIZE,DAC_ALIGN_12B_R);
/* USER CODE END 2 */

         用MATLAB语句生成波形数据,存储在数组中,其中初始相位为90°的波形,幅值为A/2,一个周期内的数据点数依然设为50:

/* USER CODE BEGIN PV */
uint16_t SineWaveDataPh90[DAC_BUFFER_SIZE] = {3071,3063,3039,2999,2944,2876,2794,2700,2596,
		2483,2364,2239,2112,1983,1856,1731,1612,1499,1395,1301,1219,1151,1096,1056,1032,1024,1032,
		1056,1096,1151,1219,1301,1395,1499,1612,1731,1856,1983,2112,2239,2364,2483,2596,2700,2794,
		2876,2944,2999,3039,3063
 };
uint16_t SineWaveDataPh0[DAC_BUFFER_SIZE] = {2047,2304,2557,2801,3034,3251,3449,3625,3776,
		3900,3994,4058,4090,4090,4058,3994,3900,3776,3625,3449,3251,3034,2801,2557,2304,2048,1791,
		1538,1294,1061,844,646,470,319,195,101,37,5,5,37,101,195,319,470,646,844,1061,1294,1538,1791 };
/* USER CODE END PV */

        在main.h文件中修改数组长度为50: 

/* USER CODE BEGIN Private defines */
#define DAC_BUFFER_SIZE (uint16_t) 50
/* USER CODE END Private defines */

四、 查看结果

        分别用示波器查看PA4(DAC1通道1的输出)和PA6(DAC2的输出,在NUCLEO G474RE板上通过CN10的第13引脚或CN5的第5引脚引出)引脚上的波形。

        示波器的通道1对应的是PA4,通道2对应的是PA6;两路波形的相位差 90°;所生成正弦波的频率为20 kHz。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wenchm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值