本帖最后由 御坂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的使用一共分为以下几步
- 复用IO PA5
- 开始GPIO时钟和DAC时钟
- 初始化DAC
- 使能输出
- 设置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
代码如下:
|