分享一个stm8s003单片机的ADC转换,附加一个冒泡算法(用于减少误差)

1.先上脚位图,不要问我为什么是stm8f103,stm8f103和stm8s003只有内存的不同。

分享一个stm8s003单片机的ADC转换,附加一个冒泡算法(用于减少误差)_第1张图片

2.上代码,选用PC4(AIN2)为ADC转换引脚,只提供函数,自己选择调用,不追求精度的话可以不要冒泡排序。(划重点:这个单片机是10位的分辩率,所以不要问我为什么公式是实际电压值(voltage) = adc值*参考电压(3.25V)/1024(10位分辨率))

/**************************************************************************
 * 函数名:ADC_conf
 * 描述  :ADC模块初始化
 * 输入  :无
 *
 * 输出  :无
 * 返回  :无 
 * 调用  :外部调用 
 *************************************************************************/
void ADC_conf(u8 chn)
{
    GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT);
	ADC1_DeInit();//ADC1_CONVERSIONMODE_CONTINUOUS
        ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,      //单次转换 
                  ADC1_CHANNEL_2,                  //通道   
                  ADC1_PRESSEL_FCPU_D4,            //预定标器选择 分频器  fMASTER 可以被分频 2 到 18
                  ADC1_EXTTRIG_TIM,                //从内部的TIM1 TRGO事件转换
                  DISABLE,                         //是否使能该触发方式
                  ADC1_ALIGN_RIGHT,                //对齐方式(可以左右对齐)
                  ADC1_SCHMITTTRIG_CHANNEL2,       //指定触发通道   
                  ENABLE);                         //是否使能指定触发通道
        ADC1_Cmd(ENABLE);       
   

}


/****************************************************************************
* 名    称:
* 功    能:对数据进行冒泡排序
* 入口参数:   
* 出口参数:
* 说    明: 
* 调用方法:
****************************************************************************/

void DataFilter(u16 *data_in,u8 data_len)
{
	u16 temp;
	u8 i,j;
	for(i = 0; i < data_len; i++)
	{
		for(j = i+1; j CSR & 0x80));     //等待转换完成
  templ = ADC1->DRL;
  temph = ADC1->DRH;              //读取ADC转换  在左对齐和右对齐模式下 读取数据的顺序不同  参考STM8寄存器.PDFP371          
  
  value = (templ | (temph << 8));   //注意是10位的转换精度 value、temph应为unsigned int 变量
  return  value;
}

/****************************************************************************
* 名    称:
* 功    能:取冒泡排序的10个数组中的中间4个数组,减少误差。
* 入口参数:   
* 出口参数:
* 说    明:
* 调用方法:  call in 10ms 
****************************************************************************/
void ReadInputVoltege(void)
{
  u8 i;
  u16 temp[READ_ADC_LEN];
   
    for(i = 0; i < READ_ADC_LEN-1; i ++)
    {
      adc_input_voltage[i] = adc_input_voltage[i+1];
      temp[i] = adc_input_voltage[i];
    } 
    adc_input_voltage[READ_ADC_LEN-1] = ADC_GetConversionValue(); 
    temp[READ_ADC_LEN-1]  = adc_input_voltage[READ_ADC_LEN-1];
       
    //0-8
    DataFilter(&temp[0],READ_ADC_LEN);
    
    ReadInputAdc = temp[3]+temp[4]+temp[5]+temp[6];
    ReadInputAdc >>= 2;        //    /4
    
}

/****************************************************************************
* 名    称:获取实际电压函数
* 功    能:计算公式:实际电压值(voltage) = adc值*参考电压(3.25V)/1024(10位分辨率)
* 入口参数:   
* 出口参数:
* 说    明:
* 调用方法:  
****************************************************************************/
void DisVoltage(void)
{
   u16 voltage;
      
      voltage =  (ReadInputAdc *325)/1024   ;// 配合一下硬件分压,没有分压值
      voltage =  voltage/100; 
}  

 

你可能感兴趣的:(c语言,单片机)