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

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

3天内不再提示

【GD32L233C-START】DAC输出(正弦波、锯齿波、方波)

西安乐拓精益 2022-07-11 09:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1.介绍
GD32L233C采用的是一款M23的内核。这个芯片据说功耗非常的低,低到什么程度呢?等后面我们再进行测试,今天我们主要来测试GD32L233C-STARTDAC,既然要测试DAC,示波器是不可少的,这个实验在家做,然而LZ家里并没有示波器,不过最近看到一款好东西,LOTO虚拟示波器,看过这款示波器的参数,还不错。所以入手了一款,测量芯片输出的DAC应该没什么问题,接下来开始测试吧。
2.设计
首先需要输出让芯片输出DAC,而且还需要输出波形,这个稍微费点功夫,之前在GD32L233C-START移植了RTThread,现在在这个代码的基础上添加DAC的输出程序,这个程序移植了其他网友的,代码我也贴出来,经过测试,代码没有啥问题:
比较麻烦的是正弦波的代码:

const float sinus_I_quarter[91] =
{
0.0000, 0.0175, 0.0349, 0.0523, 0.0698, 0.0872, 0.1045, 0.1219, 0.1392, 0.1564, // 00 .. 09
0.1736, 0.1908, 0.2079, 0.2250, 0.2419, 0.2588, 0.2756, 0.2924, 0.3090, 0.3256, // 10 .. 19
0.3420, 0.3584, 0.3746, 0.3907, 0.4067, 0.4226, 0.4384, 0.4540, 0.4695, 0.4848, // 20 .. 29
0.5000, 0.5150, 0.5299, 0.5446, 0.5592, 0.5736, 0.5878, 0.6018, 0.6157, 0.6293, // 30 .. 39
0.6428, 0.6561, 0.6691, 0.6820, 0.6947, 0.7071, 0.7193, 0.7314, 0.7431, 0.7547, // 40 .. 49
0.7660, 0.7771, 0.7880, 0.7986, 0.8090, 0.8192, 0.8290, 0.8387, 0.8480, 0.8572, // 50 .. 59
0.8660, 0.8746, 0.8829, 0.8910, 0.8988, 0.9063, 0.9135, 0.9205, 0.9272, 0.9336, // 60 .. 69
0.9397, 0.9455, 0.9511, 0.9563, 0.9613, 0.9659, 0.9703, 0.9744, 0.9781, 0.9816, // 70 .. 79
0.9848, 0.9877, 0.9903, 0.9925, 0.9945, 0.9962, 0.9976, 0.9986, 0.9994, 0.9998, // 80 .. 89
1.0000 // 90
};

#define CIRCLE_QUARTER_1 1
#define CIRCLE_QUARTER_2 2
#define CIRCLE_QUARTER_3 3
#define CIRCLE_QUARTER_4 4
float sinus_lookup (unsigned int angle)
{
float sin_value;
unsigned int circle_quarter;
// correct angles outside the accepted angle range into 0 .. 359
if (angle > 359u)
angle = angle % 360u;
circle_quarter = 1 + (angle / 90u);
switch (circle_quarter)
{
case CIRCLE_QUARTER_1: // 00 .. 89
sin_value = sinus_I_quarter[angle];
break;
case CIRCLE_QUARTER_2: // 90 .. 179
sin_value = sinus_I_quarter[180 - angle];
break;
case CIRCLE_QUARTER_3: // 180 .. 269
sin_value = -sinus_I_quarter[angle - 180];
break;
case CIRCLE_QUARTER_4: // 270 .. 359
sin_value = -sinus_I_quarter[360 - angle];
break;
}
return sin_value;
}

void plot_sin(uint32_t f, uint32_t delta_f)
{
/* 定时周期为T=1/delta_f, f=1/(pMax*T) */
static uint32_t point = 0;
uint32_t pMAX = delta_f/f;
uint32_t value = 0;
if (point++ > pMAX) point = 0;
value = (uint32_t)((sinus_lookup(360*point/pMAX)+1)*10000)*2047/10000;
dac_software_trigger_enable();
dac_data_set(DAC_ALIGN_12B_R, value);
}

