[牛人杂谈] DAC的软件触发与定时器触发之对比

[复制链接]
1104|5
 楼主| gejigeji521 发表于 2024-7-13 16:46 | 显示全部楼层 |阅读模式
软件触发示例:
  1. /*************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
  4. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate how to trigger DAC conversion by software.
  5. *
  6. * [url=home.php?mod=space&uid=17282]@CopyRight[/url] (C) 2016 Nuvoton Technology Corp. All rights reserved.
  7. *
  8. ******************************************************************************/
  9. #include "stdio.h"
  10. #include "NuMicro.h"

  11. #if defined (__GNUC__) && !defined(__ARMCC_VERSION) && defined(OS_USE_SEMIHOSTING)
  12. extern void initialise_monitor_handles(void);
  13. #endif

  14. #define PLL_CLOCK           192000000

  15. const uint16_t sine[] = {2047, 2251, 2453, 2651, 2844, 3028, 3202, 3365, 3515, 3650, 3769, 3871, 3954,
  16.                          4019, 4064, 4088, 4095, 4076, 4040, 3984, 3908, 3813, 3701, 3573, 3429, 3272,
  17.                          3102, 2921, 2732, 2536, 2335, 2132, 1927, 1724, 1523, 1328, 1141,  962,  794,
  18.                          639,  497,  371,  262,  171,   99,   45,   12,    0,    7,   35,   84,  151,
  19.                          238,  343,  465,  602,  754,  919, 1095, 1281, 1475, 1674, 1876
  20.                         };

  21. static uint32_t index = 0;
  22. const uint32_t array_size = sizeof(sine) / sizeof(uint16_t);

  23. void DAC_IRQHandler(void)
  24. {
  25.     if(DAC_GET_INT_FLAG(DAC0, 0))
  26.     {

  27.         if(index == array_size)
  28.             index = 0;
  29.         else
  30.         {
  31.             DAC_WRITE_DATA(DAC0, 0, sine[index++]);
  32.             DAC_START_CONV(DAC0);
  33.             /* Clear the DAC conversion complete finish flag */
  34.             DAC_CLR_INT_FLAG(DAC0, 0);

  35.         }
  36.     }
  37.     return;
  38. }


  39. void SYS_Init(void)
  40. {
  41.     /* Unlock protected registers */
  42.     SYS_UnlockReg();

  43.     /* Set XT1_OUT(PF.2) and XT1_IN(PF.3) to input mode */
  44.     PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);

  45.     /* Enable HXT clock (external XTAL 12MHz) */
  46.     CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

  47.     /* Wait for HXT clock ready */
  48.     CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

  49.     /* Set core clock as PLL_CLOCK from PLL */
  50.     CLK_SetCoreClock(PLL_CLOCK);
  51.     /* Set PCLK0/PCLK1 to HCLK/2 */
  52.     CLK->PCLKDIV = CLK_PCLKDIV_APB0DIV_DIV2 | CLK_PCLKDIV_APB1DIV_DIV2;

  53.     /* Enable DAC module clock */
  54.     CLK_EnableModuleClock(DAC_MODULE);
  55.     /* Set PB.12 to input mode */
  56.     PB->MODE &= ~GPIO_MODE_MODE12_Msk;
  57.     /* Set PB multi-function pins for DAC voltage output */
  58.     SYS->GPB_MFPH |= SYS_GPB_MFPH_PB12MFP_DAC0_OUT;
  59.     /* Disable digital input path of analog pin DAC0_OUT to prevent leakage */
  60.     GPIO_DISABLE_DIGITAL_PATH(PB, (1ul << 12));
  61.     /* Lock protected registers */
  62.     SYS_LockReg();


  63. }

  64. int32_t main(void)
  65. {

  66.     /* Init System, IP clock and multi-function I/O */
  67.     SYS_Init();

  68. #if defined (__GNUC__) && !defined(__ARMCC_VERSION) && defined(OS_USE_SEMIHOSTING)
  69.     initialise_monitor_handles();
  70. #endif

  71.     printf("Please hit any key to start trigger DAC by software\n");
  72.     getchar();

  73.     /* Set the software trigger DAC and enable D/A converter */
  74.     DAC_Open(DAC0, 0, DAC_SOFTWARE_TRIGGER);

  75.     /* The DAC conversion settling time is 1us */
  76.     DAC_SetDelayTime(DAC0, 1);

  77.     /* Set DAC 12-bit holding data */
  78.     DAC_WRITE_DATA(DAC0, 0, 0x400);

  79.     /* Clear the DAC conversion complete finish flag for safe */
  80.     DAC_CLR_INT_FLAG(DAC0, 0);

  81.     /* Enable the DAC interrupt */
  82.     DAC_ENABLE_INT(DAC0, 0);
  83.     NVIC_EnableIRQ(DAC_IRQn);

  84.     /* Start A/D conversion */
  85.     DAC_START_CONV(DAC0);

  86.     while(1);

  87. }

