ملاحظة معايرة جهاز استشعار موضع الصفحة الرئيسية

تتطلب بعض مستشعرات التسارع معايرة صفر إضافية بعد التركيب على اللوحة. عندما رأيت عدة مصادر مع معايرة مستشعرات التسارع ، حيث تم أخذ المكون G في الاعتبار ببساطة عن طريق طرح القيمة = 9.8 م / ث 2 من المحور Z ، ظهرت الفكرة لكتابة هذه المذكرة.




هيكل النشر


  • مشكلة
  • بيان المشكلة وطريقة الحل
  • كيف تحصل على النقاط؟
  • كيف تحسب مركز الكرة؟
  • كيفية تسريع البحث عن مركز الكرة؟
  • كيف تسريع البحث عن مركز الكرة؟
  • حول أخطاء القياس
  • مجموع


مشكلة


ما هي المشكلة - تخضع أجهزة استشعار MEMS بعد التثبيت في اللوحة لتشوهات طفيفة تؤثر على:
  • موضع الصفر
  • تحجيم القيم المقاسة ؛
  • عمودية المحاور لبعضها البعض.

وإذا تم انتهاك القياس والتعامد بشكل غير ملحوظ ، فإن موضع الصفر يصبح متشابكًا بشكل ملموس. على سبيل المثال ، إذا قمت بترجمة القيمة النموذجية للإزاحة الصفرية لمقياس التسارع لمستشعر MPU9250 إلى m / s 2 ، فسيتم الحصول على ذلك في منطقة 0.2 m / s 2 . أي أن المستشعر ثابت ، ولكنه يُظهر التسارع ، وبعد 5 ثوانٍ نحصل على سرعة 1 م / ث. من ناحية ، يتم تمرير جميع بيانات المستشعر دائمًا من خلال نوع من الفلتر (على سبيل المثال ، مثل ). ولكن من ناحية أخرى ، لماذا يجب أن يعوض المرشح باستمرار عن هذا التحيز؟ بعد كل شيء ، سيظهر المستشعر حركة حيث لا. هذا يقلل من دقة النتيجة. بشكل عام ، تحتاج إلى العثور على قيمة الإزاحة مرة واحدة ثم طرح هذه القيمة من قراءاتها أثناء تشغيل المستشعر.

إن أبسط حل للعثور على قيمة الإزاحة الصفرية ، التي تتبادر إلى الذهن على الفور ، هو تهيئة الظروف التي يجب أن يظهر فيها المستشعر صفرًا بدقة. القيمة المسجلة على المستشعر هي قيمة الإزاحة الصفرية! وبالتالي؟ لكن لا - تعمل الجاذبية باستمرار على مقياس التسارع. لتجنب ذلك ، ستكون هناك حاجة إلى انعدام الوزن (لن ينجح القذف). يعمل المجال المغناطيسي للأرض على البوصلة ودورتها على الجيروسكوب. لذلك إذا لم يكن لديك مركبة فضائية شخصية ، فسيتعين عليك التوصل إلى شيء ما.

الحل الثاني الذي يتبادر إلى الذهن على الفور هو وضع المستشعر (أو بالأحرى محوره) في وضع سنعرف فيه بالضبط ما يجب أن يظهره المستشعر. الفرق بين ما يظهره المستشعر وما يجب أن يظهره - ولن يكون هناك تعويض صفر! وبالتالي؟ على سبيل المثال ، نعلم أنه إذا تم وضع مقياس التسارع في مستوى مع الأفق ، فمن الناحية النظرية ، سيتم توجيه ناقل التسارع الجاذبي بالضبط على طول المحور Z للمستشعر. حجم ناقل التسارع الذي نعرفه.

