系统环境
软件平台
硬件需求
RV-STAR开发板
旋转电位器
LED发光二极管
GD32VF103的DAC(数字/模拟转换器)可以将12位的数字数据转换为外部引脚上的电压输出,数据可以采用8位或12位模式,左对齐或右对齐模式,当使能了外部触发,DMA可被用于更新输入端数字数据。在输出电压时,可以利用DAC输出缓冲区来获得更高的驱动能力。
两个DAC可以独立或并发工作。
其主要特性如下:
12位分辨率,数据左对齐或右对齐
每个通道带有DMA功能
同步更新转换
外部事件触发转换
可配置的内部缓冲区
输入参考电压,Vref+
噪声波生成(LSFR噪声模式和三角噪声模式)
双DAC并发结构
实验部分
这次的实验需要用到旋转电位器和LED发光二极管两种电子器件,两者和RV-STAR的连线方式参考下表。
RV-STAR | 旋转电位器 |
PC0 | OUT |
3V3 | 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的亮度随着旋钮的转动而改变。