定时器触发示例
  1. /*************************************************************************//**
  2. * @file     main.c
  3. * @version  V1.00
  4. * @brief    Demonstrate how to trigger DAC by timer.
  5. *
  6. * @copyright (C) 2017 Nuvoton Technology Corp. All rights reserved.
  7. *
  8. ******************************************************************************/
  9. #include "stdio.h"
  10. #include "NuMicro.h"

  11. #if defined (__GNUC__) && !defined(__ARMCC_VERSION) && defined(OS_USE_SEMIHOSTING)
  12. extern void initialise_monitor_handles(void);
  13. #endif

  14. #define PLL_CLOCK           192000000

  15. const uint16_t sine[] = {2047, 2251, 2453, 2651, 2844, 3028, 3202, 3365, 3515, 3650, 3769, 3871, 3954,
  16.                          4019, 4064, 4088, 4095, 4076, 4040, 3984, 3908, 3813, 3701, 3573, 3429, 3272,
  17.                          3102, 2921, 2732, 2536, 2335, 2132, 1927, 1724, 1523, 1328, 1141,  962,  794,
  18.                          639,  497,  371,  262,  171,   99,   45,   12,    0,    7,   35,   84,  151,
  19.                          238,  343,  465,  602,  754,  919, 1095, 1281, 1475, 1674, 1876
  20.                         };

  21. const uint32_t array_size = sizeof(sine) / sizeof(uint16_t);
  22. static uint32_t index = 0;


  23. void DAC_IRQHandler(void)
  24. {
  25.     if(DAC_GET_INT_FLAG(DAC0, 0))
  26.     {

  27.         if(index == array_size)
  28.             index = 0;
  29.         else
  30.         {
  31.             DAC_WRITE_DATA(DAC0, 0, sine[index++]);

  32.             /* Clear the DAC conversion complete finish flag */
  33.             DAC_CLR_INT_FLAG(DAC0, 0);

  34.         }
  35.     }
  36.     return;
  37. }


  38. void SYS_Init(void)
  39. {

  40.     /* Unlock protected registers */
  41.     SYS_UnlockReg();

  42.     /* Set XT1_OUT(PF.2) and XT1_IN(PF.3) to input mode */
  43.     PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);

  44.     /* Enable HXT clock (external XTAL 12MHz) */
  45.     CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

  46.     /* Wait for HXT clock ready */
  47.     CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

  48.     /* Set core clock as PLL_CLOCK from PLL */
  49.     CLK_SetCoreClock(PLL_CLOCK);
  50.     /* Set PCLK0/PCLK1 to HCLK/2 */
  51.     CLK->PCLKDIV = CLK_PCLKDIV_APB0DIV_DIV2 | CLK_PCLKDIV_APB1DIV_DIV2;


  52.     /* Enable DAC module clock */
  53.     CLK_EnableModuleClock(DAC_MODULE);

  54.     /* Enable Timer 0 module clock */
  55.     CLK_EnableModuleClock(TMR0_MODULE);

  56.     /* Select timer 0 module clock source as HXT */
  57.     CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, 0);
  58.     /* Set PB.12 to input mode */
  59.     PB->MODE &= ~GPIO_MODE_MODE12_Msk;
  60.     /* Set PB multi-function pins for DAC voltage output */
  61.     SYS->GPB_MFPH |= SYS_GPB_MFPH_PB12MFP_DAC0_OUT;
  62.     /* Disable digital input path of analog pin DAC0_OUT to prevent leakage */
  63.     GPIO_DISABLE_DIGITAL_PATH(PB, (1ul << 12));
  64.     /* Lock protected registers */
  65.     SYS_LockReg();
  66. }


  67. int32_t main(void)
  68. {
  69.     /* Init System, IP clock and multi-function I/O */
  70.     SYS_Init();

  71. #if defined (__GNUC__) && !defined(__ARMCC_VERSION) && defined(OS_USE_SEMIHOSTING)
  72.     initialise_monitor_handles();
  73. #endif

  74.     printf("\nHit any key to start!\n");
  75.     getchar();
  76.     /* Set the timer 0 trigger,DAC and enable D/A converter */
  77.     DAC_Open(DAC0, 0, DAC_TIMER0_TRIGGER);

  78.     /* The DAC conversion settling time is 1us */
  79.     DAC_SetDelayTime(DAC0, 1);

  80.     /* Set DAC 12-bit holding data */
  81.     DAC_WRITE_DATA(DAC0, 0, sine[index]);

  82.     /* Clear the DAC conversion complete finish flag for safe */
  83.     DAC_CLR_INT_FLAG(DAC0, 0);

  84.     /* Enable the DAC interrupt.  */
  85.     DAC_ENABLE_INT(DAC0, 0);
  86.     NVIC_EnableIRQ(DAC_IRQn);

  87.     /* Configure Timer 0 frequency to 1000Hz and start it. */
  88.     TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1000);
  89.     TIMER_SetTriggerTarget(TIMER0, TIMER_TRG_TO_DAC);
  90.     TIMER_Start(TIMER0);

  91.     while(1);

  92. }



 楼主| gejigeji521 发表于 2024-7-13 16:47 | 显示全部楼层
