高级会员

- 积分
- 763
- 金钱
- 763
- 注册时间
- 2013-4-23
- 在线时间
- 119 小时
|
5金钱
程序是原子的AD采样程序,没动,开发板是战舰开发板。 只是把AD接口接入了一个电位器,电位器两端分别接电源跟地。数值在10次平均值滤波的时候跳动幅度是20以内,100是10以内,200次就变成了上下浮动三,并且频率慢了许多。
问:怎么样才能让AD采样极为精确。基本不变?
看了一些卡尔曼的代码。太深奥没看懂。移植了几段,成功过一段,效果好但是太慢。快了以后效果依旧不好。所以还是想用点大家常用的办法滤波。
这个会是板子的问题么?换个通道会解决这个问题么?
//主函数中的内容
int main(void)
{
u8 buff[100];
u16 adc = 0;
float adc1 = 0;
delay_init();
NVIC_Configuration();
uart_init(9600);
Adc_Init();
OLED_InitIO();
OLED_Init();
BACK_COLOR =0x00;
POINT_COLOR = 0x0f;
while(1)
{
adc = Get_Adc_Average(ADC_Channel_1,10);
sprintf((char *)buff," ADC:%d ",adc);
LCD_ShowString(0,1,buff);
}
}
//??????ADC
//???????????????ò?¨??????
//???????????????¨??0~3
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE); //????ADC1?¨???±??
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //?è??ADC·????ò×?6 72M/6=12,ADC×??ó?±??????????14M
//PA1 ×÷???????¨??????????
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //????????????
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //????ADC1,?????è ADC1 ???????????÷???è???±????
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC?¤×÷????:ADC1??ADC2?¤×÷??????????
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //????×????¤×÷?????¨??????
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //????×????¤×÷??????×???????
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //×??????í??????????????·?????
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC??????????
ADC_InitStructure.ADC_NbrOfChannel = 1; //???ò???????ò×?????ADC?¨????????
ADC_Init(ADC1, &ADC_InitStructure); //?ù??ADC_InitStruct?????¨???????????????èADCx???????÷
ADC_Cmd(ADC1, ENABLE); //???????¨??ADC1
ADC_ResetCalibration(ADC1); //??????????×?
while(ADC_GetResetCalibrationStatus(ADC1)); //??????????×??á??
ADC_StartCalibration(ADC1); //????AD??×?
while(ADC_GetCalibrationStatus(ADC1)); //??????×??á??
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //???????¨??ADC1???í??×???????????
}
//????ADC??
//ch:?¨???? 0~3
u16 Get_Adc(u8 ch)
{
//?è?????¨ADC?????ò×é?¨?????????ò???????ù?±??
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC?¨??,???ù?±????239.5????
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //???????¨??ADC1???í??×???????????
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//????×????á??
return ADC_GetConversionValue(ADC1); //·???×??ü????ADC1???ò×é??×????á??
}
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}
|
最佳答案
查看完整内容[请看2#楼]
首先,板子上的电源本来就不是很干净,噪声比较大,所以ADC采样结果肯定会有些波动;
其次,你的电位器引线这样散得很开,很容易感应到市电线路辐射的电磁场,所以工频干扰会很重,ADC结果肯定会存在50Hz周期波动;
要想得到较为稳定的ADC结果,可以考虑以下办法:
1、电位器引线紧密绞在一起;
2、电位器不要用板上的电源,可以用外部独立的低噪声电压基准,或者简单点就用2节干电池或一节锂电池,这样的电源才会比较干净没有噪 ...
|