RISC-V技术论坛
直播中

李晨灵

8年用户 1530经验值
私信 关注
[经验]

RVMCU课堂「23」: 手把手教你玩转RVSTAR— DAC应用篇

上期内容我们介绍了可以将模拟信号转化为数字信号的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可以独立或并发工作。










其主要特性如下:

  • 12位分辨率,数据左对齐或右对齐


  • 每个通道带有DMA功能


  • 同步更新转换


  • 外部事件触发转换


  • 可配置的内部缓冲区


  • 输入参考电压,Vref+


  • 噪声波生成(LSFR噪声模式和三角噪声模式)





  • 双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的亮度随着旋钮的转动而改变。



更多回帖

×
20
完善资料,
赚取积分