简介
DAC,全称:Digital-to-Analog Converter,指数字/模拟转换器
特性参数
- 分辨率
- 表示模拟电压的最小增量,常用二进制位数表示,比如:8、12位等
- 建立时间
- 表示将一个数字量转换为稳定模拟信号所需的时间
- 精度
- 转换器实际特性曲线与理想特性曲线之间的最大偏差
- 误差源:比例系统误差、失调误差、非线性误差
框图简介
数据格式
- 8位模式
- 只能右对齐 DHR8Rx、 DHR8RD(双DAC通道转换用)
- 12位模式
- 右对齐 DHR12Rx、 DHR12RD(双DAC通道转换用)
- 左对齐 DHR12Lx、 DHR12LD(双DAC通道转换用)
触发源
三种触发转换的方式:自动触发、软件触发、外部事件触发
- 禁止触发(即自动)
- TENx位置0
- 经过1个APB1时钟周期,DHRx >> DORx
- 使能触发
- TENx位置1
- TSELx[2:0]≠111 外部事件触发
- 经过3个APB1时钟周期,DHR >> DORx
- TSELx[2:0] =111 软件触发(SWTRIGx位
- 经过1个APB1时钟周期,DHR >> DORx
DMA请求
DMAENx位置1 --> 外部事件触发(不是软件触发) --> 产生DMA请求 --> DHRx --> DORx
输出电压
- 12位模式下,DAC输出电压计算方法:
- DAC输出电压 = (DORx/4096)∗VREF+
- 8位模式下,DAC输出电压计算方法:
- DAC输出电压 = (DORx/256)∗VREF+
寄存器介绍
DAC控制寄存器(DAC_CR)
DAC控制寄存器(DAC_CR)
对齐数据保持寄存器
DAC通道1的12位右对齐数据保持寄存器(DAC_DHR12R1)
单通道DMA
相关函数介绍
函数 | 主要寄存器 | 主要功能 |
HAL_DAC_Init() | 无 | 配置DAC工作状态(HAL库内部使用) |
HAL_DAC_MspInit() | 无 | 存放NVIC、CLOCK、GPIO初始化代码 |
HAL_DAC_ConfigChannel() | CR | 配置DAC相应通道的相关参数 |
HAL_DAC_Start() | CR、SWTRIGR | 启动D/A转换 |
HAL_DAC_SetValue() | DHR12Rx | 设置输出数字量 |
HAL_DAC_GetValue() | DORx | 读取通道输出数字量 |
1.初始化函数
DAC_HandleTypeDef g_dac_handle;
/* DAC初始化函数 */
void dac_init(void)
{
DAC_ChannelConfTypeDef dac_ch_conf;
g_dac_handle.Instance = DAC;
HAL_DAC_Init(&g_dac_handle); /* 初始化DAC */
dac_ch_conf.DAC_Trigger = DAC_TRIGGER_NONE; /* 不使用触发功能 */
dac_ch_conf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE; /* DAC输出缓冲关闭,开启缓冲无法输出0V*/
HAL_DAC_ConfigChannel(&g_dac_handle, &dac_ch_conf, DAC_CHANNEL_2); /* 配置DAC通道1 */
HAL_DAC_Start(&g_dac_handle, DAC_CHANNEL_2); /* 开启DAC通道1 */
}
2.MSP初始化函数
/* DAC MSP初始化函数 */
void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
{
if (hdac->Instance == DAC)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_DAC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
gpio_init_struct.Pin = GPIO_PIN_5;
gpio_init_struct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &gpio_init_struct);
}
}
3.设置输出电压
/* 设置通道输出电压 */
/*
12位模式下,DAC输出电压计算方法: DAC输出电压 = (DORx/4096)VREF+
*/
void dac_set_voltage(uint16_t vol)
{
double temp = vol;
temp /= 1000;
temp = temp * 4096 / 3.3;
if (temp >= 4096)temp = 4095; /* 如果值大于等于4096, 则取4095 */
HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_2, DAC_ALIGN_12B_R, temp); /* 12位右对齐数据格式设置DAC值 */
}
main函数
dac_init();
while ( 1 )
{
dac_set_voltage(2000);
}
Comments NOTHING