金牌会员
 
- 积分
- 1921
- 金钱
- 1921
- 注册时间
- 2014-6-27
- 在线时间
- 1015 小时
|
发表于 2014-10-21 16:14:39
|
显示全部楼层
回复【8楼】jiutianshenjian:
---------------------------------
可以同时开多个通道吧,就算不能,周期性扫描就行了。转换完成你要做数据处理,怎样处理,看你自己了。
/*
*/
extern u8 adc_convert(u8 ch,u16 *adcValue,u16 adcTimes,u16 abortVal,u8 countVal)
{
u16 tmp=0;
u8 j;
static u16 *adc=NULL;
static u8 adcCount=0;
static u8 adcTimeCount=0;
if(adcCount<countVal)
{
adcCount++;
}
else if(adcCount==countVal)
{
if(adc==NULL)
{
adc=(u16*)calloc(adcTimes,sizeof(u16));
}
if(adc!=NULL)
{
ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch
ADC1->SQR3|=ch;
ADC1->CR2|=1<<22; //启动规则转换通道
adcCount++;
}
}
else
{
if((ADC1->SR&(1<<1)))
{
*(adc+adcTimeCount)=ADC1->DR;
adcTimeCount++;
adcCount=0;
if(adcTimeCount==adcTimes)
{
for(adcCount=0;adcCount<adcTimes-1;adcCount++)//排序
{
for(j=adcCount+1;j<adcTimes;j++)
{
if(*(adc+adcCount)>*(adc+j))//升序排列
{
tmp=*(adc+adcCount);
*(adc+adcCount)=*(adc+j);
*(adc+j)=tmp;
}
}
}
tmp=0;
for(adcCount=abortVal;adcCount<adcTimes-abortVal;adcCount++)
tmp+=*(adc+adcCount);
*adcValue=tmp/(adcTimes-2*abortVal);
*adcValue/=4;
if(adc!=NULL)
{
free(adc);
adc=NULL;
}
adcTimeCount=0;
adcCount=0;
return 1;
}
}
}
return 0;
}
给个函数给你参考,这个函数没个节拍节拍扫描一次,返回1说明数据处理完成,我的采用去头尾和取平均值的方法进行数据处理。你用的时候,多通道,传递通道数就行了。> |
|