发顺丰顺丰 发表于 2022-11-1 08:25

N32G031 ADC采样50Hz正弦波有效值波动严重

现象:芯片计算出来的有效值波动较大,最大最小值偏差59%。抓了ADC输入信号是稳定的。均方根算法验证过是正确的,带入固定数据算得也是对的。采样方式:软件触发,0.625ms使能1次,共采集16次,在定时器中使能 ADC_EnableSoftwareStartConv(ADC,ENABLE);
AD读取方式:AD中断里读取ADC_GetDat(ADC);


初始化:
void ADC_Initial(void)
{

          ErrorStatus HSIStartUpStatus;
          ADC_InitType ADC_InitStructure;
      
    NVIC_InitType NVIC_InitStructure;

    /* Configure and enable ADC interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = ADC_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority         = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);      
      
      
    /* Enable ADC clocks */
    RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC, ENABLE);
    /* enable ADC 1M clock */
    RCC_EnableHsi(ENABLE);
    /* Wait til1 HSI is ready*/
    HSIStartUpStatus = RCC_WaitHsiStable();
    if(HSIStartUpStatus == SUCCESS)
    {
    }
    else
    {
      /* If HSI fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error*/
      /* Go to infinitel1oop*/
      while(1)
      {
      }
    }
    RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSI, RCC_ADC1MCLK_DIV8);
    /* RCC_ADCHCLK_DIV16*/
    ADC_ConfigClk(ADC_CTRL3_CKMOD_AHB, RCC_ADCHCLK_DIV16);      
      

    /* ADC configuration ------------------------------------------------------*/
    ADC_InitStructure.MultiChEn      = ENABLE;
    ADC_InitStructure.ContinueConvEn = DISABLE;
    ADC_InitStructure.ExtTrigSelect= ADC_EXT_TRIGCONV_NONE;
    ADC_InitStructure.DatAlign       = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber      = 1;
    ADC_Init(ADC, &ADC_InitStructure);

    /* ADC regular channels configuration */
    ADC_ConfigRegularChannel(ADC, ADC_CH_4_PA4, 1, ADC_SAMP_TIME_29CYCLES5);
//    ADC_ConfigRegularChannel(ADC, ADC_CH_5_PA5, 2, ADC_SAMP_TIME_29CYCLES5);

    /* Regular discontinuous mode channel number configuration */
    ADC_ConfigDiscModeChannelCount(ADC, 1);
    /* Enable regular discontinuous mode */
    ADC_EnableDiscMode(ADC, ENABLE);
      
    /* Enable interrupt */
    ADC_ConfigInt(ADC, ADC_INT_ENDC, ENABLE);
               
                ADC_EnableVrefint(ENABLE);

    /* Enable ADC */
    ADC_Enable(ADC, ENABLE);

    /*wait ADC is ready to use*/
    while(!ADC_GetFlagStatusNew(ADC, ADC_FLAG_RDY))
      ;
    /*wait ADC is powered on*/
    while(ADC_GetFlagStatusNew(ADC, ADC_FLAG_PD_RDY))
      ;      
}

sy12138 发表于 2022-11-1 10:05

采集的是多大的电压

发顺丰顺丰 发表于 2022-11-1 12:40

sy12138 发表于 2022-11-1 10:05
采集的是多大的电压

交流信号是0.4V,直流偏置1.25V

朝生 发表于 2022-11-1 17:07

感觉是输入信号频率太高导致的,50Hz的正弦波,说实话用内置ADC性能跟不上。

朝生 发表于 2022-11-1 17:09

你可以尝试把输入频率调小一些看看误差会不会减小。

Pretext 发表于 2022-11-1 17:09

内置ADC本来不稳定,不过误差这么大还是有点问题的。

xch 发表于 2022-11-1 21:13

采样方式:软件触发,0.625ms使能1次,共采集16次?为啥不采集32次?

国产ADC有毛病的。用完整周期数据可以比较好过滤。

xch 发表于 2022-11-1 21:37

发顺丰顺丰 发表于 2022-11-1 12:40
交流信号是0.4V,直流偏置1.25V

是理论值还是测量值?

发顺丰顺丰 发表于 2022-11-2 08:32

xch 发表于 2022-11-1 21:37
是理论值还是测量值?

测量值,直流偏置纹波10mV左右,交流信号也是很稳

发顺丰顺丰 发表于 2022-11-2 08:34

xch 发表于 2022-11-1 21:13
采样方式:软件触发,0.625ms使能1次,共采集16次?为啥不采集32次?

国产ADC有毛病的。用完整周期数据可 ...

16点 32点都试过,也不稳,调整了一下,误差在8%左右,用其它单片机可以做到1%

一周一天班 发表于 2022-11-3 10:25

VDDA(基准)不稳?

xch 发表于 2022-11-3 17:30

发顺丰顺丰 发表于 2022-11-2 08:34
16点 32点都试过,也不稳,调整了一下,误差在8%左右,用其它单片机可以做到1% ...

将交流电压改成0,看看直流电压采集准不准

AloneKaven 发表于 2022-11-4 22:14

把输入频率调小一些看看
页: [1]
查看完整版本: N32G031 ADC采样50Hz正弦波有效值波动严重