欢迎访问ic37.com |
会员登录 免费注册
发布采购

M051 ADC模数转换程序; ADC模数转换的程序

ADC模数转换的程序

评论

void UART0_Init() {     /* Reset IP */     SYS_ResetModule(UART0_RST);     /* Configure UART0 and set UART0 Baudrate */     UART_Open(UART0, 115200); } 设置好模式,并打开。
void ADC_IRQHandler(void) 这个看起来好复杂,脑子笨,看不懂。。

天灵灵地灵灵 发表于 2015-7-14 21:54 要这样发代码,才够意思,图片看的太费劲了 你的代码都是从哪找到的啊


复制/**************************************************************************** * [url=home.php?mod=space&uid=288409]@file[/url]     main.c * [url=home.php?mod=space&uid=895143]@version[/url]  V3.0 * $Revision: 6 $ * $Date: 14/01/28 11:44a $ * [url=home.php?mod=space&uid=247401]@brief[/url]    M051 Series ADC Interface Controller Driver Sample Code * * @note * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved. * ******************************************************************************/ #include <stdio.h> #include "M051Series.h" #define PLL_CLOCK       50000000 /*---------------------------------------------------------------------------------------------------------*/ /* Define Function Prototypes                                                                              */ /*---------------------------------------------------------------------------------------------------------*/ void SYS_Init(void); void UART0_Init(void); void AdcBurstModeTest(void); /*---------------------------------------------------------------------------------------------------------*/ /* Define global variables and constants                                                                   */ /*---------------------------------------------------------------------------------------------------------*/ #define BURST_COUNT 20 volatile uint32_t g_u32AdcDataCount; uint16_t g_au16AdcData[BURST_COUNT]; void SYS_Init(void) {     /*---------------------------------------------------------------------------------------------------------*/     /* Init System Clock                                                                                       */     /*---------------------------------------------------------------------------------------------------------*/     /* Enable Internal RC 22.1184MHz clock */     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);     /* Waiting for Internal RC clock ready */     CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);     /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */     CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));     /* Enable external XTAL 12MHz clock */     CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);     /* Waiting for external XTAL clock ready */     CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);     /* Set core clock as PLL_CLOCK from PLL */     CLK_SetCoreClock(PLL_CLOCK);     /* Enable UART module clock */     CLK_EnableModuleClock(UART0_MODULE);     /* Enable ADC module clock */     CLK_EnableModuleClock(ADC_MODULE);     /* Select UART module clock source */     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));     /* ADC clock source is 22.1184MHz, set divider to 7, ADC clock is 22.1184/7 MHz */     CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HIRC, CLK_CLKDIV_ADC(7));     /*---------------------------------------------------------------------------------------------------------*/     /* Init I/O Multi-function                                                                                 */     /*---------------------------------------------------------------------------------------------------------*/     /* Set P3 multi-function pins for UART0 RXD and TXD */     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);     SYS->P3_MFP |= SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;     /* Disable the P1.0 - P1.3 digital input path to avoid the leakage current */     GPIO_DISABLE_DIGITAL_PATH(P1, 0xF);     /* Configure the P1.0 - P1.3 ADC analog input pins */     SYS->P1_MFP &= ~(SYS_MFP_P10_Msk | SYS_MFP_P11_Msk | SYS_MFP_P12_Msk | SYS_MFP_P13_Msk);     SYS->P1_MFP |= SYS_MFP_P10_AIN0 | SYS_MFP_P11_AIN1 | SYS_MFP_P12_AIN2 | SYS_MFP_P13_AIN3 ; } /*---------------------------------------------------------------------------------------------------------*/ /* Init UART                                                                                               */ /*---------------------------------------------------------------------------------------------------------*/ void UART0_Init() {     /* Reset IP */     SYS_ResetModule(UART0_RST);     /* Configure UART0 and set UART0 Baudrate */     UART_Open(UART0, 115200); } /*---------------------------------------------------------------------------------------------------------*/ /* Function: ADC_GetConversionRate                                                                         */ /*                                                                                                         */ /* Parameters:                                                                                             */ /*   None.                                                                                                 */ /*                                                                                                         */ /* Returns:                                                                                                */ /*      Return the A/D conversion rate (sample/second)                                                     */ /*                                                                                                         */ /* Description:                                                                                            */ /*   The conversion rate depends on the clock source of ADC clock.                                         */ /*   It only needs 21 ADC clocks to complete an A/D conversion.                                            */ /*---------------------------------------------------------------------------------------------------------*/ static __INLINE uint32_t ADC_GetConversionRate() {     uint32_t u32AdcClkSrcSel;     uint32_t u32ClkTbl[4] = {__HXT, 0, 0, __HIRC};     /* Set the PLL clock frequency */     u32ClkTbl[1] = PllClock;     /* Set the system core clock frequency */     u32ClkTbl[2] = SystemCoreClock;     /* Get the clock source setting */     u32AdcClkSrcSel = ((CLK->CLKSEL1 & CLK_CLKSEL1_ADC_S_Msk) >> CLK_CLKSEL1_ADC_S_Pos);     /* Return the ADC conversion rate */     return ((u32ClkTbl[u32AdcClkSrcSel]) / (((CLK->CLKDIV & CLK_CLKDIV_ADC_N_Msk) >> CLK_CLKDIV_ADC_N_Pos) + 1) / 21); } /*---------------------------------------------------------------------------------------------------------*/ /* Function: AdcBurstModeTest                                                                              */ /*                                                                                                         */ /* Parameters:                                                                                             */ /*   None.                                                                                                 */ /*                                                                                                         */ /* Returns:                                                                                                */ /*   None.                                                                                                 */ /*                                                                                                         */ /* Description:                                                                                            */ /*   ADC burst mode test.                                                                                  */ /*---------------------------------------------------------------------------------------------------------*/ void AdcBurstModeTest() {     uint8_t  u8Option;     uint32_t u32Count;     printf("\n\nConversion rate: %d samples/second\n", ADC_GetConversionRate());     printf("\n");     printf("+----------------------------------------------------------------------+\n");     printf("|                      ADC burst mode sample code                      |\n");     printf("+----------------------------------------------------------------------+\n");     printf("\nIn this test, software will get %d conversion results from the specified channel.\n", BURST_COUNT);     while(1)     {         printf("\nSelect input mode:\n");         printf("  [1] Single end input (channel 2 only)\n");         printf("  [2] Differential input (channel pair 1 only)\n");         printf("  Other keys: exit burst mode test\n");         u8Option = getchar();         if(u8Option == '1')         {             printf("%d conversion results of channel 2:\n", BURST_COUNT);             /* Set the ADC operation mode as burst, input mode as single-end and enable the analog input channel 2 */             ADC_Open(ADC, ADC_ADCR_DIFFEN_SINGLE_END, ADC_ADCR_ADMD_BURST, 0x1 << 2);             /* Power on ADC module */             ADC_POWER_ON(ADC);             /* clear the A/D interrupt flag for safe */             ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);             /* Enable the ADC interrupt */             ADC_EnableInt(ADC, ADC_ADF_INT);             NVIC_EnableIRQ(ADC_IRQn);             /* Reset the ADC data counter and start A/D conversion */             g_u32AdcDataCount = 0;             ADC_START_CONV(ADC);             while(g_u32AdcDataCount < BURST_COUNT);             /* Stop A/D conversion */             ADC_STOP_CONV(ADC);             /* Disable the ADC interrupt */             ADC_DisableInt(ADC, ADC_ADF_INT);         }         else if(u8Option == '2')         {             printf("%d conversion results of differential input channel pair 1:\n", BURST_COUNT);             /* Set the ADC operation mode as burst, input mode as differential and                              enable analog input channel 2 for differential input channel pair 1*/             ADC_Open(ADC, ADC_ADCR_DIFFEN_DIFFERENTIAL, ADC_ADCR_ADMD_BURST, 1 << 2);             /* Power on ADC module */             ADC_POWER_ON(ADC);             /* clear the A/D interrupt flag for safe */             ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);             /* Enable the ADC interrupt */             ADC_EnableInt(ADC, ADC_ADF_INT);             NVIC_EnableIRQ(ADC_IRQn);             /* Reset the ADC data counter and start A/D conversion */             g_u32AdcDataCount = 0;             ADC_START_CONV(ADC);             while(g_u32AdcDataCount < BURST_COUNT);             /* Stop A/D conversion */             ADC_STOP_CONV(ADC);             /* Disable the ADC interrupt */             ADC_DisableInt(ADC, ADC_ADF_INT);         }         else             return ;         for(u32Count = 0; u32Count < BURST_COUNT; u32Count++)         {             printf("Conversion result: 0x%X\n", g_au16AdcData[u32Count]);         }         /* Change operation mode to clear burst mode FIFO buffers */         ADC_Open(ADC, ADC_ADCR_DIFFEN_DIFFERENTIAL, ADC_ADCR_ADMD_SINGLE, 2);     } } /*---------------------------------------------------------------------------------------------------------*/ /* ADC interrupt handler                                                                                   */ /*---------------------------------------------------------------------------------------------------------*/ void ADC_IRQHandler(void) {     while(ADC_IS_DATA_VALID(adc, 0)) /* Check the VALID bits */     {         if(g_u32AdcDataCount >= BURST_COUNT)             return;         /* In burst mode, the software always gets the conversion result of the specified channel from channel 0 */         g_au16AdcData[g_u32AdcDataCount++] = (uint16_t)ADC_GET_CONVERSION_DATA(ADC, 0);     }     ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT); /* clear the A/D conversion flag */ } /*---------------------------------------------------------------------------------------------------------*/ /* MAIN function                                                                                           */ /*---------------------------------------------------------------------------------------------------------*/ main(void) {     /* Unlock protected registers */     SYS_UnlockReg();     /* Init System, IP clock and multi-function I/O */     SYS_Init();     /* Lock protected registers */     SYS_LockReg();     /* Init UART0 for printf */     UART0_Init();     /*---------------------------------------------------------------------------------------------------------*/     /* SAMPLE CODE                                                                                             */     /*---------------------------------------------------------------------------------------------------------*/     printf("\nSystem clock rate: %d Hz", SystemCoreClock);     /* Burst Mode test */     AdcBurstModeTest();     /* Disable ADC module */     ADC_Close(ADC);     /* Disable ADC IP clock */     CLK_DisableModuleClock(ADC_MODULE);     /* Disable External Interrupt */     NVIC_DisableIRQ(ADC_IRQn);     printf("\nExit ADC sample code\n");     while(1); }
要这样发代码,才够意思,图片看的太费劲了
ADC_POWER_ON(ADC); 这个ADC还有电源开关,好有意思。
感谢楼主,正需要
图片确实看着好累啊
虽然是图片,内容却很精彩,不得不佩服。
这是图片啊,不能直接复制用啊
评论到底啦~
 复制成功!