【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)
|