⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iar-

📁 IAR_example_EasyARM8962.zip
💻
字号:
/****************************************Copyright (c)****************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http:// www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File Name:          ADC.c
** Last modified Date: 2007.08.24
** Last Version:       V1.0
** Description:        A/D转换触发方式和转换程序
** 
**--------------------------------------------------------------------------------------------------------
** Created By:         Kang qinhua
** Created date:       2007.10.10
** Version:            V1.0
** Descriptions:       The original version 初始版本
**
**--------------------------------------------------------------------------------------------------------
** Modified by:        
** Modified date:      
** Version:            
** Description:
**
*********************************************************************************************************/
#include "includes.h"
#include "PLLSet.h"

unsigned long ulData;                                                   /*  采样数据缓冲器              */
static uint8  flag_Charge;                                              /*  采样次数                    */  
uint32        flag_ADC_finish = 0;                                      /*  采样完成标志                */
uint16        Charge_Val[3]   = {0, 0, 0};                              /*  存放采样数据                */

/*********************************************************************************************************
** Function name:      ADC_Trigger
** Descriptions:       配置A/D的触发源,用户根据实际需要在这个函数里配置对应的触发源
** input parameters:   无
** output parameters:  无
** Returned value:     无   
*********************************************************************************************************/
void ADC_Trigger(void)
{
    ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PWM0, 0);             /*  配置为PWM发生器0触发A/D     */
    SysCtlPWMClockSet(SYSCTL_PWMDIV_1);			                        /*  PWM时钟源1分频              */    
	
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);	                    /*  使能PF口外设                */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);	                    /*  使能PG口外设                */  
    
    SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);		                    /*  使能PWM外设                 */

    GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0);	                    /*  设置PF0为PWM0               */
    GPIOPinTypePWM(GPIO_PORTG_BASE, GPIO_PIN_1);	                    /*  设置PG1为PWM1               */
  
    PWMGenConfigure(PWM_BASE, PWM_GEN_0,			         
                    PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);       /*  设置PWM发生器0为上下计数
                                                                            方式,两路PWM不同步         */

    PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, 60000);		                /*  设置两路PWM的共同周期       */      

    PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, 50000);		                /*  分别设置两路PWM的匹配值     */
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, 10000);
	
    PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT, true);      /*  使能PWM0和PWM1              */

    PWMGenIntTrigEnable(PWM_BASE, PWM_GEN_0, PWM_TR_CNT_AD);	        /*  配置PWM发生器0产生一个A/D
                                                                            触发信号                    */
    PWMGenEnable(PWM_BASE, PWM_GEN_0);				                    /*  使能PWM发生器0              */
}

/*********************************************************************************************************
** Function name:      ADC_Init
** Descriptions:       A/D初始化
** input parameters:   无
** output parameters:  无
** Returned value:     无   
*********************************************************************************************************/
void ADC_Init(void)
{
    PLLSet();                                                           /*  设置PLL                     */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);		
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC);                          /*  使能ADC模块时钟             */
    SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS);                         /*  125KSps采样率               */
    ADCSequenceDisable(ADC_BASE, 0);                                    /*  禁能0                       */
  
    IntMasterEnable();                                                  /*  使能处理器中断              */
    IntEnable(INT_ADC0);                                                /*  使能AD中断                  */
    ADCIntEnable(ADC_BASE, 0);                                          /*  使能AD中断模块              */

    ADC_Trigger();
    
    /*
     *  确定ADC的采样步数,确定每一步的采样通道,并在每一通道采样后产生中断
     */
                                 
    ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_CH0 | ADC_CTL_IE);
    ADCSequenceStepConfigure(ADC_BASE, 0, 1, ADC_CTL_CH1 | ADC_CTL_IE);
    ADCSequenceStepConfigure(ADC_BASE, 0, 2, ADC_CTL_TS  | ADC_CTL_IE | ADC_CTL_END);
    
    ADCHardwareOversampleConfigure(ADC_BASE,16);                        /*  为对16个采样进行平均计算    */

    ADCSequenceEnable(ADC_BASE, 0);	                                    /*  使能采样序列0               */
  /* ADCSequenceEnable(ADC_BASE, 1);	*/                              /*  使能采样序列1               */
}

/*********************************************************************************************************
** Function name:      ADC_Sequence_0_ISR
** Descriptions:       A/D中断服务程序
** input parameters:   无
** output parameters:  无
** Returned value:     无   
*********************************************************************************************************/
void ADC_Sequence_0_ISR(void)
{
    ADCIntClear(ADC_BASE,0);                                            /*  清除中断标志位              */
    while (!(HWREG(ADC_BASE + 0X04C) & 0X100)) {
        ADCSequenceDataGet(ADC_BASE, 0, &ulData);                       /*  读出10位转换结果            */
        ulData = ((ulData & 0x3ff) * 1000 * 3) / 1023;
        Charge_Val[flag_Charge] = ulData;
        flag_Charge++;
        if ( flag_Charge >= 3) {
            flag_Charge = 0;
            flag_ADC_finish = 1;                                        /*  A/D转换完成标志位           */
        }
    }
}
/*********************************************************************************************************
 END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -