在ADC中断中使用位移位和阵列进行平均

在ADC中断中使用位移位和阵列进行平均,c,average,interrupt,microcontroller,mplab,C,Average,Interrupt,Microcontroller,Mplab,我有一个ADC中断,我想对通道(ADCBUF0)进行8次采样,然后取采样的平均值。我的代码利用标志跳出if语句。代码编译,我的变量在别处初始化。有人能告诉我为什么我没有收到SpeedADC的值吗 ///////Global//////////// int SpeedADCcount=0; ///////////////////////// SpeedADCflag=1; if(SpeedADCflag==1) //The following is meant to take a

我有一个ADC中断,我想对通道(ADCBUF0)进行8次采样,然后取采样的平均值。我的代码利用标志跳出if语句。代码编译,我的变量在别处初始化。有人能告诉我为什么我没有收到SpeedADC的值吗

///////Global////////////
int SpeedADCcount=0;
/////////////////////////

SpeedADCflag=1;
    if(SpeedADCflag==1)     //The following is meant to take a an average of the incoming ADC voltages
    {
        SpeedADCcount++;
        for(i = SpeedADCcount; i < 16; i++)
        {
            while(!ADCON1bits.SAMP);    //Sample Done?          
            ADCON1bits.SAMP=0;          //Start Converting
            while(!ADCON1bits.DONE);    //Conversion Done? Should be on next Tcy cycle
            SpeedADCarray[i] = ADCBUF0;
            SpeedADCflag=0;
        }
    }
    if(SpeedADCcount==15)
    {

        SpeedADC=SpeedADCarray[i]>>4;
        SpeedADCcount=0;
        // Re-enable the motor if it was turned off previous
        if((SpeedADC>246) && Flags.RunMotor==0){RunMotor();}

        /*Go through another stage of "filtering" for any analog input voltage below 1.25volts
///Global////////////
int SpeedADCcount=0;
/////////////////////////
SpeedADCflag=1;
if(SpeedADCflag==1)//以下是输入ADC电压的平均值
{
SpeedAccount++;
对于(i=SpeedADAccount;i<16;i++)
{
而(!ADCON1bits.SAMP);//样本完成了吗?
ADCON1bits.SAMP=0;//开始转换
而(!ADCON1bits.DONE);//转换完成?应在下一个Tcy周期中
速度adcarray[i]=ADCBUF0;
SpeedADCflag=0;
}
}
如果(SpeedADCcount==15)
{
SpeedADC=SpeedADCarray[i]>>4;
SpeedADAccount=0;
//如果先前已关闭电机,则重新启用电机
if((SpeedADC>246)&&Flags.RunMotor==0){RunMotor();}
/*对于任何低于1.25伏的模拟输入电压,进行另一阶段的“滤波”

您需要获得正确的降档量(以避免分割),例如8->3、16->4等。对于8个样本,您只需要降档3(3位)

您需要将所有值相加到一个值中,而不是将它们放在单独的数组项中

SpeedADCarray += ADCBUF0;  /* accumulate in a single integer, not an array */

您需要获得正确的降档量(以避免分割),例如8->3、16->4等。对于8个样本,您只需要降档3(3位)

您需要将所有值相加到一个值中,而不是将它们放在单独的数组项中

SpeedADCarray += ADCBUF0;  /* accumulate in a single integer, not an array */

您需要获得正确的降档量(以避免分割),例如8->3、16->4等。对于8个样本,您只需要降档3(3位)

您需要将所有值相加到一个值中,而不是将它们放在单独的数组项中

SpeedADCarray += ADCBUF0;  /* accumulate in a single integer, not an array */

您需要获得正确的降档量(以避免分割),例如8->3、16->4等。对于8个样本,您只需要降档3(3位)

您需要将所有值相加到一个值中,而不是将它们放在单独的数组项中

SpeedADCarray += ADCBUF0;  /* accumulate in a single integer, not an array */

你在哪里计算平均值?我假设平均值将被定义为SpeedADC=SpeedADCarray[I]>>SpeedADAccount,它将你的一个样本除以2^SpeedADAccount(其中^是“的幂”)。如果要除法,请除法,不要移位。如果除数是2的幂,编译器应该优化为移位。我已经更改了它,但如何获得它,以便每次中断16次时都对数组进行采样并放入数组,然后在使用数组中的16个值?您在哪里计算平均值?我假设平均值将被定义为SpeedADC=SpeedADCarray[I]>>SpeedADAccount,它将您的一个样本除以2^SpeedADAccount(其中^是“的幂”)。如果要除法,请除法,不要移位。如果除数是2的幂,编译器应该优化为移位。我已经更改了它,但如何获得它,以便每次中断16次时都对数组进行采样并放入数组,然后在使用数组中的16个值?您在哪里计算平均值?我假设平均值将被定义为SpeedADC=SpeedADCarray[I]>>SpeedADAccount,它将您的一个样本除以2^SpeedADAccount(其中^是“的幂”)。如果要除法,请除法,不要移位。如果除数是2的幂,编译器应该优化为移位。我已经更改了它,但如何获得它,以便每次中断16次时都对数组进行采样并放入数组,然后在使用数组中的16个值?您在哪里计算平均值?我假设平均值将被定义为SpeedADC=SpeedADCarray[I]>>SpeedADAccount,它将您的一个样本除以2^SpeedADAccount(其中^是“的幂”)。如果要除法,请除法,不要移位。如果除数是2的幂,编译器应该优化为移位。我已经更改了它,但如何获得它,以便每次中断16次时都对数组进行采样并放入数组,然后在使用数组中有16个值?