STM32入门指南(6)—DAC的使用

STM32入门指南(6)—DAC的使用

前言

本文以STM32F103ZET6为例,介绍STM32的DAC的如何在STM32CubeMX中配置,以及一些代码上的说明。主要是针对用DAC输出一些特定信号(以各种频率的正弦信号为例)。

硬件:

一块STM32F103ZET6开发板

软件:

  1. MDK 532
  2. STM32CubeMX 6.0.1

该芯片的数据手册可以从ST的官网下载到:

https://www.stmicroelectronics.com.cn/…


DAC主要特征

Digital-to-Analog Converter的缩写,将表示一定比例电压值的数字信号转换为模拟信号。STM32的DAC模块是12位数字输入,电压输出型的DAC。

这里借鉴一下CSDN上的博客:

https://blog.csdn.net/qq_38410730/article/details/80095881

  • 2 个 DAC 转换器:每个转换器对应 1 个输出通道
  • 8 位或者 12 位单调输出
  • 12 位模式下数据左对齐或者右对齐
  • 同步更新功能
  • 噪声波形生成
  • 三角波形生成
  • 双 DAC 通道同时或者分别转换
  • 每个通道都有 DMA 功能
  • 外部触发转换

DAC通道映射

STM32F103带1个ADC控制器,一共支持2个通道,其IO固定。、

DAC有自己的中断向量,可以配置DMA。

通道GPIO
DAC_OUT1PA4
DAC_OUT2PA5

DAC数据对齐

假设通道1的数据为 d ,通道2数据为 e 。

DAC有三种数据对齐方式: (一般采用 12 bit 右对齐)


单通道下:

  • 8 bit 右对齐

    b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0
    d7d6d5d4d3d2d1d0
  • 12 bit 左对齐

    b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0
    d11d10d9d8d7d6d5d4d3d2d1d0
  • 12 bit 右对齐

    b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0
    d11d10d9d8d7d6d5d4d3d2d1d0

双通道下:

  • 8 bit 右对齐

    b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0
    e7e6e5e4e3e2e1e0d7d6d5d4d3d2d1d0
  • 12 bit 左对齐

    b31b30b29b28b27b26b25b24b23b22b21b20b19b18b17b16
    e11e10e9e8e7e6e5e4e3e2e1e0
    b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0
    d11d10d9d8d7d6d5d4d3d2d1d0
  • 12 bit 右对齐

    b31b30b29b28b27b26b25b24b23b22b21b20b19b18b17b16
    e11e10e9e8e7e6e5e4e3e2e1e0
    b15b14b13b12b11b10b9b8b7b6b5b4b3b2b1b0
    d11d10d9d8d7d6d5d4d3d2d1d0

DAC转换模式

对于每一个通道,DAC在被触发后执行一次转换,可以设置为软件触发或者定时器触发。如果设置了中断,转换完成会产生中断。

DAC输出缓存

DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个DAC通道输出缓存可以单独配置。

但是,如果STM32的DAC输出缓存使能的话,虽然输出能力强一点,输出没有办法减到0。

DAC转换时间

DAC最高转化速度为1MHz(指的是DAC的值增加1bit的情况下,LSB)。但是受到DAC压摆率的影响,波形会失真,勿应用于超过200KHz的场合。

DAC配置及代码解析

1. DAC直接输出信号

  1. 在CubeMX配置如下:
    1. 选择通道

    2. 输出缓冲使能(也可不使能)

1

  1. 在MDK中,main函数添加代码:
int main(void)
{
    while (1)
    {
        uint32_t val;
		HAL_DAC_Start(&hdac,DAC_CHANNEL_1);								//使能DAC通道1
		for(val = 0x0000; val < 0x1000; val += 0x80)					//DAC输出信号范围
		{
			
			HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,val);	//设置通道输出的值
			HAL_Delay(10);
		}
		HAL_DAC_Stop(&hdac,DAC_CHANNEL_1);								//停止DAC通道1
    }
}

​ 输出效果如下图:

2

2. DAC + DMA + TIMER

  1. CubeMX配置

    1. 选择通道

    2. 输出缓冲使能(也可不使能)

    3. 设置触发

    3

    1. 配置DMA

      注意这里DMA的方式为循环搬移模式,适合输出周期信号

    4

    1. 配置定时器

      方式同ADC的定时器触发,不在赘述。
      在这里插入图片描述
      或者:

      在这里插入图片描述


  1. 在MDK中,main函数添加代码:
const uint16_t dac_data_len = 1024;					//周期信号长度
uint16_t dac_data[dac_data_len];					//周期信号

int main(void)
{
    uint32_t i;
    for(i = 0; i < dac_data_len; i ++)				//生成周期信号
    {
        dac_data[i] = i*4;
    }
    HAL_TIM_Base_Start(&htim6);						//启动定时器
    HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,\			//以DMA方式启动DAC
    	(uint32_t *)dac_data,dac_data_len,DAC_ALIGN_12B_R);
    HAL_Delay(10000);								//10s延时
    HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);			//停止DAC和DMA
    HAL_TIM_Base_Stop(&htim6);						//停止定时器
}

​ 输出效果如下图:

5

  • 14
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F103ZET6是一款由意法半导体(STMicroelectronics)生产的单片机芯片,它属于STM32F1系列的一员。这个芯片集成了一套数字模拟转换器(DAC),因此被称为STM32F103ZET6DACDAC是一种将数字信号转换为模拟信号的电子设备。在微控制器中,DAC通常用于将数字信号输出到外部设备或模拟电路中。例如,它可以用于控制音频播放器的音量,或者将数字信号转换为模拟电压来驱动电机。 STM32F103ZET6是一款64引脚的单片机芯片,它采用ARM Cortex-M3内核,拥有72MHz的工作频率和512KB的闪存存储器。它还内置了12位的DAC模块,具有2个独立的输出通道。 使用STM32F103ZET6DAC,我们可以通过软件编程来配置和控制DAC模块。我们可以设置DAC通道的工作模式,选择参考电压源,并将要输出的数字值写入DAC数据寄存器。然后,DAC模块将自动将数字值转换为相应的模拟电压输出。 对于开发人员来说,通过使用STM32F103ZET6DAC,我们可以实现一些有趣的应用,例如音频处理、波形发生器、电压控制等。此外,STM32F1系列芯片还提供了丰富的开发工具和软件库,使得开发者能够更轻松地进行软件开发和代码移植。 总而言之,STM32F103ZET6DAC是一款功能强大的单片机芯片,它集成了DAC模块,可以实现数字信号到模拟信号的转换。它是开发数字与模拟转换应用的理想选择,并为开发者提供了丰富的开发工具和软件库的支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值