#include "ys32md211.h"
#include "adc.h"
#include "motor.h"
#include "pwm.h"
#include "key.h"
// 用户规则通道ADC(DMA)初始化
unsigned short int AdcBuf[8]={0};
void User_ADC_Channel_Init(void)
{
  DMA_InitTypeDef DMA_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
//  NVIC_InitTypeDef NVIC_InitStructure;
	ADC_InitTypeDef ADC_InitStruct;
  
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  ADC_DeInit(ADC);
  ADC_StructInit(&ADC_InitStruct);
	
  DMA_StructInit(&DMA_InitStructure);

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOA, ENABLE);
  RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOB, ENABLE);
  RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOF, ENABLE);
  //=====================================================
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;   // adc_channel_1  IBUS
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;   // ADC_Channel_2 BAT
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOF, &GPIO_InitStructure);
   ADC_DMACmd(ADC, ENABLE);
  //=====================================================
  // ADC_TempSensorCmd(ENABLE);  //使能温度传感器
  // VREFBUF_Cmd(ENABLE);        //使能vrefbuf
  // VREFBUF_ADC_Config(VREFBUF_ADC_VREFBUF);                //????1.2V???????
   ADC_RegularSequencerLengthConfig(ADC, 2);
   ADC_RegularChannelConfig(ADC, ADC_Channel_1, 1,  ADC_SampleTime_1_5Cycles);    //电流和电压
	 ADC_RegularChannelConfig(ADC, ADC_Channel_1, 2,  ADC_SampleTime_1_5Cycles);    //
//	ADC_RegularChannelConfig(ADC, ADC_Channel_2, 2,  ADC_SampleTime_7_5Cycles);    //温度
//  ADC_RegularChannelConfig(ADC, ADC_Channel_14, 2,  ADC_SampleTime_1_5Cycles);
//  ADC_RegularChannelConfig(ADC, ADC_Channel_15, 3,  ADC_SampleTime_1_5Cycles);

  //=====================================================
  
  DMA_Cmd(DMA_CHANNEL1, DISABLE);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC->DR;       //外设地址
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AdcBuf;                        //内存地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                   //传输方向:外设 -> 内存
  DMA_InitStructure.DMA_BufferSize = 2;                                   //传输长度
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;     //外设递增:NO
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存递增:YES
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //数据宽度:HalfWord
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                      //循环模式:YES
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;                  //优先级:高
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                         //内存-内存:NO
  DMA_Init(DMA_CHANNEL1, &DMA_InitStructure);

  //=====================================================
//  NVIC_InitStructure.NVIC_IRQChannel = DMA_CHANNEL1_IRQn;
//  NVIC_InitStructure.NVIC_IRQChannelPriority = 1; // 配置中断优先级
//  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断
//  NVIC_Init(&NVIC_InitStructure);                 // 中断初始化
//  DMA_ITConfig(DMA_CHANNEL1, DMA_IT_TC, ENABLE);

  //=====================================================
	DMA_RemapConfig(DMA_MAP_CH1, DMA_MAP_ADC, ENABLE);
  ADC_DMACmd(ADC, ENABLE);
  DMA_Cmd(DMA_CHANNEL1, ENABLE);                                       //使能DMA(开始传输)
	
	//ADC_ClearFlag(ADC,ADC_FLAG_OVR);
  //ADC_SoftwareStartConvCmd(ADC);

}


