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
采集的是多大的电压
交流信号是0.4V,直流偏置1.25V 感觉是输入信号频率太高导致的,50Hz的正弦波,说实话用内置ADC性能跟不上。 你可以尝试把输入频率调小一些看看误差会不会减小。 内置ADC本来不稳定,不过误差这么大还是有点问题的。 采样方式:软件触发,0.625ms使能1次,共采集16次?为啥不采集32次?
国产ADC有毛病的。用完整周期数据可以比较好过滤。 发顺丰顺丰 发表于 2022-11-1 12:40
交流信号是0.4V,直流偏置1.25V
是理论值还是测量值? xch 发表于 2022-11-1 21:37
是理论值还是测量值?
测量值,直流偏置纹波10mV左右,交流信号也是很稳 xch 发表于 2022-11-1 21:13
采样方式:软件触发,0.625ms使能1次,共采集16次?为啥不采集32次?
国产ADC有毛病的。用完整周期数据可 ...
16点 32点都试过,也不稳,调整了一下,误差在8%左右,用其它单片机可以做到1% VDDA(基准)不稳? 发顺丰顺丰 发表于 2022-11-2 08:34
16点 32点都试过,也不稳,调整了一下,误差在8%左右,用其它单片机可以做到1% ...
将交流电压改成0,看看直流电压采集准不准 把输入频率调小一些看看
页:
[1]