קריאה מרגל אנלוגית אחת משפיעה על קריאה מרגל אנלוגית אחרת? - אלקטרוניקה ומודינג - HWzone פורומים
עבור לתוכן
  • צור חשבון

קריאה מרגל אנלוגית אחת משפיעה על קריאה מרגל אנלוגית אחרת?


card

Recommended Posts

שלום

תופעה מאד מוזרה:

חיברתי ל-A0 חיישן אור

http://www.electrodragon.com/?product=mini-photocell

(מחלק מתח, עם נגד של 10K)

חיברתי ל-A1 חיישן טמפרטורה אנלוגי - LM35D

http://www.electrodragon.com/?product=lm35d-to-92-temperature-sensor

אם אני כותב תוכנית שקוראת רק את אחד מהם, הכל בסדר.

דוגמא:

החיישן אור לבד:

2z5t65l.jpg

החיישן טמפרטורה לבד:

24dmots.png

אבל אם אני כותב תוכנית שקוראת את שניהם, אז תראו מה קורה:

2hnx9fo.png

יש לציין שכל המדידות ב-3 ה-screenshots האלו נעשו באותו זמן.. בהפרש של כמה שניות בינהם.

לא רק שהטמפרטורה קפצה ב-5-6 מעלות,

אלא שהיא גם לא יציבה עכשיו. יש באמצע פתאום "17 מעלות", "16 מעלות" וכו'..

כמו כן, המעגל לא משתנה בין כל אחת מהתוכניות - הוא זהה, ושני החיישנים כל הזמן מחוברים.

ההבדל הוא רק בתוכנית, שגם היא כמעט ולא משתנה, אני רק עושה Comment/Uncomment כדי לבטל קטע קוד אחד/שני.

בנוסף, שימו לב שמי שמושפע זה החיישן טמפרטורה - LM35, מנגד החיישן אור לא מושפע כששניהם נקראים.

למה זה קורה?

קישור לתוכן
שתף באתרים אחרים

  • תגובות 38
  • נוצר
  • תגובה אחרונה

לדעתי לא יזיק גם לעשות 2 מדידות לפחות לאחר המיתוג (ולקרוא את הערך של המדידה השנייה). יכול להיות שעכבת המוצא של החיישן הזה גבוהה מדיי ולכן צריך לאפשר לו טיפה יותר זמן לפני שהקריאה תהייה תקינה.

קישור לתוכן
שתף באתרים אחרים

קודם כל, רק כדי להיות בטוחים, הבא בבקשה את הקוד...

הקוד ב-main program הוא:

 
#include "Lib_GL5528.ino"
#include "Lib_LM35.ino"


//Analog Legs:
const int Leg_PhotoResistor =0;
const int Leg_LM35 =1;


//Class Objects
GL5528 O_GL5528(Leg_PhotoResistor);
LM35 O_LM35 (Leg_LM35 );


void setup()
{
Serial.begin(9600);
Serial.println("Up");
}


void loop()
{
Serial.print("GL5528: ");
Serial.print(O_GL5528.GetLightIntensity());
Serial.print("% ");

Serial.print("LM35: ");
Serial.print(O_LM35.GetTemperature());
Serial.println("c ");

delay(1000);
}

כאשר יש קלאס לכל רכיב.

(אני יוצר קלאס קטן לכל רכיב, זה מאפשר לארגן את הקוד בצורה יותר נוחה)

עבור החיישן אור:

class GL5528
{
public:

int m_AnalogLeg;


GL5528(int SetAnalogLeg)
{
m_AnalogLeg =SetAnalogLeg;

pinMode(m_AnalogLeg,INPUT);
}



//Methods:
int GetLightIntensity()
{
int Value =analogRead(m_AnalogLeg);

return map(Value,0,800,0,100);
}
};

עבור החיישן טמפרטורה:

 
class LM35
{
public:

int m_AnalogLeg;


LM35(int SetAnalogLeg)
{
m_AnalogLeg =SetAnalogLeg;

pinMode(m_AnalogLeg,INPUT);
}



//Methods:
float GetTemperature()
{
int Value =analogRead(m_AnalogLeg);

return 500*Value/(float)1023; //Original Formula, Before Condensation is: (5*(Value/(float)1023))/0.01)
}
};

לדעתי לא יזיק גם לעשות 2 מדידות לפחות לאחר המיתוג

מה הכוונה "המיתוג"?

קישור לתוכן
שתף באתרים אחרים

לכתוב מחלקה בשביל פוטורסיזטור?! אין ספק ששפות התכנות המודרניות השחיתו לגמרי את הנוער ;-)

אני עדיין לא רואה סיבה להשפעה של מדידות זו על זו, אז אולי תעשה ניסוי - שים delay נחמד בין מדידות, משהו כמו 100ms אחרי כל קריאה של חיישן מסוים, ובדוק אם עדיין יש הבדלים כמו שראית.

קישור לתוכן
שתף באתרים אחרים

לכתוב מחלקה בשביל פוטורסיזטור?! אין ספק ששפות התכנות המודרניות השחיתו לגמרי את הנוער ;-)

חחחח..