ومع ذلك، هناك مشكلة. وهو يتألف من حقيقة أنه لا يمكننا ضبط محور المستشعر بدقة على مستوى مع الأفق. والحقيقة هي أن السطح الذي سنعتمد عليه ليس موازيا للوحة الدوائر المطبوعة. وهذا بدوره لا يتوازى مع الموقع الذي يوجد فيه المستشعر. لا يقف المستشعر نفسه تمامًا على موقعه ولا تكون المحاور الموجودة داخل المستشعر موازية لجسم المستشعر. يعطي الخطأ في تعيين المحور بالنسبة إلى الأفق بمقدار درجة واحدة إسقاطًا مشابهًا في الحجم لقيمة الإزاحة الصفرية نفسها ، والتي نريد العثور عليها. في حالة مقياس المغنطيسية ، لا نعرف أيضًا إلى أين يتم توجيه متجه المجال المغناطيسي. من الناحية النظرية ، إلى الشمال. لكن في الواقع ، المجال المغناطيسي للأرض نفسه غير متجانس في شدته واتجاهه. بالإضافة إلى ذلك ، تقوم الأجسام المعدنية القريبة بإجراء تعديلاتها.


بيان المشكلة وطريقة الحل


المهمة هي كما يلي: نحتاج إلى تحديد متجه الإزاحة الصفري باستخدام المستشعر ، والذي سيسجل دائمًا متجه الإزاحة + متجه التأثير الخارجي الثابت (تسارع الجاذبية ، دوران الأرض ، المجال المغناطيسي للأرض) ، حجم واتجاه لا نعرفه (في حالة مقياس التسارع نحن نعرف القيمة ، ولكن مرة أخرى قد لا يكون مقياس المستشعر مساويًا لـ 1).

طريقة الحل. تقترح هذه المقالة تحديد ناقلات الإزاحة على النحو التالي. نأخذ المستشعر ونحوله بكل طريقة ونقوم بتسجيل قراءات المستشعر. بعد القياسات N ، تكون القيم المأخوذة من المستشعر والموجودة على الرسم البياني عبارة عن كرة ، نصف قطرها هو حجم التأثير الخارجي ، والمركز هو الإزاحة الصفرية المطلوبة بالضبط.

كيف تحصل على النقاط؟


لتسهيل إجراء القياس نفسه ، يمكنك كتابة برنامج بسيط. يجب تسجيل أجهزة الاستشعار عندما يكون الجهاز ثابتًا. نحتاج فقط إلى تحويل الجهاز إلى الموضع المطلوب. من أجل تحديد حالة ثابتة ، يكون مقياس التسارع غير المعاير مناسبًا أيضًا - فقط خذ الفرق بين القيمة الحالية والقيمة السابقة. وإذا كان هناك المزيد من الضوضاء ، فإننا نقوم بإصلاح الحركة. يتم الحصول على عتبتي في منطقة 0.07G. إذا أمسكت بيديك ، فستظهر أكثر من هذه القيمة. استعملت شريط لاصق لإصلاح الموقف. إذا كانت لا تزال لا تعمل ، تحقق لمعرفة ما إذا كانت هناك ثلاجة أو مروحة أو شيء مشابه قريب.
كيف يمكن أن يكون في التعليمات البرمجية
//       
static TSumSensorsData 	g_sens_data[2];
static int32_t   	g_sens_data_sum_cnt[2];
static uint8_t		g_sens_data_num;

//  - ,     
IS_INTERRUPT void on_dma_raw_ready_calibrate_step1()
{
	SensorRawBuffer *raw = sensor_get_raw_buffer();
	g_sens_data[g_sens_data_num].acc_x += swap_i16(raw->accell_x_unswap);
	g_sens_data[g_sens_data_num].acc_y += swap_i16(raw->accell_y_unswap);
	g_sens_data[g_sens_data_num].acc_z += swap_i16(raw->accell_z_unswap);
	g_sens_data[g_sens_data_num].gyro_x += swap_i16(raw->gyro_x_unswap);
	g_sens_data[g_sens_data_num].gyro_y += swap_i16(raw->gyro_y_unswap);
	g_sens_data[g_sens_data_num].gyro_z += swap_i16(raw->gyro_z_unswap);
	g_sens_data[g_sens_data_num].mag_x += raw->mag_x_raw * g_mag_calibrate.kx;
	g_sens_data[g_sens_data_num].mag_y += raw->mag_y_raw * g_mag_calibrate.ky;
	g_sens_data[g_sens_data_num].mag_z += raw->mag_z_raw * g_mag_calibrate.kz;
	g_sens_data_sum_cnt[g_sens_data_num]++;
}

