408|1

194

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

兆易GD32H759I-EVAL DAC测试 [复制链接]

  本帖最后由 御坂10032号 于 2024-6-6 12:25 编辑

题外话

 

接上一章ADC,本章要测评的功能是DAC功能

 

正文

 

DAC功能的全称为Digital to analog convertor, 数字转换为模拟。像一些低端处理器一般是不带有DAC功能,但是他们实现DAC的是使用PWM控制的。而GD32H759I 上带有一个12位的DAC同时具备两个输出通道。

 

 

 

对于DAC的结构框图,我们得知,当前的DAC有两种触发方式,分别是TRIGSEL(触发选择器,关于触发选择器将会在下几个章节介绍,触发选择器的主要功能是将某一个外设的输出,作为另一个外设的输入触发条件,比如说触发ADC转换等) 和 SWTRx (软件触发)。 之后通过DAC的控制寄存器来控制DAC的相关特性等。比如说,是否开启DMA请求,是否开启DAC,噪声波位宽,以及噪声波的模式等(具体请参考用户手册的Page588关于DACX控制寄存器的描述) 在DAC使能后,将会控制DAC进行输出。在DAC的进行输出时,DAC的实际输出结果收到参考电压的影响。计算公式为VDAC_OUT=VREFP*OUTx_DO/4096。 DAC的输出范围为 0 到 VREFP。 (Page581)
 

 

同样DAC_CALR寄存器会对DAC进行校准。 之后经过缓冲区来使其DAC获得更大的驱动能力。

 

接下来我们来看下如何使用DAC功能,通过759库的方式

 

 

根据上述原理图得知, PA5作为了DAC0的输出1通道。也就是下图标记处

 

 

 

编码

 

DAC的使用一共分为以下几步

  1. 复用IO PA5
  2. 开始GPIO时钟和DAC时钟
  3. 初始化DAC
  4. 使能输出
  5. 设置DAC输出值

 

代码如下

#include "gd32h7xx.h"
#include "systick.h"
#include "bsp_usart.h"
static void cache_enable(void)
{
    /* Enable I-Cache */
    SCB_EnableICache();

    /* Enable D-Cache */
    SCB_EnableDCache();
}


extern uint8_t usart0_receive_data;

int main(void)
{
    /* Enable the CPU Cache */
    cache_enable();

    /* Configure systick */
    systick_config();

    usart_init();
		usart_receive_init();
		
		// 1 复用GPIO
		gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_5);
		//开启GPIO 和DAC 时钟
		rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_DAC);
		//初始化DAC
    dac_deinit(DAC0);
		//不适用触发选择器触发DAC转换
    dac_trigger_disable(DAC0, DAC_OUT1);
		//DAC 输出波形
    dac_wave_mode_config(DAC0, DAC_OUT1, DAC_WAVE_DISABLE);
    dac_enable(DAC0, DAC_OUT1);
		//设置DAC输出,分辨率和值等
    dac_data_set(DAC0, DAC_OUT1, DAC_ALIGN_12B_L, 0xA000);
    while(1) {
        
    }
}

这里需要说明的是这个dac_trigger_disable 方法。 这个方法是用来设置外部触发的。在代码中我们没有使用,所以禁用掉。 后面我会单独出一个Demo关于如何使用这个触发选择器的。其次如果想要控制DAC的输出波形的话,可以使用 dac_wave_mode_config来控制DAC的波形。 最后,关于DAC的dac_data_set() 函数, 由于这个DAC的分辨率是12位的,所以支持的数字范围为0-(2^12)  = 0-4095

 

我们来修改一下代码使其DAC可以从0 输出到4095.然后再从4095到0

 

#include "gd32h7xx.h"
#include "systick.h"
#include "bsp_usart.h"
static void cache_enable(void)
{
    /* Enable I-Cache */
    SCB_EnableICache();

    /* Enable D-Cache */
    SCB_EnableDCache();
}


extern uint8_t usart0_receive_data;

int main(void)
{
	
		uint16_t dac_value = 0; 
		uint8_t direction = 1;
    /* Enable the CPU Cache */
    cache_enable();

    /* Configure systick */
    systick_config();

    usart_init();
		usart_receive_init();
		
		// 1 复用GPIO
		gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_5);
		//开启GPIO 和DAC 时钟
		rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_DAC);
		//初始化DAC
    dac_deinit(DAC0);
		//不适用触发选择器触发DAC转换
    dac_trigger_disable(DAC0, DAC_OUT1);
		//DAC 输出波形
    dac_wave_mode_config(DAC0, DAC_OUT1, DAC_WAVE_DISABLE);
    dac_enable(DAC0, DAC_OUT1);
		//设置DAC输出,分辨率和值等
    
   while(1) {
      
        dac_data_set(DAC0, DAC_OUT1, DAC_ALIGN_12B_R, dac_value);
        
        if (direction) {
            dac_value++;
            if (dac_value >= 4095) {
                direction = 0;
            }
        } else {
            dac_value--;
            if (dac_value == 0) {
                direction = 1;
            }
        }
        
        delay_1ms(1);
    }
}

 

注意,使用DAC输出的时候需要将跳线帽JP47接到DAC上

现象如下所示:

WeChat_20240606103403

 

 

代码如下:

05-DAC.zip (46.11 KB, 下载次数: 1)

 

 

点赞 关注
 
 

回复
举报

194

帖子

4

TA的资源

纯净的硅(初级)

沙发
 

昨天晚上在B站看到有个STM32H7的核心板。480M的主频。都加主动散热风扇了。不知道这个H759I 跑满600M的话发热严重吗

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表