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;
}
C_sharp_Ultraschallsensor.zip
Basis des Programmquellcodes