接下来是锯齿波和方波的代码,这两个代码比较简单:

void plot_triangle(uint32_t f, uint32_t delta_f)
{
/* 定时周期为T=1/delta_f, f=1/(pMax*T) */
static uint32_t point = 0;
uint32_t pMAX = delta_f/f;
uint32_t pMAX2 = pMAX/2;
uint32_t value = 0;
if (++point > pMAX) point = 0;
if (point < pMAX2)
{
value = point * 4095 / pMAX2;
}
else
{
value = (pMAX - point) * 4095 / pMAX2;
}
dac_software_trigger_enable();
dac_data_set(DAC_ALIGN_12B_R, value);
}
void plot_square(uint32_t f, uint32_t delta_f)
{
/* 定时周期为T=1/delta_f, f=1/(pMax*T) */
static uint32_t point = 0;
uint32_t pMAX = delta_f/f;
uint32_t pMAX2 = pMAX/2;
uint32_t value = 0;
if (++point > pMAX) point = 0;
if (point < pMAX2)
{
value = 0;
}
else
{
value = 0xFFF;
}
dac_software_trigger_enable();
dac_data_set(DAC_ALIGN_12B_R, value);
}

最后需要开启一个定时器,还有DAC的初始化:

void timerx_init(uint32_t timer_periph, uint16_t period, uint16_t prescaler)
{
/* TIMER1 configuration: input capture mode -------------------
the external signal is connected to TIMER1 CH0 pin (PA0)
the rising edge is used as active edge
the TIMER1 CH0CV is used to compute the frequency value
------------------------------------------------------------ */
timer_parameter_struct timer_initpara;
timer_ic_parameter_struct timer_icinitpara;

/* enable the peripherals clock */
rcu_periph_clock_enable(RCU_TIMER2);

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

/* TIMER1 CH0 input capture configuration */
timer_icinitpara.icpolarity= TIMER_IC_POLARITY_RISING;
timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
timer_icinitpara.icfilter = 0x00;
timer_input_capture_config(timer_periph, TIMER_CH_0, &timer_icinitpara);

/* auto-reload preload enable */
timer_auto_reload_shadow_enable(timer_periph);
/* clear channel 0 interrupt bit */
timer_interrupt_flag_clear(timer_periph, TIMER_INT_CH0);
/* channel 0 interrupt enable */
timer_interrupt_enable(timer_periph, TIMER_INT_CH0);

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

#define DAC_WAVE_TEST

void timer2_init(void)
{
timer_deinit(TIMER2);
rcu_periph_clock_enable(RCU_TIMER2);
#ifdef DAC_WAVE_TEST
timerx_init(TIMER2, 639, 9);// 100KHz 0.1ms
#endif
timer_interrupt_enable(TIMER2, TIMER_INT_UP);
nvic_irq_enable(TIMER2_IRQn, 3);
}

void TIMER2_IRQHandler(void)
{
#ifdef DAC_WAVE_TEST
plot_sin(100, 10000); //正弦波
//plot_triangle(1, 10000);//锯齿波
//plot_square(1, 10000); //方波
#endif
timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);
}

void dac1_init(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_DAC);
gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4);
dac_deinit();
/* software trigger */
dac_trigger_enable();
dac_trigger_source_config(DAC_TRIGGER_SOFTWARE);
/* no noise wave */
dac_wave_mode_config(DAC_WAVE_DISABLE);
/* noise wave - triangle */
//dac_wave_mode_config(DAC_WAVE_MODE_TRIANGLE);
//dac_triangle_noise_config(DAC_TRIANGLE_AMPLITUDE_4095);
/* noise wave - lfsr */
//dac_wave_mode_config(DAC_WAVE_MODE_LFSR);
//dac_lfsr_noise_config(DAC_LFSR_BITS11_0);
dac_output_buffer_enable();
/* enable DAC and set data */
dac_enable();
dac_software_trigger_enable();
dac_data_set(DAC_ALIGN_12B_R, 0);
}

