目录
1.DAC简介
STM32 的 DAC
模块
(
数字
/
模拟转换模块
)
是
12
位数字输入,电压输出型的
DAC
。
DAC
可以配置为
8
位或
12
位模式,也可以与
DMA
控制器配合使用。
DAC
工作在
12
位模式时,
数据可以设置成左对齐或右对齐。
DAC
模块有
2
个输出通道,每个通道都有单独的转换器。
在双
DAC
模式下,
2
个通道可以独立地进行转换,也可以同时进行转换并同步地更新
2
个
通道的输出。
DAC 模块主要特点有:
①
2
个
DAC
转换器:每个转换器对应
1
个输出通道
②
8
位或者
12
位单调输出
③
12
位模式下数据左对齐或者右对齐
④ 同步更新功能
⑤ 噪声波形生成
⑥ 三角波形生成
⑦ 双
DAC
通道同时或者分别转换
⑧ 每个通道都有
DMA
功能
DAC 输出是受
DORx
寄存器直接控制的,但是我们不能直接往 DORx 寄存器写入数据,而是通过
DHRx
间接的传给
DORx
寄存器,实现对
DAC
输出的控制。前面我们提到,STM32
DAC
支持
8/12
位模式,
8
位模式的时候是固定的右对齐的,而 12
位模式又可以设置左对齐
/
右对齐。单
DAC
通道
x
,总共有
3
种情况:
①
8
位数据右对齐:用户将数据写入
DAC_DHR8Rx[7:0]
位(实际是存入
DHRx[11:4]
位)。
②
12
位数据左对齐:用户将数据写入
DAC_DHR12Lx[15:4]
位(实际是存入
DHRx[11:0]
位)。
③
12
位数据右对齐:用户将数据写入
DAC_DHR12Rx[11:0]
位(实际是存入
DHRx[11:0]
位)。
如果没有选中硬件触发
(
寄存器
DAC_CR1
的
TENx
位置’
0
’),存入寄存器
DAC_DHRx 的数据会在一个 APB1
时钟周期后自动传至寄存器
DAC_DORx
。如果选中硬件触发
(
寄存器 DAC_CR1 的
TENx
位置’
1
’
)
,数据传输在触发发生以后
3
个
APB1
时钟周期后完成。 一 旦数据从 DAC_DHRx
寄存器装入
DAC_DORx
寄存器,在经过时间 t之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。 t的典型值为 3us
,最大是
4us
。所以
DAC
的转换速度最快是 250K
左右。
首先,我们来看
DAC
通道
1
使能位
(EN1)
,该位用来控制
DAC
通道
1
使能的,本章我们就是用的 DAC
通道
1
,所以该位设置为
1
。
再看关闭 DAC
通道
1
输出缓存控制位(
BOFF1
),这里
STM32
的
DAC
输出缓存做的
有些不好,如果使能的话,虽然输出能力强一点,但是输出没法到
0
,所以本章我们不使用输出缓存。即设置该位为 1
。
DAC
通道
1
触发使能位(
TEN1
),该位用来控制是否使用触发,里我们不使用触发,
所以设置该位为
0
。
DAC
通道
1
触发选择位(
TSEL1[2:0]
),这里我们没用到外部触发,所以设置这几个位
为
0
就行了。
DAC
通道
1
噪声
/
三角波生成使能位(
WAVE1[1:0]
),这里我们同样没用到波形发生器,
故也设置为
0
即可。
DAC
通道
1
屏蔽
/
复制选择器(
MAMP[3:0]
),这些位仅在使用了波形发生器的时候有
用,本章没有用到波形发生器,故设置为 0 就可以了。
2.配置步骤
1
)开启
PA
口时钟,设置
PA4
为模拟输入。
2
)使能
DAC1
时钟。
3
)初始化
DAC,
设置
DAC
的工作模式。
4
)使能
DAC
转换通道
5
)设置
DAC
的输出值
void Dac1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitType;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //①使能 PA 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //②使能 DAC 时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //①初始化 GPIOA
GPIO_SetBits(GPIOA,GPIO_Pin_4) ; //PA.4 输出高
DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1 输出缓存关
DAC_Init(DAC_Channel_1,&DAC_InitType); //③初始化 DAC 通道 1
DAC_Cmd(DAC_Channel_1, ENABLE); //④使能 DAC1
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //⑤12 位右对齐,设置 DAC 初始值
}