//*************************************************************************//
void adc_config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
	  ADC_InitTypeDef ADC_InitStruct;
    RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOA, ENABLE);
    RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOF, ENABLE);
	 RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOB, ENABLE);
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 ;   
    GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1  ;   
    GPIO_Init(GPIOB, &GPIO_InitStructure);
	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;   
    GPIO_Init(GPIOF, &GPIO_InitStructure);
	 // VREFBUF_ADC_Config(VREFBUF_ADC_VREFBUF);                //配置内部1.2V作为基准电压。
   // VREFBUF_Output_Config(VREFBUF_BUFV_1d2);
   // VREFBUF_Cmd(ENABLE);
	  ADC_DeInit(ADC);
    ADC_StructInit(&ADC_InitStruct);
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_ContinuousConvMode =ADC_ContinuousConvMode_OFF;//ADC_ContinuousConvMode_ON;// ADC_ContinuousConvMode_OFF;//
    ADC_InitStruct.ADC_ScanMode = ADC_ScanMode_ON;  
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_SWSTART;
    ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_EN;//ADC_ExternalTrigConvEdge_None;//
		ADC_InitStruct.ADC_ExternalTrigInjectedConvEdge = ADC_ExternalTrigInjectedConvEdge_EN;
	  ADC_InitStruct.ADC_ExternalTrigInjectedConv =ADC_ExternalTrigInjectedConv_T1_CC4;//ADC_ExternalTrigInjectedConv_JSWSTART;// ADC_ExternalTrigInjectedConv_T1_CC4;
    ADC_Init(ADC, &ADC_InitStruct);
    
    ADC_ClockModeConfig(ADC, ADC_ClockMode_PCLK_Div4);  
	
		
		  // ADC_TempSensorCmd(ENABLE);  //使能温度传感器

    ADC_RegularSequencerLengthConfig(ADC, 1);
  //  ADC_RegularChannelConfig(ADC, ADC_Channel_1, 1,  ADC_SampleTime_5_5Cycles);    //电流和电压
	  ADC_RegularChannelConfig(ADC, ADC_Channel_2, 1,  ADC_SampleTime_5_5Cycles);    //
//    ADC_InjectedSequencerLengthConfig(ADC, 1);
//    ADC_InjectedChannelConfig(ADC, ADC_Channel_11, 1, ADC_SampleTime_11_5Cycles);
    //ADC_InjectedChannelConfig(ADC, ADC_Channel_3, 1, ADC_SampleTime_2_5Cycles);	
		//User_ADC_DMA();
		//ADC_DMACmd(ADC, ENABLE);
		ADC_SoftwareStartConvCmd(ADC);
    ADC_ClearFlag(ADC, ADC_FLAG_EOC);
    ADC_Cmd(ADC, ENABLE);
		
		ADC_ITConfig(ADC, ADC_IT_JEOSEQ, ENABLE);
    //ADC_NVIC_Config();
		  
}
//***************************************************************************//
void adc_int(void)
{
   AD_s.ad_i_inc=0;
	 AD_s.bat_sum=0;
	 AD_s.i_bus_sum=0;
	 AD_s.i_data=0;
	 AD_s.over_i_inc=0;
	 AD_s.over_vdd_inc=0;
	 AD_s.bat_data=0;
	 AD_s.V_ref_data=0;
 	 AD_s.bat_flag=0;
	 AD_s.REV_vdd_inc=0;

}

//****************************************************************************//
void clr_pid_i(void)
{
    AD_s.i_bus_sum=0;
	  AD_s.i_data=0;
	  AD_s.over_i_inc=0;
	  AD_s.ad_i_inc=0;
}
//*****************************************************************************//
void adc_data_process(void)
{
	
	 if (ADC_GetFlagStatus(ADC, ADC_FLAG_EOC))   //电压检测
     {
			    	 
           AD_s.bat_sum += ADC_GetConversionValue(ADC);   
  			   ADC_ClearFlag(ADC, ADC_FLAG_EOC);	 
			     AD_s.ad_bat_inc++;
			     if(AD_s.ad_bat_inc>=16)
			     {
				     AD_s.bat_data=AD_s.bat_sum>>4;
			       AD_s.ad_bat_inc=0;
				     AD_s.bat_sum=0;
						 
			     }
					  
							
     }
		 AD_s.vdd_sample_time++;
		 if(AD_s.vdd_sample_time>10)
		 {
			  AD_s.vdd_sample_time=0;
			  ADC_SoftwareStartConvCmd(ADC);
		
			  
		 }
//	 if (ADC_GetFlagStatus(ADC, ADC_FLAG_JEOC)) //等待转换完成
//	 {
//        AD_s.i_bus_sum += ADC->JDR5;
//		    
//        ADC_ClearFlag(ADC, ADC_FLAG_JEOC);
//        AD_s.ad_i_inc++;
//			  if(AD_s.ad_i_inc>=8)
//			  {
//				   AD_s.i_bus_sum  =AD_s.i_bus_sum>>3;
//					 if(AD_s.i_bus_sum>AD_s.V_ref_data)
//		          AD_s.i_data=(AD_s.i_bus_sum-AD_s.V_ref_data);///10;
//					// else
//						//  AD_s.i_data=0;
//			     AD_s.ad_i_inc=0;
//				   AD_s.i_bus_sum=0;
//			  }
//			
//	 } 
//	 
//   if(ADC_GetFlagStatus(ADC,ADC_FLAG_JEOSEQ) != RESET ) 
//    {
//		
//			 AD_s.i_bus_sum += ADC->JDR5;
//			 ADC_ClearFlag(ADC, ADC_FLAG_JEOSEQ);
//			 AD_s.ad_i_inc++;
//			  if(AD_s.ad_i_inc>=4)
//			  {
//				   AD_s.i_bus_sum  =AD_s.i_bus_sum>>2;
//					 if(AD_s.i_bus_sum>AD_s.V_ref_data)
//		          AD_s.i_data=AD_s.i_bus_sum-AD_s.V_ref_data;
//					// else
//						//  AD_s.i_data=0;
//			     AD_s.ad_i_inc=0;
//				   AD_s.i_bus_sum=0;
//			  }
//			}
//	  if(ADC_GetITStatus(ADC, ADC_IT_JEOSEQ)==SET)
//	  {
//		  ADC_ClearITPendingBit(ADC, ADC_IT_JEOSEQ);
//	  }
		

	
}
//*****************************************************//

