STM32入门指南(6)—DAC的使用
前言
本文以STM32F103ZET6为例,介绍STM32的DAC的如何在STM32CubeMX中配置,以及一些代码上的说明。主要是针对用DAC输出一些特定信号(以各种频率的正弦信号为例)。
硬件:
一块STM32F103ZET6开发板
软件:
- MDK 532
- 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_OUT1 | PA4 |
DAC_OUT2 | PA5 |
DAC数据对齐
假设通道1的数据为 d ,通道2数据为 e 。
DAC有三种数据对齐方式: (一般采用 12 bit 右对齐)
单通道下:
-
8 bit 右对齐
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 d7 d6 d5 d4 d3 d2 d1 d0 -
12 bit 左对齐
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 -
12 bit 右对齐
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0
双通道下:
-
8 bit 右对齐
b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 e7 e6 e5 e4 e3 e2 e1 e0 d7 d6 d5 d4 d3 d2 d1 d0 -
12 bit 左对齐
b31 b30 b29 b28 b27 b26 b25 b24 b23 b22 b21 b20 b19 b18 b17 b16 e11 e10 e9 e8 e7 e6 e5 e4 e3 e2 e1 e0 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0 -
12 bit 右对齐
b31 b30 b29 b28 b27 b26 b25 b24 b23 b22 b21 b20 b19 b18 b17 b16 e11 e10 e9 e8 e7 e6 e5 e4 e3 e2 e1 e0 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0
DAC转换模式
对于每一个通道,DAC在被触发后执行一次转换,可以设置为软件触发或者定时器触发。如果设置了中断,转换完成会产生中断。
DAC输出缓存
DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个DAC通道输出缓存可以单独配置。
但是,如果STM32的DAC输出缓存使能的话,虽然输出能力强一点,输出没有办法减到0。
DAC转换时间
DAC最高转化速度为1MHz(指的是DAC的值增加1bit的情况下,LSB)。但是受到DAC压摆率的影响,波形会失真,勿应用于超过200KHz的场合。
DAC配置及代码解析
1. DAC直接输出信号
- 在CubeMX配置如下:
-
选择通道
-
输出缓冲使能(也可不使能)
-
- 在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. DAC + DMA + TIMER
-
CubeMX配置
-
选择通道
-
输出缓冲使能(也可不使能)
-
设置触发
-
配置DMA
注意这里DMA的方式为循环搬移模式,适合输出周期信号
-
配置定时器
方式同ADC的定时器触发,不在赘述。
或者:
-
- 在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); //停止定时器
}
输出效果如下图:文章来源:https://www.toymoban.com/news/detail-622856.html
文章来源地址https://www.toymoban.com/news/detail-622856.html
到了这里,关于STM32入门指南(6)—DAC的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!