这样就可以输出正弦波、锯齿波和方波了。
3.波形测量
接下来我们来看一下输出的波形是否符合要求,首先需要将【GD32L233C-START】开发板连接LOTO示波器,分别连接GND和PA4管教,连接效果图如下图1所示。

pYYBAGLLgA-ALleqAAEijK3TbPg311.png

图1


然后让DAC输出正弦波,看一下波形如何。

poYBAGLLgA-ACO87AACyN65vJzA238.png

图2


从上图2中可以看到,一个周期大约在10ms,所以正弦波的周期为100Hz,输出还是听精准的。
然后输出锯齿波看看波形如何。

poYBAGLLgA-AP8vpAACyQLQS5Hk395.png

图3


从上图3可以得出,锯齿波的波形频率为1Hz。
最后我们来看看方波的波形图如何。

pYYBAGLLgA-AUNobAACvY54PfmY014.png

图4


从上图4可以看到,方波的波形频率为1Hz。
从上面波形可以得出,【GD32L233C-START】的定时器比较精准,DAC的输出值也比较稳定,性能还是不错的!
4.总结
刚入手的LOTO示波器还不错,测量的精度挺高的,不过还有好多设置没弄明白,等后续多琢磨琢磨。做电子的示波器是必不可少的,我先替你们测试测试这个示波器如何。
GD32L233C是新出来的芯片,整体功能还需要多进行测试,它最突出的低功耗后续要好好测量一下,这次就先到这里了。

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

    关注

    113

    文章

    7128

    浏览量

    196851
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    风机无刷电机驱动板控制策略:梯形正弦波对比解析-钿驰科技

    水平、调速精度及稳定性。风机无刷电机驱动领域主流的控制方式为梯形驱动与正弦波驱动,二者在控制逻辑、实现难度及应用表现上各具特色,是驱动板设计的核心考量。钿驰科技深耕风机无刷电机驱动领域多年,专注梯形
    的头像 发表于 04-25 14:46 568次阅读

    基于STM32F103驱动AD9833模块 DDS信号发生器输出正弦波/三角/方波可编程信号

    AD9833是一款低功耗可编程波形发生器,能输出正弦波、三角方波,频率范围为1Hz-9MHz,采用SPI串行通信。具有28位频率寄存器和12位相位寄存器,可通过公式计算
    的头像 发表于 01-10 10:30 3738次阅读
    基于STM32F103驱动AD9833模块 DDS信号发生器<b class='flag-5'>输出</b><b class='flag-5'>正弦波</b>/三角<b class='flag-5'>波</b>/<b class='flag-5'>方波</b>可编程信号

    晶振的输出波形:TTL、CMOS、LVPECL、LVDS和正弦波

    晶振(XO)输出波形(Output Type)是与封装尺寸一样重要的一个技术指标,这些输出波形可简单归为两种:正弦波方波
    的头像 发表于 11-21 15:37 1.1w次阅读
    晶振的<b class='flag-5'>输出</b>波形:TTL、CMOS、LVPECL、LVDS和<b class='flag-5'>正弦波</b>

    普源DG1022Z信号发生器正弦波频率调节指南

    普源DG1022Z信号发生器作为一款高性能的双通道波形发生器,可灵活输出正弦波方波、三角等多种波形,广泛应用于电子测试、科研实验及教学场景。本文将详细介绍如何通过该设备生成并调节
    的头像 发表于 10-14 16:53 1045次阅读
    普源DG1022Z信号发生器<b class='flag-5'>正弦波</b>频率调节指南

    经典1000W纯正弦波逆变器原理图资料

    经典1000W纯正弦波逆变器原理图
    发表于 10-11 15:32 22次下载

    ‌CDC3S04 四通道正弦波时钟缓冲器技术文档总结

    该CDC3S04是一款四通道低功耗低抖动正弦波时钟缓冲器。它可以使用 将单个主时钟缓冲到多个外设。四个正弦波输出 (CLK1–CLK4) 设计用于最小的通道间偏移和超低附加输出抖动。
    的头像 发表于 09-17 10:02 860次阅读
    ‌CDC3S04 四通道<b class='flag-5'>正弦波</b>时钟缓冲器技术文档总结

    信号发生器产生正弦波的频率精准调节方法

    与相位累加器。 特点:频率分辨率高(可达微赫兹级)、相位连续、易于程控,适用于精密测试场景。 2. 高速数模转换(DAC)与滤波 将离散的数字信号转换为模拟波形,通过低通滤波器平滑输出正弦波。 关键参数:
    的头像 发表于 08-27 17:49 1268次阅读
    信号发生器产生<b class='flag-5'>正弦波</b>的频率精准调节方法

    正弦波逆变器的工作原理与控制方式

    介绍了采用Boost PWM DC/DC变换器的正弦波逆变器的工作原理与控制方式,这是一种新型的正弦波逆变器。 纯分享帖,点击下方附件免费获取完整资料~~~ 内容有帮助可以关注、点赞、评论支持一下
    发表于 07-23 13:22

    磁性元件变革:告别正弦波激励源,拥抱方波

    扮演着极为重要的角色,它贯穿于整个磁特性研究的诸多环节。 本文将结合福州大学汪晶慧教授的公开演讲内容,深入剖析以正弦波为标准时在测量与计算过程中遭遇的重重挑战,同时详细阐述引入方波作为标准后为解决这些难题所带
    的头像 发表于 07-10 15:25 910次阅读
    磁性元件变革:告别<b class='flag-5'>正弦波</b>激励源,拥抱<b class='flag-5'>方波</b>

    无刷直流电机方波正弦波复合驱动器设计

    摘要:针对无刷直流电机方波驱动出力大,正弦波驱动转矩脉动和噪声小的特点,设计了基于霍耳传感器信号的无刷直流电机方波正弦波复合驱动器。在不改动硬件电路的前提下,利用软件编程实现了无刷直
    发表于 06-27 16:39

    TI 正弦波发生器电路

    该文档介绍了德州仪器的一款正弦波发生器电路,其设计目标为实现8V/V的交流增益、10kHz的振荡频率,采用±2.5V电源供电;电路通过四通道运放TLV9064缓冲各RC滤波级以生成低失真正弦波
    的头像 发表于 06-23 14:23 2670次阅读
    TI <b class='flag-5'>正弦波</b>发生器电路

    第二十六章 DAC——输出正弦波

    本文介绍了W55MH32的DAC模块,其可配置8位或12位分辨率。两通道。详解功能框图、参考电压等,还通过实验展示用定时器触发、DMA传输实现双声道正弦波输出,配置含GPIO、DAC
    的头像 发表于 06-20 14:06 1436次阅读
    第二十六章 <b class='flag-5'>DAC</b>——<b class='flag-5'>输出</b><b class='flag-5'>正弦波</b>

    STM32F723ZET6使用ADC捕获标准正弦波并通过USB主动上报,正弦波重新拟合后存在凹陷峰怎么解决?

    内置PHY功能的模拟串口通信把数据上报。上报方式是每次adc采样存下一个点,累计达到1000个点进行一次HS上报。 上位机最好收到的波形如下: 之前通过标准的信号发生器输出1khz正弦波也会存
    发表于 06-20 07:22

    实用电源——正弦波逆变器

    资料全面详细地介绍了正弦波逆变器技术,阐述正弦波逆变器发展过程中各阶段典型逆变方式的工作原理,以及典型逆变器的工作过程。 主要内容包括:多重叠加式逆变器,如电压型电流型逆变器的多重叠加,PWM
    发表于 06-11 16:19

    3000W纯正弦波逆变器原理图变压器规格书及设计报告

    3000W纯正弦波逆变器原理图变压器规格书及设计报告
    发表于 05-19 17:42 41次下载