6509|0

539

帖子

3

TA的资源

纯净的硅(初级)

楼主
 

【GD32L233C-START评测】8、ADC与DAC测试 [复制链接]

一、概述

GD32L233C-START开发板板载的MCU具体型号是GD32L233CCT6,集成了一个ADC单元和一个DAC单元。

其中,ADC拥有14个通道(10个外部通道和4个内部通道);DAC一个通道。

通过下面的这张图,可以很方便的看出该MCU的资源情况:

12位ADC是一种采用逐次逼近方式的模拟数字转换器。ADC可以转换16个外部通道和4个内部通道的模拟信号。模拟看门狗允许应用程序来检测输入电压是否超出用户设定的阈值。各种通道的A/D转换可以配置成单次、连续、扫描或间断转换模式。ADC转换的结果可以按照左对齐或右对齐的方式存储在16位数据寄存器中。片上的硬件过采样机制可以通过减少来自MCU的相关计算负担来提高性能。

 

ADC的特性与STM32类似,不在做过多介绍。

需要特别说明一下的是采样时间和转换时间,GD32L233的ADC支持采样时间和转换时间都是可编程的,用户可以根据实际需要进行设置。

但是采样时间和转换时间并不支持无级设置。

转换时间只与设置的ADC的分辨率有关系(当然还与ADCCLK有关系),有4中选择。

有分辨没有直接关系,但是需要根据输入阻抗来进行匹配,太大和太小都不合适,采样时间有8种选择。

 

采样时间通过寄存器ADC_SAMPTx进行设置:

DAC可以将12 位的数字数据转换为外部引脚上的电压输出。数据可以采用8 位或
12 位模式,左对齐或右对齐模式。当使能了外部触发,DMA 可被用于更新输入端数字数据。
在输出电压时,可以利用DAC 输出缓冲区来获得更高的驱动能力。

GD32L233的DAC还支持噪声波,可以将噪声叠加在输出波形上。

有两种方式可以将噪声波加载到DAC 输出数据:LFSR 噪声波和三角波。噪声波模式可以通
过DAC_CTL0 寄存器的DWM 位来进行选择。噪声的幅值可以通过配置DAC_CTL0 寄存器
的DAC 噪声波位宽(DWBW)位来进行设置。

 

二、功能实现

要实现的功能:通过DAC产生一个0~3V的正弦波,然后再使用ADC采集该正弦波,采集到以后用uart打印出来。

软件配置:

1.timer:使用timer5产生一个周期中断,中断周期为625us,中断里面对ADC和DAC操作。

2.ADC:ADC配置为单次转换,软件触发,使用通道3作为输入通道(PA3),12bit模式,采样时间7.5 ADCCLK,在timer5中断函数中进行触发采集

3.DAC:12bit模式,在timer中断里设置DAC的输出值,DAC引脚PA4

 

timer5初始化:

void timer5_config(void)
{
    timer_parameter_struct timer_initpara;
		
		nvic_irq_enable(TIMER5_IRQn, 0);
    /* enable the peripherals clock */
    rcu_periph_clock_enable(RCU_TIMER5);

    /* deinit a TIMER */
    timer_deinit(TIMER5);
    /* initialize TIMER init parameter struct */
    timer_struct_para_init(&timer_initpara);
    /* TIMER1 configuration */
    timer_initpara.prescaler        = 319;//5us
    timer_initpara.alignedmode      = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection = TIMER_COUNTER_UP;
    timer_initpara.period           = 125;//625us
    timer_initpara.clockdivision    = TIMER_CKDIV_DIV1;
    timer_init(TIMER5, &timer_initpara);

    /* auto-reload preload enable */
    timer_auto_reload_shadow_enable(TIMER5);
    /* clear update interrupt bit */
    timer_interrupt_flag_clear(TIMER5, TIMER_INT_FLAG_UP);
    /* update interrupt enable */
    timer_interrupt_enable(TIMER5, TIMER_INT_UP);

    /* enable a TIMER */
    timer_enable(TIMER5);
}

ADC初始化:

void adc_config(void)
{
    /* ADC data alignment config */
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
    /* ADC channel length config */
    adc_channel_length_config(ADC_REGULAR_CHANNEL, 1U);

    /* ADC trigger config */
    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);
    /* ADC external trigger config */
    adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);

    /* enable ADC interface */
    adc_enable();
    delay_1ms(1U);
    /* ADC calibration and reset calibration */
    adc_calibration_enable();
}

DAC初始化:

void dac_config(void)
{
    dac_deinit();
    /* configure the DAC_OUT */
    dac_trigger_source_config(DAC_TRIGGER_SOFTWARE);
    dac_trigger_enable();
    dac_wave_mode_config(DAC_WAVE_DISABLE);
    dac_output_buffer_disable();
    /* enable DAC_OUT */
    dac_enable();
}

timer5中断函数:

void TIMER5_IRQHandler(void)
{
    if(SET == timer_interrupt_flag_get(TIMER5, TIMER_INT_FLAG_UP)) {
        /* clear update interrupt bit */
        timer_interrupt_flag_clear(TIMER5, TIMER_INT_FLAG_UP);
        /* toggle selected led */
        GPIO_TG(GPIOA) = GPIO_PIN_8;
				adc_val = adc_channel_sample(ADC_CHANNEL_3);//触发ad转换并获取AD值
			  dac_data_set(DAC_ALIGN_12B_R, get_wave_data());
        dac_software_trigger_enable();
				printf("%d\r\n",adc_val);
    }
}

 

正弦波生成使用查表法:

#define WAVE_LEN			(32U)


const uint16_t sin_table[WAVE_LEN]={
1861	,
2225	,
2574	,
2896	,
3178	,
3409	,
3581	,
3687	,
3723	,
3687	,
3581	,
3409	,
3178	,
2896	,
2574	,
2225	,
1861	,
1498	,
1149	,
827	,
545	,
313	,
141	,
35	,
0	,
35	,
141	,
313	,
545	,
827	,
1149	,
1498	
};

static uint16_t get_wave_data(void)
{
	static uint16_t index = 0;
	
	if(index >= WAVE_LEN)
	{
		index = 0;
	}
	
	return sin_table[index++];
}

 

三、验证

数据打印出来,并绘制成曲线如下:

 

数据打印:

工程文件:

gd_finger.7z (360.62 KB, 下载次数: 41)

 

此帖出自GD32 MCU论坛
点赞 关注
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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