האמת ש-PhotoResistor (וגם ה-LM35) באמת לא צריכים קלאס, גם פונקציה אחת הייתה מספיקה להם.

הסיבה שבכל זאת הם בקלאס,

היא שלשאר הרכיבים יש קלאס(ויש רכיבים עם כמה וכמה פונקציות וכמה משתנים, שם הקלאס באמת נדרש),

אז כאן זה רק לשם העקביות.

אני עדיין לא רואה סיבה להשפעה של מדידות זו על זו, אז אולי תעשה ניסוי - שים delay נחמד בין מדידות, משהו כמו 100ms אחרי כל קריאה של חיישן מסוים, ובדוק אם עדיין יש הבדלים כמו שראית.

אוקיי עשיתי עכשיו עוד כמה מדידות.

קודם כל, חזרתי על המדידה רגילה, בלי עדיין להוסיף את ה-delay שביקשת:

34fmef7.png

נגיד שבסדר,

למרות שיש שם קפיצה אחת מוזרה ל-20.53, אבל מילא.

עכשיו הדלקתי את האור בחדר..

מנורת PL..

ותראה מה קרה:

wrkikp.png

(זו עדיין אותה הרצה, לא הרצה נפרדת..)

זה גורם לי להתחיל לפתח תיאוריה שמנורת PL משפיעה על חיישן טמפרטורה LM35..

אבל..

עכשיו עשיתי Comment לחלק קוד שקורא ומדפיס את התוצאה של החיישן אור,

והשארתי רק את החלק שקורא ומדפיס את החיישן טמפרטורה, ותראה:

(האור בחדר עדיין דולק)

2yts60i.png

הכל מסתדר, כשהוא לבד..

גם כשהאור דולק!

מה הולך כאן?

קישור לתוכן
שתף באתרים אחרים

תנסה לעשות מה שהצעתי. תעשה כמה מדידות של החיישן הזה אחת אחרי השנייה ותקרא אותן למחשב ככה שיהיו 1 לאור ו-2 (או יותר) לטמפ' בכל פעם. תראה האם זה משנה משהו.

קישור לתוכן
שתף באתרים אחרים

בדיוק מה שהתחלתי להציע "פורסמה תגובה חדשה".

תנסה להשים השהייה בין מיתוגי הקריאות, אולי 100ms זה קצת יותר מידי אבל אתה יכול לשחק עם הערכים (קרוב לוודאי שגם 1ms יספיק)

עוד דבר שבדרך כלל עושים עם קריאות מחיישנים זה לקיחת כמה דגימות (2/4/8/16/32/64...) לשמור אותם במערך ולבצע עליהם ממוצע.

קיימת גם דרך חומרתית, פשוט להוסיף קבל קטן במקביל למדידה.

בכל מקרה זה די מוזר שזה קורה... יכול להיות שיש לך ספק מתח רועש, חוטים ארוכים שמחוברים לחיישנים ?

קישור לתוכן
שתף באתרים אחרים

מייק, הסיכוי שזה ספק בעייתי הוא דיי נמוך, כי אין סיבה שהספק יושפע מהאור :)

לדעתי הכי הגיוני זה לעשות כמה מדידות, בלי קשר למיצוע פשוט כי יכול מאוד להיות שברגע שמחברים את הכניסה הנבחרת ל-ADC יש נפילת מתח שלוקח לו זמן לטעון בחזרה. בין אם תוסיף דיליי (אבל את זה צריך לעשות אחרי המיתוג, אחרת זה לא עושה כלום), ובין אם תעשה כמה מדידות מאותה הכניסה, ובין אם תחבר קבל במקביל (שבעצם מונע את הנפילה הזו במתח), הכל בסוף אמור לתת את אותה התוצאה.

כמובן שכל זה בהנחה שהסיבה לשגיאה היא אכן מה שניחשתי שהיא, אחרת כל מה שאמרתי לא יעזור בכלום :P

קישור לתוכן
שתף באתרים אחרים

תנסה לעשות מה שהצעתי.

אני בשמחה רציתי לנסות את מה שהצעת, רק שלא הבנתי מה זה המיתוג שדיברת עליו.

אבל עכשיו מהפוסט השני שלך, אני מסיק, שבמיקרו-בקר, עם כמה רגלי Input אנאלוגיות, יש רק ADC אחד??

והמיקרו-בקר בעצם ממתג את הרגל שנקראת ברגע מסוים, אל ה-ADC האחד הזה כל פעם?

זו הכוונה?

בכל אופן להלן עוד מדידות בהשראת מה שהצעת:

קודם כל, מדידה רגילה, לראות שהבעיה עדיין משתחזרת:

(האור דולק בכל המדידות עכשיו)

34qv8uv.png

כפי שניתן לראות, הבעיה קיימת מאד :)

עכשיו הוספתי בלוק של קוד שמדפיס עוד פעם את ה-LM35..

כך שבכל איטרציה של loop(), יודפס פעם אחת החיישן אור, ופעמיים החיישן טמפרטורה.

(הוא לא רק מודפס פעמיים, אלא גם נדגם פעמיים.. שזה יותר משנה לנו כמובן)

