DAC模块的简单应用

DAC模块的简单应用

1、简介

  • 数模转换电路(DAC)是电子信息学中将离散数字信号转换为连续模拟信号的电子器件,核心功能通过电阻阵列与开关结构切换生成对应电流或电压。根据输出形式可分为电压输出型与电流输出型,电压型内置放大器适用于高速场景,电流型需外接运算放大器进行转换;乘算型DAC可实现数字输入与模拟信号的乘法运算,常用于信号调制。

2、操作方法

(1) 初始化硬件

  • 使能RCC,配置为外部晶振
    img
  • 将系统时钟改为180MHz,APB1计时器的时钟改为90MHz
    img
  • 按照如下方式配置DAC模块
    img

如果不开启输出缓冲,则需要运算放大器才能输出,但开启输出缓冲后将无法输出0V电压

(2)操控硬件

I输出单一信号

  • 在主循环外侧写入以下内容
    HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);//在DAC 通道1处写入值2048
    HAL_DAC_Start(&hdac, DAC_CHANNEL_1);//启动DAC的通道1
    /* USER CODE END 2 */
  • 这样就能得到一段电压约为1.65V的信号

输出电压计算方式:img
img,n为分辨率
该芯片的DAC分辨率为12,最大输出电压为3.54V,因此输出电压为:
img
效果:
img

II输出三角波信号

  • 将TIM6计时器按照如下方式配置
    img
  • 将DAC按照如下方式更改
    img
  • 在主循环外写入以下内容
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim6);//启用TIM6
  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100);//以最低电压设置三角波
  HAL_DAC_Start(&hdac, DAC_CHANNEL_1);//启用DAC
  /* USER CODE END 2 */

效果
img
img

III输出三角函数

  • 关闭"三角波输出"
    img
  • 使能DMA,按照如下方式配置
    img
  • 在外部声明一个全局数组,用来描述在一个周期内正弦函数的大小
/* USER CODE BEGIN PV */
const uint8_t sine_wave_table[256] = {...
  • 在主循环外部写入以下内容
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim6);//启用TIM6
  HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)sine_wave_table, 256, DAC_ALIGN_8B_R);//启用DAC,提供DMA模块将之前定义的数组搬运过来作为参考电压
  /* USER CODE END 2 */

效果
img
img

3、代码清单

  • 正弦波的参考数组
/* USER CODE BEGIN PV */
const uint8_t sine_wave_table[256] = {
		0x80,0x84,0x87,0x8A,0x8D,0x90,0x93,0x96,
		0x99,0x9D,0xA0,0xA3,0xA6,0xA9,0xAC,0xAF,
		0xB1,0xB4,0xB7,0xBA,0xBD,0xC0,0xC2,0xC5,
		0xC8,0xCA,0xCD,0xCF,0xD2,0xD4,0xD6,0xD9,
		0xDB,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,
		0xEB,0xED,0xEE,0xF0,0xF1,0xF3,0xF4,0xF6,
		0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,
		0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
		0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
		0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,
		0xF7,0xF6,0xF4,0xF3,0xF1,0xF0,0xEE,0xED,
		0xEB,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,
		0xDB,0xD9,0xD6,0xD4,0xD2,0xCF,0xCD,
		0xCA,0xC8,0xC5,0xC2,0xC0,0xBD,0xBA,
		0xB7,0xB4,0xB1,0xAF,0xAC,0xA9,0xA6,
		0xA3,0xA0,0x9D,0x99,0x96,0x93,0x90,
		0x8D,0x8A,0x87,0x84,0x81,0x7D,0x7A,0x77,
		0x74,0x71,0x6E,0x6B,0x68,0x64,0x61,0x5E,
		0x5B,0x58,0x55,0x52,0x50,0x4D,0x4A,0x47,
		0x44,0x41,0x3F,0x3C,0x39,0x37,0x34,0x32,
		0x2F,0x2D,0x2B,0x28,0x26,0x24,0x22,0x20,
		0x1E,0x1C,0x1A,0x18,0x16,0x14,0x13,0x11,
		0x10,0x0E,0x0D,0x0B,0x0A,0x09,0x08,0x07,
		0x06,0x05,0x04,0x04,0x03,0x02,0x02,0x01,
		0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
		0x01,0x01,0x02,0x02,0x03,0x04,0x04,0x05,
		0x06,0x07,0x08,0x09,0x0A,0x0B,0x0D,0x0E,
		0x10,0x11,0x13,0x14,0x16,0x18,0x1A,0x1C,
		0x1E,0x20,0x22,0x24,0x26,0x28,0x2B,0x2D,
		0x2F,0x32,0x34,0x37,0x39,0x3C,0x3F,0x41,
		0x44,0x47,0x4A,0x4D,0x50,0x52,0x55,0x58,
		0x5B,0x5E,0x61,0x64,0x68,0x6B,0x6E,0x71,
		0x74,0x77,0x7A,0x7D
};
/* USER CODE END PV */
  • 其他基本函数
/**
  * @brief  启用TIM基本功能的函数
  * @param  htim TIM 句柄
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);
/**
  * @brief  使能DAC的指定通道
  * @param  hdac DAC的句柄
  * @param  Channel 指定的通道
  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
  * @param  pData 数据的地址
  * @param  Length 要从内存搬运到外设的数据大小
  * @param  Alignment 读取指定数据的对其方向
  *          该设定可遵循以下几个值:
  *            @arg DAC_ALIGN_8B_R: 8bit 数据向右对齐读取
  *            @arg DAC_ALIGN_12B_L: 12bit 数据向左对齐读取
  *            @arg DAC_ALIGN_12B_R: 12bit 数据向右对齐读取
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, const uint32_t *pData, uint32_t Length,uint32_t Alignment);
/**
  * @brief  为DAC的指定通道写入一个值
  * @param  hdac DAC的句柄
  * @param  Channel 指定的通道
  *          可以选择以下几个值:
  *            @arg DAC_CHANNEL_1: 选择DAC通道1
  *            @arg DAC_CHANNEL_2: 选择DAC通道2
  * @param  pData 数据的地址
  * @param  Length 要从内存搬运到外设的数据大小
  * @param  Alignment 读取指定数据的对其方向
  *          该设定可遵循以下几个值:
  *            @arg DAC_ALIGN_8B_R: 8bit 数据向右对齐读取
  *            @arg DAC_ALIGN_12B_L: 12bit 数据向左对齐读取
  *            @arg DAC_ALIGN_12B_R: 12bit 数据向右对齐读取
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
/**
  * @brief  使能指定的DAC通道
  * @param  hdac DAC的句柄
  * @param  Channel 选择的DAC通道
  *          可以选择以下几个值:
  *            @arg DAC_CHANNEL_1: 选择DAC通道1
  *            @arg DAC_CHANNEL_2: 选择DAC通道2
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel);
posted @ 2025-09-03 17:10  奶龙大王  阅读(49)  评论(0)    收藏  举报