//   main
void sensors_calibrate_program(FlashROM *flash_ptr)
{
	double calibrate_result_error[3];
	TVector16 calibrate_result[3];
	int32_t radius[ACCEL_NO_MOTION_DETECT_COUNT];
	uint8_t raw_is_deleted[ACCEL_NO_MOTION_DETECT_COUNT];
	TVector16 raw[3][ACCEL_NO_MOTION_DETECT_COUNT];
	
        . . .

	//  
	g_sens_data_sum_cnt[0] = 0;
	g_sens_data_num = 0;
	int16_t prev_avg_x = 0;
	int16_t prev_avg_y = 0;
	int16_t prev_avg_z = 0;
	int8_t low_motion_cnt = 0;

	while(low_motion_cnt < ACCEL_NO_MOTION_DETECT_COUNT)
	{
		if (g_sens_data_sum_cnt[g_sens_data_num] >= ACCEL_NO_MOTION_DETECT_SAMPLES)
		{
			uint8_t new_data_num = (g_sens_data_num + 1) & 1;
			g_sens_data[new_data_num].acc_x = 0;
			g_sens_data[new_data_num].acc_y = 0;
			g_sens_data[new_data_num].acc_z = 0;
			g_sens_data[new_data_num].gyro_x = 0;
			g_sens_data[new_data_num].gyro_y = 0;
			g_sens_data[new_data_num].gyro_z = 0;
			g_sens_data[new_data_num].mag_x = 0;
			g_sens_data[new_data_num].mag_y = 0;
			g_sens_data[new_data_num].mag_z = 0;
			g_sens_data_sum_cnt[new_data_num] = 0;

			uint8_t old_data_num = g_sens_data_num;
			g_sens_data_num = new_data_num; //           
			// ( -    ,   )

			//     -  
			int16_t avg_x = g_sens_data[old_data_num].acc_x / g_sens_data_sum_cnt[old_data_num];
			int16_t avg_y = g_sens_data[old_data_num].acc_y / g_sens_data_sum_cnt[old_data_num];
			int16_t avg_z = g_sens_data[old_data_num].acc_z / g_sens_data_sum_cnt[old_data_num];

			//      
			int16_t dx = avg_x - prev_avg_x;
			int16_t dy = avg_y - prev_avg_y;
			int16_t dz = avg_z - prev_avg_z;
			prev_avg_x = avg_x;
			prev_avg_y = avg_y;
			prev_avg_z = avg_z;

			//     
			if ((abs_i16(dx) <= ACCEL_NO_MOTION_DETECT_AVG_VALUE)&&(abs_i16(dy) <= ACCEL_NO_MOTION_DETECT_AVG_VALUE)&&(abs_i16(dz) <= ACCEL_NO_MOTION_DETECT_AVG_VALUE))
			{
				//    
				raw[RAW_ACC][low_motion_cnt].x = avg_x;
				raw[RAW_ACC][low_motion_cnt].y = avg_y;
				raw[RAW_ACC][low_motion_cnt].z = avg_z;
				raw[RAW_GYRO][low_motion_cnt].x = g_sens_data[old_data_num].gyro_x / g_sens_data_sum_cnt[old_data_num];
				raw[RAW_GYRO][low_motion_cnt].y = g_sens_data[old_data_num].gyro_y / g_sens_data_sum_cnt[old_data_num];
				raw[RAW_GYRO][low_motion_cnt].z = g_sens_data[old_data_num].gyro_z / g_sens_data_sum_cnt[old_data_num];
				raw[RAW_MAG][low_motion_cnt].x = g_sens_data[old_data_num].mag_x / g_sens_data_sum_cnt[old_data_num];
				raw[RAW_MAG][low_motion_cnt].y = g_sens_data[old_data_num].mag_y / g_sens_data_sum_cnt[old_data_num];
				raw[RAW_MAG][low_motion_cnt].z = g_sens_data[old_data_num].mag_z / g_sens_data_sum_cnt[old_data_num];

				low_motion_cnt++;

				//   
				beep();

				//     2   ,     -   
				//  -  
				//      
				delay_ms(2000);
			}
		}
	}
. . .
}


