上期内容我们介绍了可以将模拟信号转化为数字信号的ADC,其实还有另一种与ADC相对的,能够将数字信号转化为模拟信号输出的外设——DAC(Digital to Analog Converter,数字/模拟转换器)。这期内容我们将通过一个用旋钮控制LED亮度的小实验带领大家了解RV-STAR开发板上的DAC的基础用法。
系统环境
Windows 10-64bit
软件平台
NucleiStudio IDE 202102版或 PlatformIO IDE
硬件需求
RV-STAR开发板
旋转电位器
LED发光二极管
GD32VF103的DAC外设
GD32VF103的DAC(数字/模拟转换器)可以将12位的数字数据转换为外部引脚上的电压输出,数据可以采用8位或12位模式,左对齐或右对齐模式,当使能了外部触发,DMA可被用于更新输入端数字数据。在输出电压时,可以利用DAC输出缓冲区来获得更高的驱动能力。
两个DAC可以
独立或并发工作。
其主要特性如下:
实验部分
这次的实验需要用到旋转电位器和LED发光二极管两种
电子器件,两者和RV-STAR的连线方式
参考下表。
RV-STAR
| 旋转电位器
|
PC0
| OUT
|
3V3
| VCC
|
GND
| GND
|
RV-STAR
| LED
|
PA5
| Vcc
|
GND
| GND
|
我们的实验目的是使用旋钮(旋转电位器)控制LED的亮度,因此需要用到
ADC采集旋钮的读数,这个部分和上期介绍ADC的内容基本相同,本次不进行赘述。在采集了旋钮的读数后,再将其通过DAC输出到与LED正极相连的PA5引脚上(
对应DAC1)。
连线完成后,打开IDE,创建工程,开始编写代码。
在使用DAC时,首先需要使能DAC的外设时钟,然后将DAC对应的引脚初始化为模拟模式,
代码如下:
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_DAC);
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
接下来需要将DAC配置为软件触发模式,并进行相关的使能操作:
dac_deinit();
/* configure the DAC1 */
dac_trigger_source_config(DAC1, DAC_TRIGGER_SOFTWARE);
dac_trigger_enable(DAC1);
/* enable DAC1 */
dac_enable(DAC1);
在主函数中,采用轮询的编程模式,在循环体中,每次先读取ADC的值,设置其为DAC的输出值,并使能一次软件触发:
while (1) {
input_value = adc_regular_data_read(ADC1);
dac_data_set(DAC1, DAC_ALIGN_12B_R, input_value);
dac_software_trigger_enable(DAC1);
delay_1ms(50);
}
完整代码请参考Github上nuclei_board_labs仓库中RVSTAR的DAC例子。
实验源码:https://github.com/Nuclei-Software/nuclei-board-labs/tree/master/rvstar/dac/adc_dac_converter
编写完代码后,进行编译和上传,然后转动旋钮,可以观察到LED的亮度随着旋钮的转动而改变。