打印
[STM8]

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

[复制链接]
3138|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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


使用特权

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

使用特权

评论回复
板凳
wailian1265k|  楼主 | 2021-6-22 23:15 | 只看该作者
/**************************************************************************
* 函数名: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 <data_len; j++)
                {
                        if(data_in[i] < data_in[j])
                        {
                                temp = data_in[j];
                                data_in[j] = data_in[i];
                                data_in[i] = temp;
                        }
                }
        }
}
/**************************************************************************
* 函数名:ADC_GetConversionValue
* 描述  :获取ADC转换结果
* 输入  :无
*
* 输出  :无
* 返回  :无
* 调用  :内部调用
*************************************************************************/
uint16_t ADC_GetConversionValue(void)
{
  uint16_t value,temph;        
  uint8_t templ;      
  
  ADC1_StartConversion();
  // 定义templ存储低8位数据  temph存储高8位数据  
  while(!(ADC1->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;
}

使用特权

评论回复
地板
ldxepthnn| | 2021-6-29 16:15 | 只看该作者
不错的方法,谢谢,学习一下。

使用特权

评论回复
5
elephant00| | 2021-6-30 16:22 | 只看该作者
不错的方法,顶一下

使用特权

评论回复
6
菜鸟的第一步| | 2021-6-30 16:50 | 只看该作者
我当时用STM32F103使用ADC采样也采用的冒泡算法,对数据去杂很好用

使用特权

评论回复
7
张教官| | 2021-8-12 07:53 | 只看该作者
ReadInputAdc >>= 2; 是什么意思, ReadInputAdc 这个是库函数吗?如果不是,请问是什么类型的变量。

使用特权

评论回复
8
hhhxj| | 2021-10-11 15:36 | 只看该作者
本帖最后由 hhhxj 于 2021-10-11 15:37 编辑
张教官 发表于 2021-8-12 07:53
ReadInputAdc >>= 2; 是什么意思, ReadInputAdc 这个是库函数吗?如果不是,请问是什么类型的变量。 ...

    ReadInputAdc = temp[3]+temp[4]+temp[5]+temp[6];

    ReadInputAdc >>= 2;        //    /4   他算了4个数的和  不得除以4取平均值吗?   他是去掉两个小的数,2个大的数  剩下的求和  取平均

使用特权

评论回复
9
小叶三千| | 2021-10-12 08:47 | 只看该作者
感谢分享,很有用的ADC减小误差的算法,以后也采用冒泡算法试一试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

372

帖子

0

粉丝