STM32F1-DAC

发布于 2023-05-14  584 次阅读


简介

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);
	}	
  • alipay_img
  • wechat_img
想法不去做终究就只是想法
最后更新于 2023-05-14