本帖最后由 WATS 于 2016-7-8 09:26 编辑
STM8S的多通道转换,在切换通道时出现波动,搞了好久也没解决,求助。下面是我写采用中值滤波,不知道哪里出了问题,AIN1又收不到数据uint8_t Temp_ADChanl(void)
{
u8 Buffer=0,i=0,j=0;
u16 tem=0;
static u16 buf[N]={0};
static u8 AD_ADON_Flag=1,n=0;
if(ADC1->CR3&0X40)//缓冲区溢出标志位
{
ADC1->CR3&=~0X40;//清除缓冲区标志位
if(AD_ADON_Flag)//通道选择标志位
{
if( n<N )//采用中值滤波
{GPIO_WriteHigh(GPIOC,GPIO_PIN_5);
// TEMPVal0=ADC_GetVal();//获取AD转换的值
buf[n++] = ADC1_GetBufferValue(Buffer);//获取缓冲区的值
ADC1->CR1 |= 0X01; //启动ADC 继续获取AIN0的AD值
ADC1->CR1 |= 0X01; //启动ADC 继续获取AIN0的AD值
}
else
{GPIO_WriteHigh(GPIOC,GPIO_PIN_5);
GPIO_WriteHigh(GPIOE,GPIO_PIN_5);
GPIO_WriteHigh(GPIOC,GPIO_PIN_7);
n=0;
ADC_Init();//AD初始化
ADC1->CSR|=0X01;//切换到通道1
AD_ADON_Flag=0; //通道选择的标志位
for(i=0;i<N-1;i++)
for(j=0;j<N-i;j++)
if(buf[j]>buf[j+1])
{ tem=buf[j]; buf[j]=buf[j+1]; buf[j+1]=tem; }
TEMPVal0 = buf[(N+1)/2];
TEMPVal0=(int)(((float)TEMPVal0/1024)*50); //把电压值扩大10倍 50V
ADC1->CR1 |= 0X01; //启动ADC
ADC1->CR1 |= 0X01; //启动ADC
return 0;
}
}
else//通道选择标志位
{
if( n<N )//采用中值滤波
{
// TEMPVal0=ADC_GetVal();//获取AD转换的值
buf[n++] = ADC1_GetBufferValue(Buffer);//获取缓冲区的值
ADC1->CR1 |= 0X01; //启动ADC 继续获取AIN0的AD值
ADC1->CR1 |= 0X01; //启动ADC 继续获取AIN0的AD值
}
else
{
n=0;
ADC_Init();//AD初始化
ADC1->CSR &=~0X01;//切换到通道0
AD_ADON_Flag=1;
for(i=0;i<N;i++)
for(j=0;j<N-i;j++)
if(buf[j]>buf[j+1])
{ tem=buf[j]; buf=buf[j+1]; buf[j+1]=tem; }
TEMPVal1 = buf[(N+1)/2];
TEMPVal1=(int)(((float)TEMPVal1/1024)*50); //把电压值扩大10倍 50V
ADC1->CR1 |= 0X01; //启动ADC
ADC1->CR1 |= 0X01; //启动ADC
return 0;
}
}
}
return 0;
} |