• 【正点原子STM32连载】 第四十章 DAC输出三角波实验 摘自【正点原子】APM32F407最小系统板使用指南


    1)实验平台:正点原子stm32f103战舰开发板V4
    2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
    3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##

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

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

    40.1 硬件设计
    40.1.1 例程功能

    1. 按下KEY_UP和KEY0按键,可分别利用DAC输出高采样率和低采样率的三角波
    2. 可通过USMART直接设置DAC输出特定的三角波
    3. LED0闪烁,指示程序正在运行
      40.1.2 硬件资源
    4. LED
      LED0 - PF9
    5. 按键
      KEY0 - PE4
      KEY_UP - PA0
    6. USART1(PA9、PA10连接至板载USB转串口芯片上)
    7. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
    8. DAC
      通道1 - PA4
      40.1.3 原理图
      本章实验使用的DAC为APM32F407的片上资源,因此没有对应的连接原理图。
      40.2 程序设计
      40.2.1 Geehy标准库的DAC驱动
      本章实验与上一章实验十分相似,上一章实验使用按键控制DAC通道1输出“离散”的电压,而本章实验的是使用软件算法控制DAC通道1输出的电压,使之输出一个三角波,因此大部分内容都是相似的,以及操作DAC的方式都是一样的,因此请见第39.2.1小节中Geehy标准库的DAC驱动的相关内容。
      40.2.2 DAC驱动
      本章实验的DAC驱动主要负责向应用层提供DAC的初始化以及控制DAC输出指定幅值、频率和个数的三角波的函数。本章实验中,DAC的驱动代码包括dac.c和dac.h两个文件。
      本章实验DAC驱动中对DAC的初始化与上一章实验中对DAC的初始化方式一致,请见第39.2.2小节中DAC初始化的相关内容提供。本小节仅介绍通过软件控制DAC输出三角波的函数,如下所示:
    /**
     * @brief	设置DAC通道1输出三角波
     * @param	maxval	: 最大值,范围:0~4095
     * @param	dt		: 每个采样点输出后的延时,单位:微秒
     * @param	samples	: 一个三角波周期采样点的个数,范围:0~(2 * maxval)
     * @param	n		: 输出三角波的个数
     * @retva	l无
     */
    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;
        		DAC_ConfigChannel1Data(DAC_ALIGN_12BIT_R, curval);/* 每个周期从0开始输出 */
        		
        		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);
        		}
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    可以看到,该函数就是每间隔一段时间就修改一次DAC的输出电压,以控制DAC输出指定的三角波,对于该函数的实现,读者无需深究,仅需会使用该函数即可。
    40.2.3 实验应用代码
    本章实验的应用代码,如下所示:

    int main(void)
    {
        uint8_t key;
        uint8_t t = 0;
        
        NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_3);	/* 设置中断优先级分组为组3 */
        sys_apm32_clock_init(336, 8, 2, 7);					/* 配置系统时钟 */
        delay_init(168);										/* 初始化延时功能 */
        usart_init(115200);									/* 初始化串口 */
        usmart_dev.init(84);								/* 初始化USMART */
        led_init();											/* 初始化LED */
        lcd_init();											/* 初始化LCD */
        dac_init(1);											/* 初始化DAC通道1 */
        
        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, "KEY_UP:Wave1  KEY0:Wave2", RED);
        lcd_show_string(30, 130, 200, 16, 16, "DAC None ", BLUE);
        
        while (1)
        {
        		t++;
        		key = key_scan(0);
        		
        		if (key == WKUP_PRES)		/* ADC通道1输出高采样率三角波,频率约为100Hz */
        		{
        			lcd_show_string(30, 130, 200, 16, 16, "DAC Wave1", BLUE);
        			/* 幅值4095,采样点间隔5us,2000个采样点,100个波形 */
        			dac_triangular_wave(4095, 5, 2000, 100);
        			lcd_show_string(30, 130, 200, 16, 16, "DAC None ", BLUE);
        		}
        		else if (key == KEY0_PRES)	/* ADC通道1输出低采样率三角波,频率约为100Hz */
        		{
        			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();
        			t = 0;
        		}
        		
        		delay_ms(10);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    应用代码中会初始化DAC通道1(PA4引脚),完成初始化后,便不断地扫描按键,并根据扫描到的按键,控制DAC通道1输出指定幅值、频率和个数三角波。
    40.3 下载验证
    在完成编译和烧录操作后,便可分别按下KEY0按键和KEY_UP按键控制DAC通道1输出不同类型的三角波,DAC通道1输出的三角波可通过示波器观察PA4引脚(DAC通道1输出引脚)看到。

  • 相关阅读:
    如何给图片降噪?看完你就学会了
    IEDA 突然找不到了compact middle packages
    ORB-SLAM2 ---- Tracking::UpdateLastFrame函数
    C++标准库模板(STL)-输入/输出库
    适合小孩接触编程起步的几款软件,从游戏中学习编程
    new Promise(function(resolve, reject){}) 的reject相当于抛异常
    BI-SQL丨WHILE
    如何在 R 中执行幂回归
    三、部署kafka
    elasticsearch查询之keyword字段的查询相关度评分控制
  • 原文地址:https://blog.csdn.net/weixin_55796564/article/details/133694608