一、前言
这一节先介绍数字/模拟转换器(DAC),下一节再讲解模数转换器(ADC)。DAC可以将12位的数字量转换为对应引脚的模拟电压输出,数据据可以采用8位或12 位模式,左对齐或右对齐模式,其用途也非常多,比如:用DAC电压输出校验ADC采样是否准确、生成自定义波形(正弦波、三角波、方波等),此小节就以生成正弦波为例。
二、数模转换器介绍(DAC)
(1)DAC的主要特征如下:
注意:GD32E502C输入参考电压(V_REF+)可以选择3.3V或5.0V,相同的数字量(0~4095)输出电压就不同。
(2) DAC结构图如下:
可以简单理解为有或无外部触发使能的情况下,配置DAC与DMA功能输出对应的电压。当后面小节介绍了DMA功能后,再加入TIMER定时器和DMA功能输出正弦波(DAC)。
(3)DAC_OUT引脚的模拟输出电压取决如下公式:
DAC_OUT = V_REF+ * OUT_DO / 4096
OUT_DO是数据输出寄存器,数字输入被线性地转换成模拟输出电压,输输出电压范围为0到V_REF。
(4)DAC_OUT输出引脚为PA7
三、配置代码步骤
配置步骤如下:
1、定义输出sin函数(数字量),相应的值保存到数组里面
2、配置DAC(引脚、时钟、使能等)
3、利用dac_data_set()函数将数组的数据输出
代码展示:
#include "gd32e502.h"
#define SIZE_NUMBER 100 //x轴
#define PI 3.1415
uint16_t sin_site[SIZE_NUMBER]; //y轴
//输出电压0-5V 对应数字量0-4095 sin函数:y=0.5*(sin(2pix)+1)
void sin_wave(uint16_t count)
{
uint16_t i;
for(i = 0;i < SIZE_NUMBER; i++)
{
sin_site[i] = (count>>1)* (sin(2 * PI * i / SIZE_NUMBER)+1);
}
}
void dac_config(void)
{
//打开DAC时钟
rcu_periph_clock_enable(RCU_DAC);
//打开GPIOE时钟
rcu_periph_clock_enable(RCU_GPIOA);
//初始化DAC引脚口 PA7
gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_7);
dac_deinit(); //DAC外设复位
dac_enable(); //DAC使能
}
int main(void)
{
systick_config(); //使用延时函数
sin_wave(4095);
dac_config();
while(1)
{
uint16_t i;
for(i = 0;i < SIZE_NUMBER; i++)
{
//DAC输出数据设置
dac_data_set(DAC_ALIGN_12B_R,sin_site[i]);
delay_1ms(1);
}
}
}
四、效果展示
正弦波输出正常,且输出电压范围0~5V。
预告:下一小节来实现ADC采样功能