参考该单片机的数据手册的例程,程序使用如下内容:
static void AdcInitConfig(void)
{
unsigned char i=0;
stc_adc_init_t stcAdcInit;
/* 1. Enable ADC peripheral clock. */
FCG_Fcg3PeriphClockCmd(ADC_PERIPH_CLK, ENABLE);
/* 2. Modify the default value depends on the application. */
(void)ADC_StructInit(&stcAdcInit);
/* 3. Initializes ADC. */
(void)ADC_Init(ADC_UNIT, &stcAdcInit);
/* 4. ADC channel configuration. */
/* 4.1 Set the ADC pin to analog input mode. */
AdcSetPinAnalogMode(u8port,u16pin);
/* 4.2 Enable ADC channels. */
ADC_ChCmd(ADC_UNIT, ADC_SEQ,u8ch , ENABLE);
}
结果发现采集的数据值误差过大。后来改设置为过采样(重点为最后四行代码),可以降低误差。
static void AdcInitConfig(void)
{
unsigned char i=0;
stc_adc_init_t stcAdcInit;
/* 1. Enable ADC peripheral clock. */
FCG_Fcg3PeriphClockCmd(ADC_PERIPH_CLK, ENABLE);
/* 2. Modify the default value depends on the application. */
(void)ADC_StructInit(&stcAdcInit);
/* 3. Initializes ADC. */
(void)ADC_Init(ADC_UNIT, &stcAdcInit);
/* 4. ADC channel configuration. */
/* 4.1 Set the ADC pin to analog input mode. */
AdcSetPinAnalogMode(u8port,u16pin);
/* 4.2 Enable ADC channels. */
ADC_ChCmd(ADC_UNIT, ADC_SEQ, u8ch , ENABLE);
ADC_ConvDataAverageConfig(ADC_UNIT, ADC_AVG_CNT64);
ADC_ConvDataAverageChCmd(ADC_UNIT, u8ch, ENABLE);
ADC_SetSampleMode(ADC_UNIT, ADC_SPL_MD_OVER);
ADC_SetOverSampleShift(ADC_UNIT, ADC_OVER_SPL_SHIFT_2BIT);
}
每隔250us采集一个数据(DMA方式),一个周期采样80个数值。取样的电流越小,波形越阶梯状明显。
原因:采样动作会有一定的电流消耗,过采样比普通采样次数多。除非增加信号的带载能力。或者降低采样次数。