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的信号
输出电压计算方式:
,n为分辨率
该芯片的DAC分辨率为12,最大输出电压为3.54V,因此输出电压为:
效果:
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 */
效果
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 */
效果
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);





,n为分辨率









浙公网安备 33010602011771号