للحصول على الكرة على الرسم البياني ، تحتاج إلى لف الجهاز باستخدام المستشعر وفقًا لمخطط معين. لهذه الأغراض ، فإن الكرة الأرضية مناسبة تمامًا ، لأنها تحتوي على ترميز. قد تعتقد أنك بحاجة إلى النحت في جميع أنحاء العالم. لكن الأمر ليس كذلك.
مثال على نتيجة خاطئة


من الضروري نحت المجس ليس على سطح الكرة الأرضية بأكمله ، ولكن على خط الطول. لنفترض أننا أخذنا سبع نقاط على خط الطول (الأول والأخير في القطبين الشمالي والجنوبي). في كل نقطة من خط الطول ، نعلق جهازك على الكرة الأرضية وما زلنا نلف الجهاز حول محوره بخطوة معينة ، على سبيل المثال 30-35 درجة. اتضح أنه إذا قمت بالتدوير 12 مرة حول محوره ، فسيتم الحصول على 7 قياسات في إجمالي 84 نقطة.



جمال الطريقة هو أن كل شيء يمكن القيام به "على الركبة". لا تلعب دقة تحديد المواقع دورًا خاصًا ، ما عليك سوى التواء وفقًا للمخطط بحيث يرسم ناقل التأثير الخارجي على الرسم البياني كرة. يبدو الصحيح هو شيء من هذا القبيل - انظر الشكل (تم تمييز المركز بعلامة).



كيف تحسب مركز الكرة؟


هذه مهمة مثيرة للاهتمام ولها العديد من الحلول. قد يبدو أنه للبحث عن المركز ، يكفي أخذ المتوسط ​​الحسابي لإحداثيات النقاط التي تم الحصول عليها. ومع ذلك ، فإن الأمر ليس كذلك - يمكن وضع النقاط بشكل غير متساو على الكرة (انظر الشكل.).



تبدو معادلة الكرة كما يلي: (X - A) 2 + (Y - B) 2 + (Z - C) 2 = R 2 ، حيث X ، Y ، Z هي إحداثيات النقطة التي تقع على الكرة. A و B و C هي إحداثيات المركز على محاور x و y و z على التوالي. R هو نصف قطر الكرة. يمكنك بناء نظام معادلات ومحاولة حل هذا النظام ببساطة باستخدام بعض الطرق. أو يمكنك فقط التمثال للعثور على المركز (وهذا يشبه طريقة التقريب المتتالي). معنى الطريقة بسيط: قيمة الخطأ (X - A) 2 + (Y - B) 2+ (Z - C) 2 - R 2 يجب أن يميل إلى الصفر. هذا يعني أن مجموع هذه الكميات لجميع نقاط الكرة يجب أن يميل أيضًا إلى الصفر. بمعرفة ذلك ، يمكننا اختيار القيم A و B و C التي يكون خطأ جميع النقاط فيها ضئيلًا. منطقة البحث محدودة بحجم الكرة (المكعب الشرطي). أي أننا يجب أن نضع مركز الكرة بالتسلسل في جميع نقاط المكعب ونحسب الخطأ. حيث يوجد خطأ بسيط - يوجد المركز.



