[DemoCode下载] DAC输出正弦波

[复制链接]
1089|2
 楼主| zhuotuzi 发表于 2024-4-21 20:02 | 显示全部楼层 |阅读模式
  1. /****************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.0
  4. * $Revision: 4 $
  5. * $Date: 20/06/30 8:04p $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    Demonstrate how to trigger DAC conversion by software method.
  7. *
  8. * SPDX-License-Identifier: Apache-2.0
  9. * [url=home.php?mod=space&uid=17282]@CopyRight[/url] (C) 2020 Nuvoton Technology Corp. All rights reserved.
  10. ******************************************************************************/
  11. #include "stdio.h"
  12. #include "NuMicro.h"

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

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

  24. /*---------------------------------------------------------------------------------------------------------*/
  25. /* Define functions prototype                                                                              */
  26. /*---------------------------------------------------------------------------------------------------------*/
  27. int32_t main(void);
  28. void DAC_FunctionTest(void);


  29. void SYS_Init(void)
  30. {
  31.     /* Unlock protected registers */
  32.     SYS_UnlockReg();

  33.     /*---------------------------------------------------------------------------------------------------------*/
  34.     /* Init System Clock                                                                                       */
  35.     /*---------------------------------------------------------------------------------------------------------*/
  36.     /* Enable HIRC clock (Internal RC 22.1184MHz) */
  37.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

  38.     /* Wait for HIRC clock ready */
  39.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

  40.     /* Select HCLK clock source as HIRC and and HCLK source divider as 1 */
  41.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

  42.     /* Select HIRC as the clock source of UART0 */
  43.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));

  44.     /* Enable UART peripheral clock */
  45.     CLK_EnableModuleClock(UART0_MODULE);

  46.     /* Enable UART module clock */
  47.     CLK_EnableModuleClock(UART0_MODULE);

  48.     /* Enable DAC module clock */
  49.     CLK_EnableModuleClock(DAC0_MODULE);

  50.     /*---------------------------------------------------------------------------------------------------------*/
  51.     /* Init I/O Multi-function                                                                                 */
  52.     /*---------------------------------------------------------------------------------------------------------*/
  53.     /* Set PB multi-function pins for UART0 RXD=PB.6 and TXD=PB.4 */
  54.     SYS->GPB_MFP1 = (SYS->GPB_MFP1 & ~(SYS_GPB_MFP1_PB4MFP_Msk | SYS_GPB_MFP1_PB6MFP_Msk)) |        \
  55.                     (SYS_GPB_MFP1_PB4MFP_UART0_TXD | SYS_GPB_MFP1_PB6MFP_UART0_RXD);

  56. }

  57. void UART0_Init()
  58. {
  59.     /*---------------------------------------------------------------------------------------------------------*/
  60.     /* Init UART                                                                                               */
  61.     /*---------------------------------------------------------------------------------------------------------*/
  62.     /* Reset UART module */
  63.     SYS_ResetModule(UART0_RST);

  64.     /* Configure UART0 and set UART0 baud rate */
  65.     UART_Open(UART0, 115200);
  66. }

  67. /*---------------------------------------------------------------------------------------------------------*/
  68. /* DAC function test                                                                                       */
  69. /*---------------------------------------------------------------------------------------------------------*/
  70. void DACFunctionTest(void)
  71. {
  72.     uint32_t ii;

  73.     printf("\n");
  74.     printf("+----------------------------------------------------------------------+\n");
  75.     printf("|                      DAC software trigger test                       |\n");
  76.     printf("+----------------------------------------------------------------------+\n");

  77.     printf("\n\nPlease hit any key to start DAC output\n");
  78.     getchar();

  79.     /* modify the test pattern to 5-bit width */
  80.     for(ii=0; ii<sizeof(sine)/2; ii++)
  81.     {
  82.         sine[ii] = (sine[ii]>>7)&0x1F;
  83.     }

  84.     /* Set the software trigger, enable DAC even trigger mode and enable D/A converter */
  85.     DAC_Open(DAC, 0, DAC_SOFTWARE_TRIGGER);

  86.     printf("\n\nPlease hit any key to start DAC output\n");

  87.     /* The DAC conversion settling time is 8us */
  88.     DAC_SetDelayTime(DAC, 8);

  89.     /* Enable DAC pin output */
  90.     DAC_ENABLE_OUTPUT(DAC);

  91.     /* Select reference voltage from Vreff */
  92.     DAC_VREFFSRC_AVDD(DAC);

  93.     /* Set DAC 5-bit holding data */
  94.     DAC_WRITE_DATA(DAC, 0, sine[index]);

  95.     /* Clear the DAC conversion complete finish flag for safe */
  96.     DAC_CLR_INT_FLAG(DAC, 0);

  97.     /* Enable the DAC interrupt */
  98.     DAC_ENABLE_INT(DAC, 0);
  99.     NVIC_EnableIRQ(DAC0_IRQn);

  100.     /* Start A/D conversion */
  101.     DAC_START_CONV(DAC);

  102.     printf("\nHit any key to quit!\n");

  103.     while(1)
  104.     {
  105.         /* Start A/D conversion */
  106.         DAC_START_CONV(DAC);

  107.         if((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) != 0)
  108.             continue;
  109.         else
  110.             break;
  111.     }

  112.     return;
  113. }

  114. /*---------------------------------------------------------------------------------------------------------*/
  115. /* DAC interrupt handler                                                                                   */
  116. /*---------------------------------------------------------------------------------------------------------*/
  117. void DAC0_IRQHandler(void)
  118. {
  119.     if(DAC_GET_INT_FLAG(DAC, 0))
  120.     {

  121.         if(index == array_size)
  122.             index = 0;
  123.         else
  124.         {
  125.             DAC_WRITE_DATA(DAC, 0, sine[index++]);

  126.             /* Clear the DAC conversion complete finish flag */
  127.             DAC_CLR_INT_FLAG(DAC, 0);

  128.         }
  129.     }
  130.     return;
  131. }

  132. /*---------------------------------------------------------------------------------------------------------*/
  133. /*  Main Function                                                                                          */
  134. /*---------------------------------------------------------------------------------------------------------*/
  135. int32_t main(void)
  136. {

  137.     /* Unlock protected registers */
  138.     SYS_UnlockReg();

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

  141.     /* Lock protected registers */
  142.     SYS_LockReg();

  143.     /* Init UART0 for printf */
  144.     UART0_Init();

  145.     /*---------------------------------------------------------------------------------------------------------*/
  146.     /* SAMPLE CODE                                                                                             */
  147.     /*---------------------------------------------------------------------------------------------------------*/

  148.     printf("\nSystem clock rate: %d Hz\n", SystemCoreClock);

  149.     /* Enable DAC output pin function (PA0/PA1) */
  150.     printf("*****************************************************\n");
  151.     printf("*  select PA0 pin function                          *\n");
  152.     printf("*  [0] PA0/PA1 as ICE DAT/CLK                       *\n");
  153.     printf("*  [1] PA0/PA1 as DAC output and VREFF              *\n");
  154.     printf("*****************************************************\n");
  155.     switch(getchar())
  156.     {
  157.     case '0':
  158.     default:
  159.         SYS->GPA_MFP0 &= ~SYS_GPA_MFP0_PA0MFP_Msk;
  160.         SYS->GPA_MFP0 |= SYS_GPA_MFP0_PA0MFP_ICE_DAT;
  161.         SYS->GPA_MFP0 &= ~SYS_GPA_MFP0_PA1MFP_Msk;
  162.         SYS->GPA_MFP0 |= SYS_GPA_MFP0_PA1MFP_ICE_CLK;
  163.         break;
  164.     case '1':
  165.         SYS->GPA_MFP0 &= ~SYS_GPA_MFP0_PA0MFP_Msk;
  166.         SYS->GPA_MFP0 |= SYS_GPA_MFP0_PA0MFP_DAC0_OUT;
  167.         SYS->GPA_MFP0 &= ~SYS_GPA_MFP0_PA1MFP_Msk;
  168.         SYS->GPA_MFP0 |= SYS_GPA_MFP0_PA1MFP_ADC0_CH1;
  169.         break;
  170.     }

  171.     /* Single Mode test */
  172.     DACFunctionTest();

  173.     /* Reset DAC module */
  174.     SYS_ResetModule(DAC0_RST);

  175.     /* Disable DAC IP clock */
  176.     CLK_DisableModuleClock(DAC0_MODULE);

  177.     /* Disable External Interrupt */
  178.     NVIC_DisableIRQ(DAC0_IRQn);

  179.     printf("Exit DAC sample code\n");

  180.     while(1);

  181. }



 楼主| zhuotuzi 发表于 2024-4-21 20:05 | 显示全部楼层
有DAC很好用。
lidi911 发表于 2024-4-22 08:45 来自手机 | 显示全部楼层
一个周波对应多少个点?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

214

主题

3375

帖子

7

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