#include "adc.h"

#include "usart.h"
//#include "can.h"



/*******************************************************************************
* �� �� ��         : ADCx_Init
* ��������		   : ADC��ʼ��
* ��    ��         : ��
* ��    ��         : ��
*******************************************************************************/
void ADCx_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; //����ṹ�����
    ADC_InitTypeDef       ADC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);

    RCC_ADCCLKConfig(RCC_PCLK2_Div6);//����ADC��Ƶ����6 72M/6=12,ADC���ʱ�䲻�ܳ���14M

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//ADC
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;	//�����
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;//��ɨ��ģʽ
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//�ر�����ת��
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//��ֹ������⣬ʹ����������
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//�Ҷ���
    ADC_InitStructure.ADC_NbrOfChannel = 1;//1��ת���ڹ��������� Ҳ����ֻת����������1
    ADC_Init(ADC1, &ADC_InitStructure);//ADC��ʼ��

    ADC_Cmd(ADC1, ENABLE);//����ADת����

    ADC_ResetCalibration(ADC1);//����ָ����ADC��У׼�Ĵ���
    while(ADC_GetResetCalibrationStatus(ADC1));//��ȡADC����У׼�Ĵ�����״̬

    ADC_StartCalibration(ADC1);//��ʼָ��ADC��У׼״̬
    while(ADC_GetCalibrationStatus(ADC1));//��ȡָ��ADC��У׼����

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ʹ�ܻ���ʧ��ָ����ADC������ת����������
}

/*******************************************************************************
* �� �� ��         : Get_ADC_Value
* ��������		   : ��ȡͨ��ch��ת��ֵ��ȡtimes��,Ȼ��ƽ��
* ��    ��         : ch:ͨ�����
					 times:��ȡ����
* ��    ��         : ͨ��ch��times��ת�����ƽ��ֵ
*******************************************************************************/
u16 Get_ADC_Value(u8 ch)
{
    //����ָ��ADC�Ĺ�����ͨ����һ�����У�����ʱ��
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);	//ADC1,ADCͨ��,239.5������,��߲���ʱ�������߾�ȷ��

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ʹ��ָ����ADC1������ת����������
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//�ȴ�ת������
    return ADC_GetConversionValue(ADC1);
}





/**
  * @brief :�ж�ADC���ڻ������Ƿ���
  * @param :void
  * @retval :����1:�� ����0:����
  * @usage:if(ADC_QUEUE_FULL()==1)...	if(ADC_QUEUE_FULL()==0)...
  */
//uint8_t  ADC_QUEUE_FULL(void)
//{
//    return (uint8_t)(((ADC_QUEUE_REAR+1)% ADC_MAX_QUEUE_BUF_SIZE)==ADC_QUEUE_FRONT);
//}


///**
//  * @brief	:�ж�ADC���ڻ������Ƿ��
//  * @param	:void
//  * @retval	:����1:�� ����0:�ǿ�
//  * @usage	:if(ADC_QUEUE_EMPTY()==1)...	if(ADC_QUEUE_EMPTY()==0)...
//  */
//uint8_t ADC_QUEUE_EMPTY(void)
//{
//    return (uint8_t)(ADC_QUEUE_REAR==ADC_QUEUE_FRONT);
//}

/**
  * @brief	:��ADC���ڻ������ڴ���һ���ֽ�����
  * @param	ch: uint8_t���ͣ�д��ch
  * @retval	:1,��������д��ʧ�ܣ�0��д��ɹ�
  * @usage	:ADC_PUSH_QUEUE(0x3f)
  */
//uint8_t ADC_PUSH_QUEUE(uint8_t ch)
//{
//    if(ADC_QUEUE_FULL())
//    {
////        printf("queue full!\n");
//        return 1;
//    }
//    ADC_QUEUE_REAR=(ADC_QUEUE_REAR+1) % ADC_MAX_QUEUE_BUF_SIZE;
//    ADC_QUEUE_BUF[ADC_QUEUE_REAR]=ch;
//		 Can_Send_Msg(&ch,1);
//    return 0;
//}
/**
  * @brief	:��ADC���ڻ�����ȡ��һ���ֽ�����
  * @param	:void
  * @retval	:uint8_t ���ͣ���Ϊ�ӻ�����ȡ�����ֽ�
  * @usage	:uint8_t temp;
  * @usage	:temp=ADC_POP_QUEUE();
  */
//uint8_t ADC_POP_QUEUE(void)
//{
//    uint8_t temp;
//    if(ADC_QUEUE_EMPTY())
//    {
////        printf("queue empty!\n");
//        return 1;
//    }
//    ADC_QUEUE_FRONT = (ADC_QUEUE_FRONT+1)%ADC_MAX_QUEUE_BUF_SIZE;
//    temp = ADC_QUEUE_BUF[ADC_QUEUE_FRONT];
//    return temp;
//}

/**
  * @brief	:���ADC���ڻ�����
  * @param	:void
  * @retval	:void
  * @usage	:ADC_CLEAR_QUEUE();
  */
//void ADC_CLEAR_QUEUE(void)
//{
//	ADC_QUEUE_REAR=0;
//	ADC_QUEUE_FRONT=0;
//}