13yfl01.png

כפי שניתן לראות, הדגימה הראשונה יוצאת דפוקה,

ובשנייה זה כבר מסתדר..

מעניין מאד!

עכשיו ניסיתי עם 3 דגימות של ה-LM35 בכל איטרציה:

2ntcsw3.png

כשעושים 3 דגימות רצופות, הן כמעט בסדר..

(הראשונה נמוכה במעלה אחת מהשאר.. אבל לפחות היא לא מינוס :) )

מה זה אומר? :)

קישור לתוכן
שתף באתרים אחרים

א. אכן יש רק ADC אחד והכניסות ממותגות אליו בהתאם למה שאתה בוחר.

ב. זה אומר שכנראה שצדקתי ועכבת המוצא גבוהה מדיי (אני עצלן מדיי לחפש בדפי מפרט כרגע). אתה יכול לעשות אחד מ-3 דברים:

1 - לעשות כמה מדידות ולקחת את האחרונה

2 - לשים קבל גדול יחסית (כנראה שאפילו 1uF יספיק לגמרי) במקביל למוצא של החיישן. זה יגביל את קצב התגובה, אבל זה טמפ' אז זה כנראה משהו שבכלל לא תרגיש

3 - לשים חוצץ (מגבר שרת שעובד בתור עוקב) בין החיישן לכניסה של ה-ADC

קישור לתוכן
שתף באתרים אחרים

כמו שניחשת אינטואטיבית לבקר יש רק ADC אחד. כאשר אתה קורא מרגל מסויימת צריך למתג אותה לADC לחכות טיפה שהיא תתיצב ואז לבצע קריאה.

כניראה שאין מספיק השהייה בין המיתוג של המדידות.

לפי הקוד שלך אני מניח שהספריה של הארדואינו דואגת למיתוג הפין הנכון ואיך לך אפשרות להוסיף השהיה בין המיתוג למדידה, נכון ?

אז יש 2 דברים שאתה יכול לעשות:

1. ביצוע כמה קריאות, תתעלם מהערך בקריאה הראשונה (אולי גם השניה). כמובן שלא יזיק לקחת כמות מסויימת של קריאות לאחר מכן ולעשות עליהם ממוצע (נניח 8/16, לבקר גם קל מאוד לבצע חילוק של מספרים שלמים בחזקות של 2). כמובן שתבצע את ההמרות ממתח לטמפ'/כמות אור לערך הממוצע שהתקבל ולא לכל ערך לפני ההמוצע.

2. חיבור קבל קטן במקביל לכניסה האנלוגית. אם המעגל שלך מורכב על מטריצה אתה יכול לנסות לדחוף איזה קבל בין יציאת החיישנים לאדמה בזמן שאתה קורא את המדידות.

שוב לגורם הבעיה, ובתגובה לאנטולי.

אני לא מבין גדול אבל לדעתי זה לא האור הפיזי שגורם לבעיה אלא הרעש כתוצאה מהדלקת נורת הפלוריסנט. אני מניח שהמעגל בנוי על מטריצה וכידוע מטריצות לא מתפקדות טוב בתדרים גבוהים או בקרבה לרעש. זה יכול להסביר את הקריאות המוזרות של הטמפ' השלילית.

עריכה:

ואו כמה שהתראד הזה פעיל, 2 תגובות חדשות בזמן שכתבתי את התגובה.

ד"א אנטולי, הADC דורש עכבת כניסה של עד 10k, שזה בעצם הטווח של חיישן האור כשהוא בחושך מלא.

קישור לתוכן
שתף באתרים אחרים

רגע..

לפני שאענה למה שכתבתם,

עשיתי עכשיו עוד מדידות, בעקבות הרעיון של mike לשים delay.

תראו:

הוספתי delay בין המדידה של החיישן אור, לבין המדידה של החיישן טמפרטורה.

(שימו לב, שיוצא שאין delay אח"כ, במעבר מהחיישן טמפרטורה אל החיישן אור..

זה הרי עובד ב-loop, אז זה אומר שזה עובר מייד מהטמפרטורה אל ה-loop בלי delay).

10ms:

15p3a54.png

100ms:

28issww.png

500ms:

20jffnr.png

וכדי להוסיף למוזרות,

מדדתי שוב פעם עם delay של 10ms,

וגיליתי תופעה מאד מאד מעניינת.

תראו:

34nsl7s.png

עכשיו אם אתם שואלים את עצמכם "מה כל כך מעניין במדידה החוזרת של 10ms???",

אז תראו, שמתי שת שתיהן אחת ליד השנייה:

34o55b7.png

רואים?

קישור לתוכן
שתף באתרים אחרים

היי מייק, נראה לי שעכבת המוצא של חיישן הטמפ' היא הגורם המגביל פה ולא של חיישן האור :)

בנוגע למה שרשמת בנוגע לפלורוסנט, אכן הוא יכול להוסיף רעשים למדידה, אבל אז הוא היה מופיע גם כאשר מודדים רק את חיישן הטמפ' בלי חיישן האור, וזה לא המצב כאן.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.


×
  • צור חדש...