Quellcode

 

Ausschnitt aus main.c aus dem Quellcode




//Bit Setzen. (Puls)
GPIO_WriteBit(GPIOD, GPIO_Pin_6, Bit_SET);


//20µs Pulseweite

Delay(20);


//Bit Rücksetzen. Pulse ende
GPIO_WriteBit(GPIOD, GPIO_Pin_6, Bit_RESET);


//Schleife für die steigende Flanke des Impulses
while(ts==1 && TIM_GetCounter(TIM2)<100000)
{
    if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12) == Bit_SET)
    {
        TIM_Cmd(TIM2,ENABLE);
        TIM_SetCounter(TIM2,0);
        ts=2;
    }
}

//Schleife für die abfallende Flanke des Impulses
while(tr==1 && TIM_GetCounter(TIM2)<100000)
{
    if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12) == Bit_RESET)
    {
        //Eigentliche Formel (t * 344[m/s] / 2)
        //Für die Messung in mm Bereich Stellt man den Timer
        //von 10KH zur 100KH und dividiert man noch durch 100
        //Aus der zusammengesetzten Zahlen ergibt sich ein Vorfaktor von :0.172
        //Aufgrund der Ungenauigkeit erfolgt eine Kalibrierung
        //und der Vorfaktor 0.172 wird veraendert

distance= TIM_GetCounter(TIM2)*0.204-(2*20/TIM_GetCounter(TIM2));
        tr=2;
    }
}

Delay(20000);
}

 

Kalibrierung

 

Genauigkeiten in cm
Enfernung in cm Ohne kalibrierung Mit Kalibrierung
5 0 2
120   0
200 30 0

 

 

Weitere Verbesserungen

s=Entfernung

t=Zeitdifferenz

    

 

 Zweimaliges Glätten

 

C-Code


if(z==1)
{
    g1=distance;
}
if (z==2)
{
    g2=distance;
}
if (z==3)
{
    g3=distance;
}
if (z==4)
{
    g4=distance;
}
if (z==5)
{
    g5=distance;
}
if (z==1){n_ultra_t.us[1] = (g2+g3*2+g4*3+g5*2+g1)/9;}
if (z==2){n_ultra_t.us[1] = (g3+g4*2+g5*3+g1*2+g2)/9;}
if (z==3){n_ultra_t.us[1] = (g4+g5*2+g1*3+g2*2+g3)/9;}
if (z==4){n_ultra_t.us[1] = (g5+g1*2+g2*3+g3*2+g4)/9;}
if (z==5){n_ultra_t.us[1] = (g1+g2*2+g3*3+g4*2+g5)/9;}

z++;
if (z==6)
{
    z=1;
}

 

 

STM324F_Ultraschall_Code.zip

C_sharp_Ultraschallsensor.zip
Basis des Programmquellcodes