مثل R ، نحتاج إلى أخذ القيمة النظرية لناقل التأثير الخارجي - لمقياس التسارع ، هذا هو تسارع الجاذبية ، للبوصلة - هذا هو متوسط ​​حجم المجال المغناطيسي للأرض ، للجيروسكوب - سرعة دوران الأرض. بالطبع ، في الصيغة يجب أن تكون هناك قيم بعد واحد (الوحدات التقليدية للمستشعر أو م / ث 2)، درجة / ثانية ، وما إلى ذلك). إنه أكثر ملاءمة للتحويل إلى وحدات عشوائية من المستشعر المقابل.
كيف تحسب قيمة معينة في الوحدات القياسية للمستشعر؟
= * / ( — )
: 16- ±2g ?:
9,8 /2 * 65536 / (2g + 2g) = 9,8 /2 * 65536 / (2 * 9,8 /2 + 2 * 9,8 /2) = 16384 . . .

بالمناسبة ، إذا كنت تعرف نصف قطر الكرة بالضبط ، فيمكنك حساب المركز فقط بواسطة "إسفين". أي في النقاط التي تقع فقط على قطعة من سطح الكرة. لكن هذه ليست قضيتنا.

كيفية تسريع البحث عن مركز الكرة؟


من الضروري البحث عن المركز ليس في المكعب بالكامل (أبعاد الكرة) ، ولكن على طول الخط ، الذي تكون بدايته عشوائية ، وكل نقطة تالية أقرب إلى المركز الحقيقي والنهاية في المركز. لنفترض أننا نبدأ من النقطة (0 ؛ 0 ؛ 0) ... نتحرك دائمًا بخطوة ثابتة. لذلك ، إذا تصورنا مجموعة من مكعبات 3x3x3 ، حيث يكون كل وجه يساوي حجم الخطوة ونتخيل أيضًا أن الموضع الحالي هو المكعب الأوسط ، فلدينا خيارات 9 + 8 + 9 حيث نضع النقطة التالية. علينا فقط أن نكون عند كل نقطة ، لحساب أي من النقاط المجاورة 26 سيكون الخطأ أقل. إذا اتضح أن الخطأ أقل في النقطة الحالية ، وليس في إحدى المناطق المجاورة ، فهذا يعني أنه في المركز وأن البحث قد انتهى.


كيف يمكن أن يكون في التعليمات البرمجية
Public Function get_err(A As Double, B As Double, C As Double, R As Double) As Double
Dim x, y, z As Double
Dim sigma As Double
Dim row_n As Long
get_err = 0
For row_n = 1 To 15
    x = Application.ActiveWorkbook.ActiveSheet.Cells(row_n, 1).Value
    y = Application.ActiveWorkbook.ActiveSheet.Cells(row_n, 2).Value
    z = Application.ActiveWorkbook.ActiveSheet.Cells(row_n, 3).Value
    get_err = get_err + abs( (A - x) ^ 2 + (B - y) ^ 2 + (C - z) ^ 2 - R ^ 2 )
Next
End Function

. . .
A = 0
B = 0
C = 0

Do While True
   min_sigma = 0
    For ai = -1 To 1
        For bi = -1 To 1
            For ci = -1 To 1
                sigma = get_err(A + ai, B + bi, C + ci, 16384)
                If sigma < min_sigma Or min_sigma = 0 Then
                    ai_min = ai
                    bi_min = bi
                    ci_min = ci
                    min_sigma = sigma
                End If
            Next
        Next
    Next
    
    If ai_min = 0 And bi_min = 0 And ci_min = 0 Then
        Exit Do
    End If
    
    A = A + ai_min
    B = B + bi_min
    C = C + ci_min
Loop
. . .



كيف تسريع البحث عن مركز الكرة؟


