细说MCU用单路DAC模块设计和输出锯齿波的实现方法

目录

一、STM32G474RE的DAC模块 

二、配置

1.配置DAC

2.选择时钟源和Debug

3.配置系统时钟

三、代码修改

1.启动DAC

2.给DAC的数据输出寄存器赋值

3.运行并观察输出


一、STM32G474RE的DAC模块 

        有些MCU本身就带有数/模转换器(Digital to Analog Converter,DAC)模块,使DAC模块就可以产生模拟信号。STM32G474RE就有两个可以引出到外部的12位DAC:DAC1和DAC2(STM32G474RE的另外两个DAC模块DAC3、DAC4无法直接从GPIO输|):其中,DAC1有两个输出通道,DAC2有一个。所以,在STM32G474RE的DAC中,总共三路模拟信号可以直接从GPIO引出。STM32G474RE上的三路DAC对应的引脚如下:

DAC1_OUT1——PA4
DAC1_OUT2——PA5
DAC2_OUT1——PA6

        另外,这三路DAC均有输出缓冲。所谓缓冲,是指信号经过运算放大器(运放)电路送。在STM32G474RE中,该运放集成在MCU内部。在进行参数配置时,可以选择是否使该缓冲电路。        

        DAC模块从MCU引脚上最终输出的电压(VDAC),与输入到它的数据输出寄存器中的数值有关。由于STM32G474RE中的DAC为12位,也就是说,当数据寄存器中的值为4095时,DAC会输出最大电压值,但这个最大值具体是几伏,还与MCU的参考电压(VREF)有关。具体公式如下:

 

        式中,DOR是DAC数据输出寄存器(data output register)中的数值。理想情况下,DAC的输出电压在0~VRF之间。不过,如果开启了DAC的缓冲(Buffer),输出的电压最小值不会为0,最大值也不会是VREF,而是会在0.2 V~VREF-0.2 V之间。VREF是参考电压,它在MCU上专门有一个外部引脚;在NUCLEO-G474RE板上,该引脚连到了电源电压上,理论值是3.3 V。所以,当给DAC的数据寄存器写入4095时,DAC的输出电压会接近3.3 V。

二、配置

1.配置DAC

        选择DAC1,OUT1模式(OUT1 mode)选择Connected to external pin only,也就是DAC1的输出通道1连接到外部引脚,该引脚为PA4;其他参数,均可暂时持默认值。

2.选择时钟源和Debug

        将高速时钟(HSE)设置为Crystal/eramic Resonator,使用片外时钟晶体作为HSE的时钟源。最后,在SYS中将Debug设置Serial Wire。

        NVIC中把tick timer的抢占式优先级设为0。

3.配置系统时钟

        系统时钟(SYSCLK)频率配置为170 MHz。

三、代码修改

        在main函数的初始化阶段,除了使用代码自动生成的函数MX_DAC1_Init()对DAC模块的基本参数进行初始化之外,还需要添加启动DAC的语句

1.启动DAC

        专门有一个库函数HAL_DAC_Start()实现启动DAC模块的功能,可将它放到main函数中的while(1)之前、MX_DAC1_Init()函数之后的注释对中:

  /* USER CODE BEGIN 2 */
  HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);
  /* USER CODE END 2 */

2.给DAC的数据输出寄存器赋值

        DAC启动之后,可以在while(1)中给其数据寄存器赋值,这样就可以通过它输出所需要的模拟电压信号。

        给DAC的数据寄存器赋值,可以使用库函数HAL_DAC_SetValue()。在while(1)中添加如下代码:

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  DACIndex++;
	  if(DACIndex  == 4096)
	      DACIndex =0;
	  HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,DACIndex);
	  HAL_Delay(10);
  }
  /* USER CODE END 3 */

        HAL_DAC_SetValue()函数有4个参数:第一个是DAC句柄;第二个是DAC的通道;第三个是数据对齐方式(选用12位右对齐);第四个参数是具体赋给数据寄存器的数值这里用了一个变量DACIndex,该变量逐步增加到4096后,再从0开始。当然,需要在main函数中声明该变量。将其声明为全局变量,放到main函数前面的注释对中:

/* USER CODE BEGIN PV */
uint16_t DACIndex = 0;
/* USER CODE END PV */

3.运行并观察输出

        运行、下载。通过示波器观察PA4管脚的输出。对应开发板CN7的32引脚或CN8的第3引脚。

相关推荐

  1. 细说MCU定时器中断实现方法

    2024-07-21 04:12:01       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 04:12:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 04:12:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 04:12:01       45 阅读
  4. Python语言-面向对象

    2024-07-21 04:12:01       55 阅读

热门阅读

  1. 算法学习1——排序算法(1)

    2024-07-21 04:12:01       20 阅读
  2. 7.20工作笔记7 写定时器+Post方式的问题

    2024-07-21 04:12:01       20 阅读
  3. 2024.7.20刷题记录

    2024-07-21 04:12:01       20 阅读
  4. 力扣题解(零钱兑换II)

    2024-07-21 04:12:01       17 阅读
  5. Python学习-九大数据类型整合,详细讲解

    2024-07-21 04:12:01       17 阅读
  6. web前端 Vue 框架面试120题(三)

    2024-07-21 04:12:01       18 阅读
  7. 【C++】位运算与相关算法问题

    2024-07-21 04:12:01       21 阅读
  8. Vue Router的路由正则表达式

    2024-07-21 04:12:01       16 阅读