void INT_REF_DATA(void)
{
	  uint8_t i=0;
	  ALL_OFF	
	  AD_s.V_ref_data=0;
    ADC->CR2 |=ADC_ExternalTrigInjectedConv_JSWSTART;
	  for(i=0;i<8;i++)
	  {
	    TIMDelay_Nms(10);                      //1
	    ADC_ClearFlag(ADC, ADC_FLAG_JEOSEQ);
	    ADC_ClearITPendingBit(ADC, ADC_IT_JEOSEQ);

      ADC->CR2 |= ADC_CR2_JSWSTART;
      while((ADC->SR & ADC_SR_JEOSEQ) == 0);
			AD_s.V_ref_data+=ADC->JDR5;
		}
	  ADC->CR2 &=~ADC_ExternalTrigInjectedConv_JSWSTART;
		ADC->CR2 |= ADC_ExternalTrigInjectedConv_T1_CC4;
		AD_s.V_ref_data=AD_s.V_ref_data>>3;
	  //return ADC->JDR5; 

}

/***************************************************
函数名称：adc_pwm_process
功能：    AD_s.Pot_data可调电阻采样AD，m_par_set.actual_duty 输出电机速度
备注：    
****************************************************/
void adc_pwm_process(void)
{ 
	 #if(M_Control_SET == 3)
	 if(AD_s.bat_flag!=RESET)
	 {
	    return;
	 }
	 if(read_key_state()==0)
	 {
		  m_par_set.Motor_state=0;//关机
	    return;
	 }
	 if(AD_s.Pot_data<80)
	 {
		  AD_s.adc_off_inc++;
      AD_s.adc_start_inc=0;
	 }
	 else
	 {
		  AD_s.adc_off_inc=0;
		  AD_s.adc_start_inc++;
	 }
	 if(AD_s.adc_off_inc>100)
	 {
		   if((m_par_set.Motor_state>M_PRE_POS)&&(m_par_set.Motor_state<M_STOP))
		     m_par_set.Motor_state=M_STOP;
	 }
	 if(AD_s.adc_start_inc>100)
	 {
	    if((m_par_set.Motor_state==M_INIT)||(m_par_set.Motor_state==M_STOP))
				 m_par_set.Motor_state=M_PRE_POS;
	 }
		 
   m_par_set.actual_duty=AD_s.Pot_data*(PWM_PERIOD-FSS_START_DUTY)/4095;
	 m_par_set.actual_duty+=FSS_START_DUTY;
	 if(m_par_set.actual_duty>=PWM_PERIOD)
		  m_par_set.actual_duty=PWM_PERIOD;
	 if(m_par_set.actual_duty<FSS_START_DUTY)
	    m_par_set.actual_duty=FSS_START_DUTY;
	#endif
}
