找回密码
 立即注册
查看: 389|回复: 7

关于滤除工频干扰的adc采样配置

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-11-26 22:10:12
已绑定手机

1

主题

4

回帖

59

积分

注册会员

积分
59
发表于 2025-11-1 16:06:41 | 显示全部楼层 |阅读模式
1.如何通过aicube配置adc参数

2.adc采样的信号为5v输入测试电压,基准电压接到VCC,通过内部基准1.19V计算得到,硬件连接通过固定上下拉电阻(下拉电阻并联104电容)分压后传入到运放跟随提升阻抗后用ai8H2k32进行采集adc(adc输入电阻1k,电容103),下拉电阻固定为1M,上拉电阻待测试
3.通过采样到的adc值计算被测电阻,
问题点:
1.电源用12V电池供电测试准确,但是用12V开关电源供电被测电阻变化很大
2.通过增加下拉电阻阻值到3.3M,情况有改善,但是反应时间又太长了
3.用开关电源是不是在测试adc信号比较低时干扰较大,导致误差很大,测量小阻值电阻时,由于采集到adc信号幅值较高所以没影响
4.adc滤除工频干扰的配置是如何计算时间的?

回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:705
  • 最近打卡:2026-04-03 00:02:15
已绑定手机

49

主题

2650

回帖

2905

积分

荣誉版主

积分
2905
发表于 2025-11-2 00:28:25 | 显示全部楼层
我常用的方法是用ADC多点均值滤波,
采集点的窗口周期为20ms,比如1kHz的采集频率,可以选用20个点进行均值滤波,
这个窗口正好覆盖一个完整的工频周波,
由于工频交流电是正负半周的周期相同波形完全对称,
因此在这个窗口内,工频带来的干扰几乎由正半周和负半周完全抵消。
实测效果还不错。
~~~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-11-26 22:10:12
已绑定手机

1

主题

4

回帖

59

积分

注册会员

积分
59
发表于 2025-11-2 11:44:17 | 显示全部楼层
晓*** 发表于 2025-11-2 00:28
我常用的方法是用ADC多点均值滤波,
采集点的窗口周期为20ms,比如1kHz的采集频率,可以选用20个点进行均值 ...

可否用aicube配置好的参数截个图或者有没有这样设置的demo函数?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:725
  • 最近打卡:2026-03-30 12:09:34
已绑定手机

97

主题

7246

回帖

1万

积分

超级版主

