흠... 제가 텀프로젝트 진행중에
CDS광량센서 입력 받는부분에 count++ (입력받을때마다) 아무튼 이렇게 해서
하고 있는데 입력을 수도 없이 받네요...;;;
1초당 100번은 받는듯;;; 새보진 않아서 ..
아무튼 교수님께 여쭤 받는데
센서가 하는것을 평균값으로 일정하게 제어하는 방법이 있다네요....
그런방법이 있다 이러고... 안알려 주셨는데-_-
좀 알고 싶어서 이렇게 질문을 올립니다~
average 필터링이랬다 무슨 미분하고 머 그런 방법 있다고 하던데
도무지 흘려 가는 말로 하셔서 모르겠네요 ...
교수님의 압박...(인터넷에 다있자나!!!! 찾아봐!!!)
찾아봐도 머를 찾아야 대는지 모르겠어요 ㅋㅋㅋ
흠... 도움좀 주세요~ 그냥 이론쪽으로 많이 알고 싶네요 소스코딩 보단...
어떤방법인지...;;;
CDS광량센서 입력 받는부분에 count++ (입력받을때마다) 아무튼 이렇게 해서
하고 있는데 입력을 수도 없이 받네요...;;;
1초당 100번은 받는듯;;; 새보진 않아서 ..
아무튼 교수님께 여쭤 받는데
센서가 하는것을 평균값으로 일정하게 제어하는 방법이 있다네요....
그런방법이 있다 이러고... 안알려 주셨는데-_-
좀 알고 싶어서 이렇게 질문을 올립니다~
average 필터링이랬다 무슨 미분하고 머 그런 방법 있다고 하던데
도무지 흘려 가는 말로 하셔서 모르겠네요 ...
교수님의 압박...(인터넷에 다있자나!!!! 찾아봐!!!)
찾아봐도 머를 찾아야 대는지 모르겠어요 ㅋㅋㅋ
흠... 도움좀 주세요~ 그냥 이론쪽으로 많이 알고 싶네요 소스코딩 보단...
어떤방법인지...;;;
질문이 좀 어렵군요.... count++ 의 의미를 잘 모르겠어요..
CDS값을 받을려면...저항 변화니깐...전압분배해서....AD컨버터로 받아야 할텐데...
이 말씀은 아닌거 같고..8051이라서..AD컨버터가 내장되있는것도 아닌데...
어떻게 아날로그 값을 받고 계신다는 건지..모르겠네요..
질문을 좀 더 자세하게 말씀해주시면 도움을 드릴 수 있을지도 모르겠습니다.
부리기도 하는데.. 음 예를들어 너무 값이 변화가 큰 값은 무시한다거나 등등.. 예를들어 100이라는 값이 들어와야 하는 상황에서
101, 100, 105, 200 이럴때 200을 없애는 거죠. 이러한 방법을 말하는 건지.. 보통은 그냥 16번 받아서 XX / 16한다거나 해서 사용
합니다. 그리고 CDS는 광량에 따른 전압값이니까.. 그래프 그려보면 거의 선형적으로 나오는데.. 광량을 기준으로 봐서 커브피팅
해서 사용합니다. 즉 기준은 광량이고 그 값에 AD 한 값을 맞추는 거죠. 그래서 함수를 구해서 Y= F(x) 라고 할때 x가 ad 값이면
y는 광량값으로 사용합니다. 미분의 의미가 급격한 기울기에 대한 값을 필터링 한다라는 의미로 사용하시라는 건지 교수님의 의도는
잘 모르겠네요 ^^;;;;
-> 이건 아마도 아날로그 값을 디지털값으로 바꾸는 adc를 통해서 디지털화 하는데 일정한 값을 받을라고 하는거 아닌가요?
혹시 cds자체를 직접 8051같은 마이컴에 물려서 인터럽트로 사용하고 계시다면 안됩니다.ㅡㅡ;
(count하는 변수가 있는걸로 봐서 왠지 의심가서 드리는 말씀이고요)
ADC사용여부를 일단 밝혀주세요^^;; ADC는 Analog to Digital Converter(맞나? 오래되서ㅠㅠ)
비슷한걸로 주말 내내 고민했던거네 ㅠ
제 온도센서는 오차범위가 약± 5가량 차이가나는데
예로 실온이 25도면 22~28 이사이를 막 왔다리 갔다리
실측값은 250mA나오지만, ADC거쳐서 LCD에 표시되는 값은 .. 대략 +10 차이가나고
8빗분해능에 뭐.. 이것저것 말이 있었지만! 역시 기초지식이 없는관계로.. 아 혼란스럽네요~ 후훗
영혼님 말씀하신대로 평균값으로 해버리면 오차범위는 편법으로 지우겠지만서도..-0-
그전에 dvm으로 찍은값이랑 lcd표시값이 우선 비슷하게 맞아떨어져야할텐데~ 아 어려워
기타정보:ADC0804,LM35DZ,lm324썼어요
sombody help me~^^;
dvm으로 찍은값이 lcd로 표현되는 일련의 과정을 보자면
출려값을 adc로 변환하는데 여기서 아날로그를 디지털로 바꾸는 역할을 하며( 분해능 이건 해상도 라는 말로 8비트 분해능이면 2의 8승이므로 0~255까지의 정수로 그 값을 표현한다는 애기가 됩니다.) 디지털화된(정수로 바뀐) 값을 lcd로 표현하게 되는데 여기에서 프로그램상에서 잘못 구현하게 되면 뒷자리가 잘린다거나(평균구하기 혹은 0으로 나누기등) 약간 이상한 값이 나올수 있습니다.
10정도가 차이난다고 치면 대략 예상해볼수 있는것이..
평균을 구하는데 10번 카운트한것을 평균을 구하는데 실제로는 11번을 더하고 10으로 나눈다던지 그 반대의 경우에
그 만큼의 오차를 가지는 경우가 많사오니 꼭 꼭 확인해보세요.
정말 10번 카운트 하고 10으로 나눈건지..등등을....
데요 .. if(cdsvalue>0x80) 이런식으로 해서 0x80보다 클때만 모터를 돌아가게 한다던지
clcd 백라이트를 킨다는지 이런식으로 짲거든요..
count라는 변수는 그냥 임의로 정한 변수이구요 if(cdsvalue>0x80) 이 조건이 맞을때만
count를 ++ 해서 count값으로 led를 조절하는부분이구요 별로 안중요...하구요
그리고 8051보드에 adc컨버터가 내장대있고 이거에 광량 센서가 연결 되어 있습니다. 설명이 이상한가
아무튼 cds광량센서 이부분을 손으로 가리면 0x80보다 크게 되고 ... 그때 모터 ON, 백라이트 ON
이런식이구요 count 변수는 단지 led값을 조절하기 위해서 if(cdsvalue>0x80) 이값이 맞으면 증가하게 하려고 했는데
수없이 받아 버리네요..;;; 흠...
다른부분 만약 인터럽트 버튼이 한번씩 눌릴때마다 count++ 해서 count가 만약 10보다 켜지게 되면 led불을 한칸씩
쭐이고 이런식으로 하는부분이구요 ..
그러나 cds광량센서 를 손으로 가리게 되는경우에는 count가 수없이 계속 너무 빨리 증가해서
led가 계속 빠르게 변하더라구요 그래서 광량센서 부분 count는 800정도로 넘으면 led가 한칸씩 줄게 하고
interrupt 부분은 8번 누르면 led가 줄게 하고 이런식으로 편법을쓰긴 했는데--;
adc샘플링(값을 채취라고 이해하세요)하는 속도에 따라서 count올라가는 속도가 달라지겠지요^^;
님이 원하시는건 한번 손대면 켜지는것이라면
ㅋㅋ
현재 값을 유지하는 변수 한개를 쓰시면 될듯하네요.
정확한 작동목표를 적지 않으면 머하는지 저희도 알수 없어요..
음.. 설명이 잘안대내요 ㅎ
한번손대면 켜지는것이 아니라 손을 댈때마다 그러니까 빛을 가릴때마다 모터가 돌아가게 되고
손을때게 되면 모터가 멈추는 것을 구현하였습니다..
그냥 이부분만 구현할때는 아주 간단합니다.
문제점이... 얼레는 시리얼 통신으로 컴퓨터 하이퍼터미널 창에 메뉴를 안만들려고 했는데...
adc 샘플링하는부분에서 막혀서... 즉...
count 라는 변수를 왜 줬냐면 ..... 자동 휴지가 내려가는 프로그램인데요
손을 대면 휴지가 내려가고 때면 휴지가 멈추고.. 이런식인데
LED로 휴지의 양을 체크하려고 COUNT라는 변수를 주게 되었습니다..
모터가 한번 돌때마다 1초에 거의 count 1증가식으로 해서 1초 돌면 휴지 두칸이 내려온다는 것을 임의로 정해서
휴지가 총 100칸이라면 50초면 다쓰겠죠?... 그렇게 해서
휴지가 100칸이 남으면 LED를 다 켜지게 하고 쓰는 만큼 LED를 한칸씩 꺼지게 하는것이구요..
휴지가 없어지면 LED가 다 꺼진상태 ....
인터럽트와 타이머 버튼을 사용할시에는 누를때마다 3초정도 정방향,역방향 돌아가게 해서 count 변수를 일정하게
증가시킬수 있었는데요^^ adc샘플링할때는 빛의 값이 계속 변하는지 if(cdsvalue>0x80) 이 조건이 되면
count++; 을 해주었는데 계속 올라가니 제어할방법이 없더라구요^^ 그니까 한번 모터가 돌때마다 count 를 증가시켜주면
간단한데 광량센서 부분은 빛을 받는부분에서 손을 계속 대고 있으면 모터가 돌아가겠죠?
그럼 adc샘플링이 계속 하는 상태라서 count가 계속 증가 됩니다... 빠르게 증가되죠
그럼 LED가 계속 -----> 이렇게 빠르게 순차적으로 켜지고 꺼지고 -_-;;
1. 인터럽트는 한번 누를때만 증가....(count++) : LED 조절가능
2. cds광량센서에 손을 갔다대면 (adc샘플링 계속 받아서 count 빠르게 증가) : LED 조절 불가능
그래서 프로그램을 메뉴를 나눠서
1. 그냥 광량 센서만 사용하고
2. 타이머 인터럽트만 사용하고
3. 컴퓨터에서 입력 받은값에 따라 모터 제어를 하고
이런식으로 어느부분에서는 사용못하게 해놨습니다 .. 처음에는 count를 전역변수로 해놨다가
나중에는 지역변수로 바꿨지요..
프로그램짠거는 상관없는데 -_-
센서가 하는것을 평균값으로 일정하게 제어하는 방법 -_- #()_*(*#()*(#*()#*()*(
제가 보기엔 빛나는 영혼님이 말씀하신
음 예를들어 너무 값이 변화가 큰 값은 무시한다거나 등등.. 예를들어 100이라는 값이 들어와야 하는 상황에서
101, 100, 105, 200 이럴때 200을 없애는 거죠.
==> 이방법은 소스상으로 기교를 부리는 방법 맞죠? 이런것이나
미분의 의미가 급격한 기울기에 대한 값을 필터링
이부분 같은데... AVERAGE 필터링 미분..이런것을 강조하셨을때 교수님께서...
흠....^^ 관련된 자료를 찾아볼수가 없네요 ㅠㅠ
차라리 마우스에 대해 조사해라 그럼 검색을 할수도 있을텐데....
지금은 멀 검색해야할지 막막해서 ㅋㅋ
제가 보기엔
adc 샘플링 필터링 기법에 관련한 내용을 검색하시면 좋은 자료를 볼 수 있을듯하네요
AD값이 어떤 값 이하일 때와 이상일 때 로 나뉘어서...모터를 컨트롤 하신다는 이야기 인거 같군요.
즉 어떤 값 이하(혹은 이상)일 때는 모터를 돌리면서..카운트를 증가시키고..
즉 어떤 값 이상(혹은 이하)일 때는 모터를 멈추게 해야 한다는 말씀이신거 같은데..
문제인 즉은....AD컨버터 리딩 부분에 AD값의 조건이 맞는 부분에서 카운트를 늘리면서 모터를 돌려버리니까..
너무 빨리 카운트가 올라갔다....그래서 이걸 해결을 원한다.....대충 이런 내용 맞나요?
만일 이 내용이 문제라면...AD컨버터의 필터링 하고는 약간은 거리가 있다라고 생각하시면 됩니다.
어차피 어떤 쓰레쉬홀드값 이상과 이하로 나뉘어 지게 동작되는것은 특별히 필터링을 거치지 않아도..
충분히 목적을 이루는 데는 문제 없을 듯 합니다.
다시 정리하자면....AD컨버터의 필터링이 문제가 아니라...프로그램의 구조를 생각하셔야 할 부분인 듯
싶습니다.
댓글이 너무 길어져서..여기서 살짝 줄여봅니다.
count++; 을 해주었는데 계속 올라가니 제어할방법이 없더라구요^^
=> 중요한 것은 cdsvalue 를 업데이트하는 부분을 모터가 한바퀴 돌아가는 시간과 맞물려 호출하시면....해결될 문제로
생각이 됩니다. (문제를 정확히 이해한 건지는 모르겠지만요..)
AD컨버터가 떨려봐야 몇십정도가 최고 일겁니다. ..(12비트기준) 그런데 어플리케이션.에서..손을 센서에 댓을 때 와
안댓을 때 두가지 상황으로만 나누어서 생각했었기 때문에...이 두가지 조건 사이에는 상당히 큰 값이 될겁니다..(몇백이상 (회로에 따라 다름) ) 그렇기 때문에 뷀뷀님의 어플리케이션에서는 AD컨버터의 필터링은 중요하지 않다 라고 생각됩니다.
많은 조언 감사드립니다^^
정말 많은 도움이 되었습니다~~ 나머지는 제몫이내요..
요즘따라.. 스터디 존을 만들어서.. 공부를 열심히 하고 싶다는;; 허접하겠지만-_-;;