0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【GD32F303红枫派开发板使用手册】第十四讲 DAC-输出电压实验

聚沃科技 2024-06-13 09:44 次阅读
wKgaomZVdiiAfR9BAB3mDFhHnZc972.png

14.1实验内容

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

14.2实验原理

14.2.1DAC工作原理

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

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

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

wKgaomZqTgiARPShAAAFrVqY4go731.png

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

DAC 的主要特征如下:

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

◼支持DMA功能;

◼同步更新转换;

◼外部事件触发转换;

◼可配置的内部缓冲区;

◼外部参考电压,VREF+;

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

◼双DAC并发模式

以下为GD32F303 DAC的框图:

wKgZomZqThKAGt3YAAFYUHDUx50144.png

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

wKgZomZqTiGABeqYAACFxiXpsIU854.png

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.2DAC 输出缓冲

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

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

14.2.3DAC DMA 功能

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

14.3硬件设计

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

wKgaomZqTjCAKLWtAACAvDR5lhQ256.png

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

14.4代码解析

14.4.1DAC 配置函数

在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.2DAC数据写入函数

在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.3main函数实现

以下为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接口上的电压值,可以看到电压循环从低到高的变化。

wKgZomZqTpeAa45TABYRUFQ9GJc585.pngwKgZomZqTpuAYR-hAABSBF23S4c154.png

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6012

    文章

    44173

    浏览量

    624630
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16254

    浏览量

    345649
  • 嵌入式
    +关注

    关注

    5019

    文章

    18505

    浏览量

    293530
  • dac
    dac
    +关注

    关注

    43

    文章

    2035

    浏览量

    189993
  • 开发板
    +关注

    关注

    25

    文章

    4618

    浏览量

    95175
收藏 人收藏

    评论

    相关推荐

    STM32CUBEMX开发GD32F303(6)----GPIO输入函数说明

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。
    的头像 发表于 11-25 16:06 1278次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(6)----GPIO输入函数说明

    GD32F303】星空介绍

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 09-11 17:55

    【星空GD32F303开发板试用体验】开发记录汇总

    本帖最后由 申小林一号 于 2021-10-15 14:47 编辑 开贴日期:2021年10月11日该贴主要是用于记录星空开发板使用记录以及学习GD32F303芯片的一个过程,将所有的
    发表于 10-11 16:09

    【星空GD32F303开发板试用体验】开箱+环境搭建

    本帖最后由 lustao 于 2021-10-19 09:29 编辑 感谢 发烧友学院以及广州旗点智能科技有限公司为我和孩子提供此产品星空GD32F303开发板。收到了星空
    发表于 10-18 14:15

    【星空GD32F303开发板试用体验】开箱+环境搭建

    https://bbs.elecfans.com/jishu_2179209_1_1.html感谢 发烧友学院以及广州旗点智能科技有限公司为我和孩子提供此产品星空gd32F303开发板。收到了星空
    发表于 11-02 15:36

    【星空GD32F303开发板试用体验】+板卡概览

    本帖最后由 cooldog123pp 于 2021-11-6 21:07 编辑 星空GD开发板是由旗点科技推出的一款GD32开发板
    发表于 11-06 21:05

    星空GD32F303开发板的相关资料下载

    一、开发板介绍星空GD开发板是由旗点科技推出的一款GD32开发板,板载
    发表于 12-10 08:27

    STM32CUBEMX开发GD32F303(4)----GPIO输出模式,速率测试、开漏和输出说明

    以STM32CUBEMX创建STM32F103工程,同时移植在GD32F303中,同时通过GD32303C_START开发板内进行验证。 需要样片的可以加Qun申请:615061293
    的头像 发表于 11-25 11:49 1536次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(4)----GPIO<b class='flag-5'>输出</b>模式,速率测试、开漏和<b class='flag-5'>输出</b>说明

    GD32F303固件库开发(5)----GPIO输出模式,速率测试、开漏和输出说明

    以STM32CUBEMX创建STM32F103工程,同时移植在GD32F303中,同时通过GD32303C_START开发板内进行验证。
    的头像 发表于 11-25 15:32 2777次阅读
    <b class='flag-5'>GD32F303</b>固件库<b class='flag-5'>开发</b>(5)----GPIO<b class='flag-5'>输出</b>模式,速率测试、开漏和<b class='flag-5'>输出</b>说明

    STM32CUBEMX开发GD32F303(14)----IIC之配置OLED

    本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过开发板内进行验证。
    的头像 发表于 07-26 13:52 1517次阅读
    STM32CUBEMX<b class='flag-5'>开发</b><b class='flag-5'>GD32F303</b>(14)----IIC之配置OLED

    GD32F303固件库开发

    的可以加群申请:615061293 。 GD32F303固件库开发(1)----前期准备与烧录 使用GDLINK、jlink、串口下载程序到GD芯片。 [https://blog.csdn.net
    的头像 发表于 07-27 09:27 780次阅读
    <b class='flag-5'>GD32F303</b>固件库<b class='flag-5'>开发</b>

    GD32F303红枫开发板使用手册】第二讲 GPIO-流水灯实验

    GD32F303系列MCU最多可支持 112 个通用I/O 引脚(GPIO),分别为 PA0 ~ PA15, PB0 ~ PB15, PC0 ~ PC15,PD0 ~ PD15, PE0
    的头像 发表于 05-29 10:02 397次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二讲 GPIO-流水灯<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第五讲 FMC-片内Flash擦写读实验

    MC即Flash控制器,其提供了片上Flash操作所需要的所有功能,在GD32F303系列MCU中,Flash前256K字节空间内, CPU执行指令零等待,具有相同主频下最快的代码执行效率。FMC也
    的头像 发表于 06-02 10:05 258次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第五讲 FMC-片内Flash擦写读<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册第十六讲 USART-DMA串口收发实验

    在前面ADC章节中,我们介绍了DMA的工作原理,这里就不多做介绍。从GD32F303用户手册中可以查到,各串口的TX和RX分别对应DMA的不同通道,比如USART0的TX对应DMA0的通道3,而RX对应DMA0的通道4。
    的头像 发表于 06-15 09:54 289次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】<b class='flag-5'>第十</b>六讲 USART-DMA串口收发<b class='flag-5'>实验</b>

    GD32F303红枫开发板使用手册】第二十讲 SPI-SPI NAND FLASH读写实验

    通过本实验主要学习以下内容: •SPI通信协议,参考19.2.1东方红开发板使用手册GD32F303 SPI操作方式,参考19.2.2东方红
    的头像 发表于 06-20 09:50 154次阅读
    【<b class='flag-5'>GD32F303</b><b class='flag-5'>红枫</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第二十讲 SPI-SPI NAND FLASH读写<b class='flag-5'>实验</b>