/******************************************************************************
;  *   	@MCU				 : MC51F003A4
;  *   	@Create Date         : 2020.01.02
;  *   	@Author/Corporation  : Martin/SinoMCU
;  *   	@晟矽微技术支持QQ群   : 814641858
;  *    @晟矽微官方论坛       : http://bbs.sinomcu.com/
;  *   	@Copyright           : 2020 SINOMCU Corporation,All Rights Reserved.
;  *----------------------Abstract Description---------------------------------
;  *			          ADC配置                              		
******************************************************************************/

#include "ADC.h"

/************************************************
;  *    @Function Name       : ADC_UserInit
;  *    @Description         : 用户AD配置
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
void ADC_UserInit(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_clock_division = ADC_CKS_DIV_128;          //128分频
    ADC_InitStructure.ADC_sam_time = ADC_SAM_TIME_15ADCLK; //15个时钟
    ADC_InitStructure.ADC_IOx = ADC_IOP22|ADC_IOP23|ADC_IOP24|ADC_IOP25;//P22 23 24 25
    ADC_InitStructure.ADC_chx = ADC_CH0;//通道0 
    ADC_InitStructure.ADC_data_sel = ADC_DATA_SEL_4H_8L;   //高4 低8
    ADC_InitStructure.ADC_vref = ADC_VREF_2V;              //参考电压 2V
    ADC_InitStructure.ADC_interrupt = DISABLE;             //不使能中断
//    ADC_InitTypeDef.ADC_interrupt_priority=DEF_LOW;       //中断优先级
    ADC_Init(&ADC_InitStructure); //按照以上参数初始化
	ADC_Cmd(ENABLE);
}
// /************************************************
// ;  *    @Function Name       : GET_ADCValue
// ;  *    @Description         : 启动一次转换
// ;  *    @IN_Parameter      	 :  通道
// ;  *    @Return parameter    : ADC值
// ;  ***********************************************/
// uint16_t GET_ADCValue(uint8_t CH)
// {
//     uint16_t temp=0;
//     ADC_ChannelConfigure(CH); //设置通道            //如果通道没有改变可以屏蔽此处
//     CLR_ADEOC();              //启动转换
//     while (!(ADCCR0 & ADC_ADEOC_Addr))
//         ;                                         //等待转换完成
//     return ADC_Value_4H_8L();
// }
/************************************************
;  *    @Function Name       : GET_ADCValue
;  *    @Description         : 启动一次转换
;  *    @IN_Parameter      	 :  通道
;  *    @Return parameter    : ADC值
;  ***********************************************/
uint16_t GET_ADCValue(void)
{
    ADC_Start_One_Conversion(); //启动转换
    while (!(ADC_Get_FlagStatus())); //等待转换完成
    return ADC_Value_4H_8L();
}
/************************************************
;  *    @Function Name       : ADC_Get_Value_Average
;  *    @Description         : 连续转换 求平均
;  *    @IN_Parameter      	 : 通道
;  *    @Return parameter    : 返回ADC的值
;  ***********************************************/
uint16_t ADC_Get_Value_Average(uint8_t CH)
{
    uint8_t channel = 0;
    uint32_t tmpBuff = 0;
    uint16_t AdcMAX = 0;
    uint16_t AdcMIN = 0xffff;
    uint16_t temp_value = 0;
    ADC_Channel_Configure(CH); //设置通道            //如果通道没有改变可以屏蔽此处
    for (channel = 0; channel < 20; channel++)
    {
        temp_value = GET_ADCValue();
        if (channel < 2)
            continue; //丢弃前两次采样的
        if (temp_value > AdcMAX)
            AdcMAX = temp_value; //最大
        if (temp_value < AdcMIN)
            AdcMIN = temp_value; //最小
        tmpBuff += temp_value;
    }
    tmpBuff -= AdcMAX;           //去掉一个最大
    tmpBuff -= AdcMIN;           //去掉一个最小
    temp_value = (tmpBuff >> 4); //除以16,取平均值
    return temp_value;
}



/**************************** end of file *********************************************/