积分
13798
发表于 2025-11-2 21:03:59 | 显示全部楼层
J_Gr*** 发表于 2025-11-2 11:44
可否用aicube配置好的参数截个图或者有没有这样设置的demo函数?
  1. #define                Filter_N        100        //递推均值滤波队列长度
  2. unsigned int Filter_Value;
  3. unsigned int xdata Filter_Value_Buf[Filter_N];
  4. void Filter(unsigned int temp)
  5. {
  6.         unsigned char count;
  7.         unsigned long Sum;
  8.         Sum=0;
  9.         Filter_Value_Buf[Filter_Addr_Buf]=temp;
  10.         Filter_Addr_Buf++;
  11.         if(Filter_Addr_Buf==Filter_N)
  12.                 Filter_Addr_Buf=0;
  13.         for(count=0;count<Filter_N;count++)
  14.                 Sum+=Filter_Value_Buf[count];
  15.         Filter_Value=(Sum/Filter_N);
  16. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-11-26 22:10:12
已绑定手机

1

主题

4

回帖

59

积分

注册会员

积分
59
发表于 2025-11-5 10:06:57 | 显示全部楼层


帮忙看下这个adc的配置正确吗?现在这个配置接入适配器供电,adc值不稳,接电池供电adc稳定
void ADC_Init(void)
{
    ADC_SetClockDivider(3);             //设置ADC时钟
    ADC_ResultRightAlign();             //设置ADC结果右对齐(12位结果)
    ADC_SetRepeat8Times();              //ADC自动重复转换8次并取平均值

    ADC_SetCSSetupCycles(0);            //设置ADC通道选择建立时间
    ADC_SetCSHoldCycles(1);             //设置ADC通道选择保持时间
    ADC_SetSampleDutyCycles(19);        //设置ADC通道采样时间


    ADC_ActiveChannel(0);               //选择ADC通道
    ADC_Enable();                       //使能ADC功能
}

uint16_t ADC_Sample_Channel(uint8_t channel)
{
    uint8_t count, i, j;
    uint16_t temp;
       
          // 舍弃前2次采样
    for(i = 0; i < 2; i++)
    {
        ADC_ActiveChannel(channel);
        ADC_Start();
        while(!ADC_CheckFlag());
        ADC_ClearFlag();
        delay_us(50);  // 短延时稳定
    }
       
   
    // 连续采样SAMPLE_COUNT次
    for(count = 0; count < SAMPLE_COUNT; count++)
    {
        ADC_ActiveChannel(channel);     // 选择ADC通道
        ADC_Start();                    // 开始ADC转换
        while(!ADC_CheckFlag());        // 等待转换完成
        ADC_ClearFlag();                // 清除标志位
        adc_value_buf[count] = ADC_ReadResult(); // 读取转换结果
//                          delay_us(50);                  // 短延时确保稳定
    }
   
    // 冒泡法排序
    for(j = 0; j < SAMPLE_COUNT - 1; j++)
    {
        for(i = 0; i < SAMPLE_COUNT - 1 - j; i++)
        {
            if(adc_value_buf > adc_value_buf[i + 1])
            {
                temp = adc_value_buf;
                adc_value_buf = adc_value_buf[i + 1];
                adc_value_buf[i + 1] = temp;
            }
        }
    }
   
    return adc_value_buf[(SAMPLE_COUNT - 1) / 2]; // 返回中间值
}

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-11-26 22:10:12
已绑定手机

1

主题

4

回帖

59

积分

注册会员

积分
59
发表于 2025-11-5 10:40:40 | 显示全部楼层
晓*** 发表于 2025-11-2 00:28
我常用的方法是用ADC多点均值滤波,
采集点的窗口周期为20ms,比如1kHz的采集频率,可以选用20个点进行均值 ...

看下5楼的程序配置是否正确?1khz的采样频率是如何计算的呢?通道选择时间+等待采样时间+采样时间的总和定义为1个采样点?然后在间隔1ms采样一次?再累加20次了求平均值?  即adc处理总时间控制在20ms  是这个理解吗?那一个adc处理周期(选择-等待-采样)的时间是忽略不计对吗?

点评

ADC的转换速率远高于1kHz,所以需要用定时器等周期中断来产生1kHz的采样频率,比如每次中断采集一次,累计够20次算一个平均值,所得到的均值为50Hz的刷新频率,和工频同步,这个是最简单的消除工频影响的方法。  详情 回复 发表于 2025-11-5 23:44
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:705
  • 最近打卡:2026-04-03 00:02:15
已绑定手机

49

主题

2650

回帖

2905

积分

荣誉版主

积分
2905
发表于 2025-11-5 23:44:50 | 显示全部楼层
J_Gr*** 发表于 2025-11-5 10:40
看下5楼的程序配置是否正确?1khz的采样频率是如何计算的呢?通道选择时间+等待采样时间+采样时间的总和定 ...

ADC的转换速率远高于1kHz,
所以需要用定时器等周期中断来产生1kHz的采样频率,
比如每次中断采集一次,累计够20次算一个平均值,
所得到的均值为50Hz的刷新频率,和工频同步,
这个是最简单的消除工频影响的方法。
~~~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-11-26 22:10:12
已绑定手机

1

主题

4

回帖

59

积分

注册会员

积分
59
发表于 2025-11-6 13:17:19 | 显示全部楼层
晓*** 发表于 2025-11-5 23:44
ADC的转换速率远高于1kHz,
所以需要用定时器等周期中断来产生1kHz的采样频率,
比如每次中断采集一次,累 ...

好的,懂了我试试,另外我再问一下,如果采样的值比较低的时候是不是还需要加一个直流偏置才比较稳定?
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-4 17:52 , Processed in 0.114897 second(s), 83 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表