程序分析:
程序1:软件触发 DAC 转换
概述:
程序通过软件触发 DAC(数模转换器)转换。
使用中断处理器处理 DAC 转换完成的中断。
关键部分:
使用 DAC_START_CONV(DAC0) 触发 DAC 转换。
在 DAC_IRQHandler 中检查并清除 DAC 中断标志,同时更新下一个 DAC 输出数据。
主要步骤包括初始化系统时钟和 DAC 模块,设置 DAC 的转换延迟时间,开启 DAC 中断,并通过 DAC_START_CONV 触发转换。
 楼主| gejigeji521 发表于 2024-7-13 16:47 | 显示全部楼层
软件触发的关键步骤:
  1. /* 主要步骤 */
  2. SYS_Init();
  3. DAC_Open(DAC0, 0, DAC_SOFTWARE_TRIGGER);
  4. DAC_SetDelayTime(DAC0, 1);
  5. DAC_WRITE_DATA(DAC0, 0, 0x400);
  6. DAC_CLR_INT_FLAG(DAC0, 0);
  7. DAC_ENABLE_INT(DAC0, 0);
  8. NVIC_EnableIRQ(DAC_IRQn);
  9. DAC_START_CONV(DAC0);
 楼主| gejigeji521 发表于 2024-7-13 16:47 | 显示全部楼层
程序2:定时器触发 DAC 转换
概述:

程序通过定时器触发 DAC 转换。
使用中断处理器处理 DAC 转换完成的中断。
关键部分:

使用定时器 0 触发 DAC 转换。
在 DAC_IRQHandler 中检查并清除 DAC 中断标志,同时更新下一个 DAC 输出数据。
主要步骤包括初始化系统时钟、定时器和 DAC 模块,设置 DAC 的转换延迟时间,开启 DAC 中断,并通过定时器配置触发 DAC 转换。
 楼主| gejigeji521 发表于 2024-7-13 16:47 | 显示全部楼层
定时器触发的关键步骤
  1. /* 主要步骤 */
  2. SYS_Init();
  3. DAC_Open(DAC0, 0, DAC_TIMER0_TRIGGER);
  4. DAC_SetDelayTime(DAC0, 1);
  5. DAC_WRITE_DATA(DAC0, 0, sine[index]);
  6. DAC_CLR_INT_FLAG(DAC0, 0);
  7. DAC_ENABLE_INT(DAC0, 0);
  8. NVIC_EnableIRQ(DAC_IRQn);
  9. TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, 1000);
  10. TIMER_SetTriggerTarget(TIMER0, TIMER_TRG_TO_DAC);
  11. TIMER_Start(TIMER0);
 楼主| gejigeji521 发表于 2024-7-13 16:52 | 显示全部楼层
主要不同点总结:
触发方式:

程序1 使用软件触发 (DAC_SOFTWARE_TRIGGER)。
程序2 使用定时器触发 (DAC_TIMER0_TRIGGER)。
定时器使用:

程序1 不使用定时器。
程序2 使用定时器 0 配置为 1000Hz 的周期模式,并设置定时器触发 DAC 转换。
初始化过程:

程序1 初始化过程中不涉及定时器。
程序2 初始化过程中包含定时器 0 的配置和启动。
这两个程序分别展示了如何使用不同的触发方式来进行 DAC 转换,具体使用哪种方式可以根据实际应用需求来选择。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

198

主题

2509

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部