搜索
bottom↓
回复: 0
打印 上一主题 下一主题

《ATK-DFPGL22G之FPGA开发指南_V1.0》第三十八章 DAC输出三角波实验

[复制链接]

出0入234汤圆

跳转到指定楼层
1
发表于 2023-8-1 09:19:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1)实验平台:正点原子 DFZU2EG_4EV MPSoC开发板
2)购买链接:https://item.taobao.com/item.htm?&id=692368045899
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-340252-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子FPGA交流群:994244016





第三十八章 DAC输出三角波实验


本章将使用软件的方式控制APM32E103的DAC输出指定幅值、频率和个数的三角波。通过本章的学习,读者将学习到DAC的使用。
本章分为如下几个小节:
38.1 硬件设计
38.2 程序设计
38.3 下载验证


38.1 硬件设计
38.1.1 例程功能

1. 按下KEY_UP和KEY0按键,可分别利用DAC输出高采样率和低采样率的三角波
2. 可通过USMART直接设置DAC输出特定的三角波
3. LED0闪烁,指示程序正在运行
38.1.2 硬件资源
1. LED
        LED0 - PB5
2. 按键
        KEY0 - PE4
        KEY_UP - PA0
3. USART1(PA9、PA10连接至板载USB转串口芯片上)
4. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
5. DAC
        通道1 - PA4
38.1.3 原理图
本章实验使用的DAC为APM32E103的片上资源,因此没有对应的连接原理图。
38.2 程序设计
38.2.1 Geehy标准库的DAC驱动

本章实验与上一章实验十分相似,上一章实验使用按键控制DAC通道1输出“离散”的电压,而本章实验的是使用软件算法控制DAC通道1输出的电压,使之输出一个三角波,因此大部分内容都是相似的,以及操作DAC的方式都是一样的,因此请见第37.2.1小节中Geehy标准库的DAC驱动的相关内容。
38.2.2 DAC驱动
本章实验的DAC驱动主要负责向应用层提供DAC的初始化以及控制DAC输出指定幅值、频率和个数的三角波的函数。本章实验中,DAC的驱动代码包括dac.c和dac.h两个文件。
本章实验DAC驱动中对DAC的初始化与上一章实验中对DAC的初始化方式一致,请见第37.2.2小节中DAC初始化的相关内容提供。本小节仅介绍通过软件控制DAC输出三角波的函数,如下所示:
/**
* @brief       设置DAC通道1输出三角波
* @param       maxval : 最大值,范围:0~4095
* @param       dt     : 每个采样点输出后的延时,单位:微秒
* @param       samples: 一个三角波周期采样点的个数,范围:0~(2 * maxval)
* @param       n      : 输出三角波的个数
* @retval      无
*/
void dac_triangular_wave(uint16_t maxval, uint16_t dt, uint16_t samples, uint16_t n)
{
    uint16_t incval;
    uint16_t curval;
    uint16_t i;
    uint16_t j;
   
    samples += (samples % 2);                          /* 确保采样点的个数为偶数 */
    incval = maxval / (samples / 2);
    if (incval == 0)
    {
        return;
    }
   
    for (j = 0; j < n; j++)
    {
        curval = 0;
/* 每个周期从0开始输出 */
        DAC_ConfigChannel1Data(DAC_ALIGN_12BIT_R, curval);
        
        for (i = 0; i < (samples / 2); i++)            /* 输出三角波的上升沿 */
        {
            curval += incval;
            DAC_ConfigChannel1Data(DAC_ALIGN_12BIT_R, curval);
            delay_us(dt);
        }
        
        for (i = 0; i < (samples / 2); i++)            /* 输出三角波的下降沿 */
        {
            curval -= incval;
            DAC_ConfigChannel1Data(DAC_ALIGN_12BIT_R, curval);
            delay_us(dt);
        }
    }
}
可以看到,该函数就是每间隔一段时间就修改一次DAC的输出电压,以控制DAC输出指定的三角波,对于该函数的实现,读者无需深究,仅需会使用该函数即可。
38.2.3 实验应用代码
本章实验的应用代码,如下所示:
int main(void)
{
    uint8_t t = 0;
    uint8_t key;
   
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);  /* 设置中断优先级分组为组4 */
    sys_apm32_clock_init(15);                         /* 配置系统时钟 */
    delay_init(120);                                  /* 初始化延时功能 */
    usart_init(115200);                               /* 初始化串口 */
    usmart_dev.init(120);                             /* 初始化USMART */
    led_init();                                       /* 初始化LED */
    lcd_init();                                       /* 初始化LCD */
    key_init();                                       /* 初始化按键 */
    dac_init(1);                                      /* 初始化DAC1_OUT1通道 */
   
    lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
    lcd_show_string(30, 70, 200, 16, 16, "DAC Triangular WAVE TEST", RED);
    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 110, 200, 16, 16, "KEY0:Wave1  KEY_UP:Wave2", RED);
/* 提示无输出 */
    lcd_show_string(30, 130, 200, 16, 16, "DAC None", BLUE);
   
    while (1)
    {
        t++;
        key = key_scan(0);                            /* 按键扫描 */
        
        if (key == KEY0_PRES)                         /* 高采样率,约1KHz波形 */
        {
            lcd_show_string(30, 130, 200, 16, 16, "DAC Wave1 ", BLUE);
/* 幅值4095,采样点间隔5us,200个采样点,100个波形 */
            dac_triangular_wave(4095, 5, 2000, 100);
            lcd_show_string(30, 130, 200, 16, 16, "DAC None  ", BLUE);
        }
        else if (key == WKUP_PRES)                    /* 低采样率,约1KHz波形 */
        {
            lcd_show_string(30, 130, 200, 16, 16, "DAC Wave2 ", BLUE);
/* 幅值4095,采样点间隔500us,20个采样点,100个波形 */
            dac_triangular_wave(4095, 500, 20, 100);
            lcd_show_string(30, 130, 200, 16, 16, "DAC None  ", BLUE);
        }
        
        if (t == 10)                                  /* 定时时间到了 */
        {
            LED0_TOGGLE();                            /* LED0闪烁 */
            t = 0;
        }
        delay_ms(10);
    }
}
应用代码中会初始化DAC通道1(PA4引脚),完成初始化后,便不断地扫描按键,并根据扫描到的按键,控制DAC通道1输出指定幅值、频率和个数三角波。
38.3 下载验证
在完成编译和烧录操作后,便可分别按下KEY0按键和KEY_UP按键控制DAC通道1输出不同类型的三角波,DAC通道1输出的三角波可通过示波器观察PA4引脚(DAC通道1输出引脚)看到。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 07:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表