بحاجة إلى البحث مع الملعب متغير. أولاً نبحث عن المركز بخطوات كبيرة. وجدنا المركز ونقلل الخطوة ونبدأ منه في البحث بشكل أكبر. وهكذا ، حتى تحصل على نتيجة الدقة اللازمة.
كيف يمكن أن يكون في التعليمات البرمجية
Public Function get_err(A As Double, B As Double, C As Double, R As Double) As Double
Dim x, y, z As Double
Dim sigma As Double
Dim row_n As Long
get_err = 0
For row_n = 1 To 15
    x = Application.ActiveWorkbook.ActiveSheet.Cells(row_n, 1).Value
    y = Application.ActiveWorkbook.ActiveSheet.Cells(row_n, 2).Value
    z = Application.ActiveWorkbook.ActiveSheet.Cells(row_n, 3).Value
    get_err = get_err + abs( (A - x) ^ 2 + (B - y) ^ 2 + (C - z) ^ 2 - R ^ 2 )
Next
End Function
. . .
A = 0
B = 0
C = 0
step = 1000
Do While True
   min_sigma = 0
    For ai = -1 To 1
        For bi = -1 To 1
            For ci = -1 To 1
                sigma = get_err(A + ai * step, B + bi * step, C + ci * step, 16384)
                If sigma < min_sigma Or min_sigma = 0 Then
                    ai_min = ai
                    bi_min = bi
                    ci_min = ci
                    min_sigma = sigma
                End If
            Next
        Next
    Next
    If ai_min = 0 And bi_min = 0 And ci_min = 0 Then        
        step = step / 10
        If step < 0.01 Then
            Exit Do
        End If
    Else
    A = A + ai_min * step
    B = B + bi_min * step
    C = C + ci_min * step
    End If
Loop
. . .



حول أخطاء القياس


أثناء القياسات ، قد تكون هناك مواقف ، لسبب ما ، قد تكون نتيجة القياس أبعد بكثير من سطح الكرة. أو قد يكون هناك الكثير من النقاط. أو ، بشكل عام ، قد لا تكون نتيجة القياسات كرة ، ولكن "بيضة" أو "منطاد". في هذه الحالة ، بالطبع ، تحتاج إلى تكرار جميع القياسات ، وتحديد الأسباب المحتملة للأخطاء. على سبيل المثال ، بالنسبة لمقياس المغناطيسية ، يمكن أن يكون مسمارًا أو مسمارًا في طاولة وأنت تأخذ قياسات فوقه مباشرة. وكلما خفضت المستشعر على طول خط الطول ، كلما أثر المعدن على النتيجة. لذلك ، من الضروري تحديد عتبة قيمة الخطأ المسموح بها. لكي لا تعيد القياسات بسبب عدة نقاط خاطئة بشكل واضح ، يمكنك تطبيق مرشح. مبدأ المرشح بسيط للغاية - بعد حساب المركز لأول مرة ، قم بفرز النقاط حسب مستوى الخطأ في كل منها.يمكن ببساطة التخلص من بعض النقاط التي بها أكبر خطأ (على سبيل المثال ، 10٪). ثم تحتاج إلى تكرار البحث عن المركز.


مجموع


هذه الطريقة لديها دقة جيدة. تسمح لك الطريقة بالقيام بالوسائل المرتجلة البسيطة (الكرة ، البنك ، إلخ). يعمل بسرعة كافية. كود بسيط. تحتوي العديد من أجهزة الاستشعار على سجلات خاصة حيث يمكنك كتابة القيمة الموجودة ، وسيطرحها المستشعر على الفور. عادة ما يكون لهذه السجلات البادئة "TRIM" ، كما هو الحال في MPU9260 ، أو "OFFSET" ، كما هو الحال في LSM303. لكن LIS302DL المعروف ليس لديه مثل هذه السجلات.

لا تنس أن تضع علامة زائد إذا كنت تحب ذلك. اكتب في التعليقات طرقك لمعايرة المستشعرات.

Source: https://habr.com/ru/post/ar384075/


All Articles