[DemoCode下载] M029通过PWM触发ADC

[复制链接]
743|3
 楼主| 643757107 发表于 2018-10-26 23:57 | 显示全部楼层 |阅读模式
  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: 14/01/28 11:44a $
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]    NUC029 Series ADC Interface Controller Driver Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved.
  10. *
  11. ******************************************************************************/
  12. #include <stdio.h>
  13. #include "NUC029xAN.h"

  14. #define PLL_CLOCK       50000000


  15. /*---------------------------------------------------------------------------------------------------------*/
  16. /* Define Function Prototypes                                                                              */
  17. /*---------------------------------------------------------------------------------------------------------*/
  18. void SYS_Init(void);
  19. void UART0_Init(void);
  20. void ADC_PWMTrigTest_SingleOpMode(void);


  21. void SYS_Init(void)
  22. {
  23.     /*---------------------------------------------------------------------------------------------------------*/
  24.     /* Init System Clock                                                                                       */
  25.     /*---------------------------------------------------------------------------------------------------------*/

  26.     /* Enable Internal RC 22.1184MHz clock */
  27.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

  28.     /* Waiting for Internal RC clock ready */
  29.     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

  30.     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
  31.     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

  32.     /* Enable external XTAL 12MHz clock */
  33.     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

  34.     /* Waiting for external XTAL clock ready */
  35.     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

  36.     /* Set core clock as PLL_CLOCK from PLL */
  37.     CLK_SetCoreClock(PLL_CLOCK);

  38.     /* Enable UART module clock */
  39.     CLK_EnableModuleClock(UART0_MODULE);

  40.     /* Enable ADC module clock */
  41.     CLK_EnableModuleClock(ADC_MODULE);

  42.     /* Enable PWM01 module clock */
  43.     CLK_EnableModuleClock(PWM01_MODULE);

  44.     /* Select UART module clock source */
  45.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

  46.     /* Select PWM01 module clock source */
  47.     CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HXT, 0);

  48.     /* ADC clock source is 22.1184MHz, set divider to 7, ADC clock is 22.1184/7 MHz */
  49.     CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_CLKDIV_ADC(7));

  50.     /*---------------------------------------------------------------------------------------------------------*/
  51.     /* Init I/O Multi-function                                                                                 */
  52.     /*---------------------------------------------------------------------------------------------------------*/

  53.     /* Set P3 multi-function pins for UART0 RXD and TXD */
  54.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  55.     SYS->P3_MFP |= SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;

  56.     /* Disable the P1.0 - P1.3 digital input path to avoid the leakage current */
  57.     GPIO_DISABLE_DIGITAL_PATH(P1, 0xF);

  58.     /* Configure the P1.0 - P1.3 ADC analog input pins */
  59.     SYS->P1_MFP &= ~(SYS_MFP_P10_Msk | SYS_MFP_P11_Msk | SYS_MFP_P12_Msk | SYS_MFP_P13_Msk);
  60.     SYS->P1_MFP |= SYS_MFP_P10_AIN0 | SYS_MFP_P11_AIN1 | SYS_MFP_P12_AIN2 | SYS_MFP_P13_AIN3 ;

  61.     /* Configure the P2.0 as PWM0 output pin */
  62.     SYS->P2_MFP &= ~(SYS_MFP_P20_Msk);
  63.     SYS->P2_MFP |= SYS_MFP_P20_PWM0;

  64. }

  65. /*---------------------------------------------------------------------------------------------------------*/
  66. /* Init UART                                                                                               */
  67. /*---------------------------------------------------------------------------------------------------------*/
  68. void UART0_Init()
  69. {
  70.     /* Reset IP */
  71.     SYS_ResetModule(UART0_RST);

  72.     /* Configure UART0 and set UART0 Baudrate */
  73.     UART_Open(UART0, 115200);
  74. }

  75. /*---------------------------------------------------------------------------------------------------------*/
  76. /* Function: ADC_PWMTrigTest_SingleOpMode                                                                  */
  77. /*                                                                                                         */
  78. /* Parameters:                                                                                             */
  79. /*   None.                                                                                                 */
  80. /*                                                                                                         */
  81. /* Returns:                                                                                                */
  82. /*   None.                                                                                                 */
  83. /*                                                                                                         */
  84. /* Description:                                                                                            */
  85. /*   ADC hardware trigger test.                                                                            */
  86. /*---------------------------------------------------------------------------------------------------------*/
  87. void ADC_PWMTrigTest_SingleOpMode()
  88. {
  89.     printf("\n<<< PWM trigger test (Single mode) >>>\n");

  90.     /* Set the ADC operation mode as single, input mode as single-end and enable the analog input channel 2 */
  91.     ADC_Open(ADC, ADC_ADCR_DIFFEN_SINGLE_END, ADC_ADCR_ADMD_SINGLE, 0x1 << 2);

  92.     /* Power on ADC module */
  93.     ADC_POWER_ON(ADC);

  94.     /* Configure the hardware trigger condition and enable hardware trigger; PWM trigger delay: (4*10) system clock cycles*/
  95.     ADC_EnableHWTrigger(ADC, ADC_ADCR_TRGS_PWM, 10);

  96.     /* clear the A/D interrupt flag for safe */
  97.     ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);

  98.     /* Edge-aligned type; one-shot mode. */
  99.     PWM_SET_ALIGNED_TYPE(PWMA, 0x1, PWM_EDGE_ALIGNED);
  100.     /* Clock prescaler */
  101.     PWM_SET_PRESCALER(PWMA, 0, 2);
  102.     /* Timer 0 divisor=1 */
  103.     PWM_SET_DIVIDER(PWMA, 0, PWM_CLK_DIV_1);
  104.     /* PWM counter value */ /* PWM frequency = PWM clock source/(clock prescaler setting + 1)/divisor/(CNR+1) */
  105.     PWM_SET_CNR(PWMA, 0, 5);
  106.     /* PWM compare value */
  107.     PWM_SET_CMR(PWMA, 0, 1);
  108.     /* Enable PWM0 to trigger ADC */
  109.     PWM_EnableADCTrigger(PWMA, 0, PWM_PERIOD_TRIGGER_ADC);
  110.     /* PWM0 pin output enabled. PWM frequency 1MHz, duty 30%. */
  111.     PWM_EnableOutput(PWMA, 0x1);
  112.     /* Start PWM module */
  113.     PWM_Start(PWMA, 0x1);

  114.     /* Wait conversion done */
  115.     while(!ADC_GET_INT_FLAG(ADC, ADC_ADF_INT));

  116.     /* Clear the ADC interrupt flag */
  117.     ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);

  118.     printf("Channel 2: 0x%X\n", ADC_GET_CONVERSION_DATA(ADC, 2));

  119.     /* Disable ADC */
  120.     ADC_POWER_DOWN(ADC);
  121.     /* Stop PWM generation */
  122.     PWM_ForceStop(PWMA, 0x1);

  123. }





  124. /*---------------------------------------------------------------------------------------------------------*/
  125. /* MAIN function                                                                                           */
  126. /*---------------------------------------------------------------------------------------------------------*/
  127. main(void)
  128. {

  129.     /* Unlock protected registers */
  130.     SYS_UnlockReg();

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

  133.     /* Lock protected registers */
  134.     SYS_LockReg();

  135.     /* Init UART0 for printf */
  136.     UART0_Init();

  137.     /*---------------------------------------------------------------------------------------------------------*/
  138.     /* SAMPLE CODE                                                                                             */
  139.     /*---------------------------------------------------------------------------------------------------------*/

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

  141.     /* ADC hardware trigger test */
  142.     ADC_PWMTrigTest_SingleOpMode();

  143.     /* Disable ADC module */
  144.     ADC_Close(ADC);

  145.     /* Disable ADC IP clock */
  146.     CLK_DisableModuleClock(ADC_MODULE);

  147.     /* Disable External Interrupt */
  148.     NVIC_DisableIRQ(ADC_IRQn);

  149.     printf("\nExit ADC sample code\n");

  150.     while(1);

  151. }



 楼主| 643757107 发表于 2018-10-26 23:59 | 显示全部楼层
这种用法很经常吧
mintspring 发表于 2018-10-27 00:07 | 显示全部楼层
是的,有好几个触发方式呢。
huangcunxiake 发表于 2018-10-28 12:44 | 显示全部楼层
PWM可以触发好几个呢,我记不清了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3937

帖子

11

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