打印
[N32G03x]

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

[复制链接]
660|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
发顺丰顺丰|  楼主 | 2022-11-1 08:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现象:芯片计算出来的有效值波动较大,最大最小值偏差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性能跟不上。

使用特权

评论回复
5
朝生| | 2022-11-1 17:09 | 只看该作者
你可以尝试把输入频率调小一些看看误差会不会减小。

使用特权

评论回复
6
Pretext| | 2022-11-1 17:09 | 只看该作者
内置ADC本来不稳定,不过误差这么大还是有点问题的。

使用特权

评论回复
7
xch| | 2022-11-1 21:13 | 只看该作者
采样方式:软件触发,0.625ms使能1次,共采集16次?  为啥不采集32次?

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

使用特权

评论回复
8
xch| | 2022-11-1 21:37 | 只看该作者
发顺丰顺丰 发表于 2022-11-1 12:40
交流信号是0.4V,直流偏置1.25V

是理论值还是测量值?

使用特权

评论回复
9
发顺丰顺丰|  楼主 | 2022-11-2 08:32 | 只看该作者
xch 发表于 2022-11-1 21:37
是理论值还是测量值?

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

使用特权

评论回复
10
发顺丰顺丰|  楼主 | 2022-11-2 08:34 | 只看该作者
xch 发表于 2022-11-1 21:13
采样方式:软件触发,0.625ms使能1次,共采集16次?  为啥不采集32次?

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

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

使用特权

评论回复
11
一周一天班| | 2022-11-3 10:25 | 只看该作者
VDDA(基准)不稳?

使用特权

评论回复
12
xch| | 2022-11-3 17:30 | 只看该作者
发顺丰顺丰 发表于 2022-11-2 08:34
16点 32点都试过,也不稳,调整了一下,误差在8%左右,用其它单片机可以做到1% ...

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

使用特权

评论回复
13
AloneKaven| | 2022-11-4 22:14 | 只看该作者
把输入频率调小一些看看

使用特权

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

本版积分规则

6

主题

18

帖子

0

粉丝