GD32F303红枫派开发板DAC输出电压实验教程,快速上手,吸引你的眼球!

2024-06-13
GD32F303红枫派开发板DAC输出电压实验教程,快速上手,吸引你的眼球! (https://ic.work/) 技术资料 第1张


14.1


实验内容

通过本实验主要学习以下内容:

  • DAC工作原理
  • 使用DAC输出电压


14.2


实验原理


14.2.1

DAC工作原理

我们上几章学习了ADC,本章我们来学习DAC。ADC是模-数转换,即模拟量转换为数字量,DAC正好相反,即数-模转换,是将MCU的数字量转换为模拟量——电压。

GD32F303有两个DAC,对应的IO口分别为PA4(DAC0)和PA5(DAC1),这两个DAC可以独立或并发工作。DAC可以将12位的数字数据转换为外部引脚上的电压输出。数据可以采用8位或12位,左对齐或右对齐模式。

如设置12位模式,IO口上输出的电压值和设置的数字值对应的计算公式为:

GD32F303红枫派开发板DAC输出电压实验教程,快速上手,吸引你的眼球! (https://ic.work/) 技术资料 第2张

其中VREF为参考电压,DAC_DO为设置的数字值。

DAC 的主要特征如下:

◼ 8位或12位分辨率,数据右对齐或左对齐;

◼支持DMA功能;

◼同步更新转换;

◼外部事件触发转换;

◼可配置的内部缓冲区;

◼外部参考电压,VREF+;

◼噪声波形(LSFR噪声模式和三角噪声模式);

◼双DAC并发模式

以下为GD32F303 DAC的框图:

GD32F303红枫派开发板DAC输出电压实验教程,快速上手,吸引你的眼球! (https://ic.work/) 技术资料 第3张

这里着重讲下DAC的触发源,DAC触发源通过DAC_CTL寄存器中DTSELx位来进行选择。DAC的触发源见下表:

GD32F303红枫派开发板DAC输出电压实验教程,快速上手,吸引你的眼球! (https://ic.work/) 技术资料 第4张

DAC有两个类型的数据寄存器——DAC保持数据寄存器(DACx_DH)和DAC数据输出寄存器(DACx_DO),用户将数字量写入到DACx_DH中,只有当DACx_DH中的数据被转移到DACx_DO时,IO口才会实际输出对应电压值。

当使能了外部触发模式(通过设置 DAC_CTL 寄存器的DTENx位控制),当已经选择的触发事件发生,DAC保持数据(DACx_DH)会被转移到DAC数据输出寄存器(DACx_DO)。如果没有使能外部触发模式,当数据写到DACx_DH后就会立即转移到DACx_DO中,此时相应IO口即输出对应电压。


14.2.2

DAC 输出缓冲

为了降低输出阻抗并驱动外部负载,每个DAC 模块内部各集成了一个输出缓冲区。

缺省情况下, 输出缓冲区是开启的,可以通过设置 DAC_CTL 寄存器的DBOFFx位来开启或关闭缓冲区。打开缓冲区可以增强DAC对外驱动能力。


14.2.3

DAC DMA 功能

在外部触发使能的情况下,通过设置 DAC_CTL 寄存器的DDMAENx位来使能DMA请求。 当有外部硬件触发的时候(不是软件触发),则产生一个DMA请求。


14.3


硬件设计

本实验功能是将设定的数字值转换为电压,硬件设计如下:

GD32F303红枫派开发板DAC输出电压实验教程,快速上手,吸引你的眼球! (https://ic.work/) 技术资料 第5张

可以看到是使用PA5即DAC1输出电压,读者可以通过测量H9口进行电压测量


14.4


代码解析


14.4.1

DAC 配置函数

在driver_dac.c中定义了DAC的配置函数driver_dac_config:


C


void driver_dac_config(uint32_t dac_periph)

{

/*使能GPIOA时钟*/

rcu_periph_clock_enable(RCU_GPIOA);

/*使能DAC时钟*/

rcu_periph_clock_enable(RCU_DAC);

/*依据选择的DAC号来初始化IO口*/

if(dac_periph == DAC0)

{

gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4);

}

else

{

gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_5);

}

/*DAC复位*/

dac_deinit();

/*DAC外部触发禁能,即数据写入到保持寄存器就会自动输出电压*/

dac_trigger_disable(dac_periph);

/*DAC噪声关闭*/

dac_wave_mode_config(dac_periph, DAC_WAVE_DISABLE);

/*输出缓冲打开*/

dac_output_buffer_enable(dac_periph);

/*DAC使能*/

dac_enable(dac_periph);

}


14.4.2

DAC数据写入函数

在driver_dac.c中定义了DAC的数据写入函数driver_dac_out,调用这个函数后即将数字值写入到DAC数据保持寄存器中:


C


void driver_dac_out(uint32_t dac_periph, uint32_t dac_align, uint16_t data)

{

/*写入数据到DAC保持寄存器*/

dac_data_set(dac_periph,dac_align,data);

}


14.4.3

main函数实现

以下为main函数代码:


C


int main(void)

{

driver_init();//delay函数初始化

bsp_uart_init(&BOARD_UART);//BOARD_UART串口初始化

driver_dac_config(DACx);//DAC配置

while (1)

{

delay_ms(200);//延时200ms

DAC_data += 200;//DAC_data值自增加200

if(DAC_data>4000)//DAC防止溢出

{

DAC_data = 0;

}

printf(" the DAC_data is %d \r\n", DAC_data);//打印DAC data数据

driver_dac_out(DACx,DAC_ALIGN_12B_R,DAC_data);//输出电压

}

}

本例程main函数首先进行了延时函数初始化,再配置开发板上的USB串口,接着进行DAC配置。DAC配置函数中的实参通过main.c中定义,读者可根据实际需求修改:


C


#define DACx DAC1

main函数主循环中每200ms自增DAC_data值,并将该值写入到数据保存寄存器中,然后将DAC_data值打印出来。


14.5


实验结果

使用外用表测量开发板H9接口上的电压值,可以看到电压循环从低到高的变化。

GD32F303红枫派开发板DAC输出电压实验教程,快速上手,吸引你的眼球! (https://ic.work/) 技术资料 第6张
GD32F303红枫派开发板DAC输出电压实验教程,快速上手,吸引你的眼球! (https://ic.work/) 技术资料 第7张





教程


由GD32 MCU方案商聚沃


科技原创


发布,了解更多GD32 MCU教程,关注聚沃科技官网





文章推荐

相关推荐