https://www.winsen-sensor.com/product/mp-3b.html?campaignid=21472985515&adgroupid=163472020486&feeditemid=&targetid=kwd-324378996163&device=c&creative=705851074211&keyword=alcohol%20sensor&gad_source=1&gclid=EAIaIQobChMIspnEhI3qhwMVtAl7Bx3xPwXDEAAYASAAEgJy8_D_BwE

 

MP-3B Flat Surfaced Alcohol Sensor

The sensor has been fully tested (not calibrated) before leaving the factory. However, after transportation and storage, the environment conditions change, and the surface of the sensor absorbs moisture, mixed gas, pollution matters, etc. It is recommended

www.winsen-sensor.com

 

최근 이 센서로 알콜 측정기를 개발하고 있는데.. 쉽게 접근했다가 된통 당하고 있는중.

 

log 와 power 함수를 쓰게 될줄이야 ㅎㅎㅎ

그나저나 센서 안정화를 검증하는 시간이 너무 길다....

 

오랜만에 mol 수 계산도 해보고 예전 화학 수업 기억을 떠올리고 있습니다.

대강 하는 거랑 측정기를 통해서 제대로 칼리브레이션하고 동작하는 거랑은 천지 차이이다.

게다가 메모리 32kb 에 때려박으려니 코드 사이즈가 아슬아슬하네요.

 

 

아래 그림이 핵심!

매일  여러 샘플들 측정하고 30분 쉬고 엑셀로 기록..진도가 안나갑니다 T.T

 

M0 코어에서 float 연산을 할 일이 생겨서 , 아무 생각없이 software floating point 연산을 하다보니 이게 제법 코드를 차지하여서 32kb 메모리에서 도저히 다른 일을 할 수가 없게 되었다.

 

혹시나 찾아보니 역시..

누군가 M0 에 최적화한  tiny 버전을 만들어 놓았다.

 

https://www.quinapalus.com/qfplib-m0-tiny.html

 

Qfplib-M0-tiny: a free ARM Cortex-M0 floating-point library in 1 kbyte

Qfplib-M0-tiny: a free ARM Cortex-M0 floating-point library in 1 kbyte See also: Qfplib-M0-full: a similar library more optimised for speed, including both single- and double-precision functions; and Qfplib-M3: a similar library optimised for speed and acc

www.quinapalus.com

 

 

qfp_fadd
qfp_fsub
qfp_fmul
qfp_fdiv
qfp_fcmp
qfp_float2int
qfp_float2fix
qfp_int2float
qfp_fix2float
qfp_float2uint
qfp_float2ufix
qfp_uint2float
qfp_ufix2float
qfp_fcos
qfp_fsin
qfp_ftan
qfp_fatan2
qfp_fexp
qfp_fln
qfp_fsqrt

 

풀로는 이렇게 지원하고, 코드 크기가 1k 안으로 만들수 있다. gcc 에서 제공하는 라이브러는 한 2-3k 차지한듯.

한바이트라도 아쉬웠는데 이제 겨우 남은 메모리로 코딩을 할 수 있을거 같다.

 

혹시 pow 가 없다고 고민하지말 것.

고등학교에서 고1 수학을 배웠다면  위 함수로 구현이 가능합니다.

a^b = e^(b*ln(a))

안녕하세요.

예전에 마이컴으로 HDLC 10Mbps 처리하는 프로젝트에 대해서 거의 성공했다고 말씀드린적이 있습니다.

나름 뿌듯해하고 있었는데, 다시 난관을 만났었습니다. 항상 지뢰밭이 연속

문제를 만났을 때 해결 방법에 대한 글로 읽어도 좋으므로 , 이쪽 관련 기술이 아니더라도

문제 해결 및 디버깅에 도움이 되실 거 같습니다.

신호 레벨은 RS-485 라 짧은 거리에서는 문제없이 잘 동작합니다.

그런데 테스트 조건이 10Mbps 로 무려 쉴드케이블 200M 24시간 동작 조건입니다.

저는 당연히 이 문제는 하드웨어에서만 해결하면 되겠지하고 테스트 했는데 웬걸

100ms 당 20-30번 이상 CRC 에러나 길이 에러가 발생하네요.

순간 무얼 수정해야 할지 멍해지면서 역시 FPGA 를 사용했었어햐 하는 생각이 막 들더군요.

그런데 돌아가기에는 너무 먼길을 왔지요.

저의 디버깅 순서는

1. HW 문제 일까 SW 문제일까?

- 확인 방법 : FPGA 로 동작하는 다른 회사 제품의 RS-485로직에서 점퍼를 띄워서 , 개발품에 입력시키면

485 HW 로직인지 SW 문제인지 판별이 될꺼야.

-결론 : HW 문제로 내심 기대했지만 동일한 에러가 발생하므로 SW 문제였습니다.

2. SW 문제라면 왜 놓치는 걸까?

- 확인 방법 : 놓치는 순간의 신호가 무언까 찌그러 질꺼야. 타이밍이 안 맞겠지

로직 아날라이저로 깨진 신호만 패턴 시간을 하나하나 읽어서 따라가봄.

역시 100ns 단위의 칼 같았던 신호가 , 80ns 90ns 뭉개져 있었음. 될때도 있고 안될때고 있고.

- 결론 : 데이터 파싱시 edge 떨어지마 마자 인식하도록 해놓았는데 노이즈로 데이터가 뭉게질때 놓치는 것 같음.

3. 위 가정을 설립하고 해결 방법 도출

- 고민 : 만약 펄스 중앙에서 읽는데 이런 현상은 DMA 타이밍이 흔들리는 것 밖에 없음.

아니면 펄스 중앙에서 읽지 않는 다는 것. 둘 중 하나임.

- 확인 방법 : DMA 읽어가는 속도가 흔들리는 거는 가능성이 낮고 , 2번째 가설이 확율이 높음.

그러나 언제 정확하게 DMA 가 읽어가는지 눈으로 타이밍 확인이 불가능 함.

정말 edge 근처인지 읽는건지 알수가 없음. 현재 정보로는 대략 edge 이후 60ns 근처로

거의 중앙에서 읽는 것으로 추정만 됨. -> 그렇다면 해당 문제는 없어야 함.

- 실행 : 읽는 타이밍을 카운터를 적당히 중간값으로 변경후 확인해보았으나 동일.

여기서 좌절. 해당 가설이 맞지가 않나..

이제 미궁속으로 빠짐. 어떻게 해야할지 머리가 하얗게 변함.

4. 해결 시도

- 23년의 해결 노하우 총동원 (별거 아닙니다. 불안한 마음을 잠재우고 심리 상태를 편하게 만들어

최대한 집중도를 높이는 방법이지요)

1) 편안한 배경음악 틀기

- 몇년마다 발생하는 이런 현상에 대비하기 위한 나만의 음악 플레이 리스트 재생

- 해당 플레이 리스트는 효과를 극대화 하기 위하여 평소에는 절대 재생하지 않으며

위와 같은 절체 절명의 순간에서만 재생. 23년간 한 6-7번만 사용함.

2) 혼잣말하며 주변 산책

3) 다시 처음부터 내 생각에 오류가 없는지 차근차근 되집어봄.

4) 아무나 붙잡고 내 생각의 설명함 (러버덕코딩 기법)

- > 최근 그 아무나에 대한 부작용이 심각( 그 사람은 매우 피곤해 하기 때문에) 하여 사용을 자제하고 있었음.

5. 해결

1) 2시간의 집중 처방 이후 아이디어 떠오름

2) 타이밍 카운터를 임의로 중간값만 해보았는데 , 그냥 한칸식 밀면서 하나씩 해보자. 250번만 해보면 되겠네.

3) 1씩 증가시켜가며 컴파일 테스트 반복.

4) 어라 특정 값 범위부터 동작함. 유레카!

5) 자 그럼 안되는 값 범위를 찾아. 다시 1씩 증가시켜가며 컴파일 테스트 반복.

6) 동작잘하는 범위 확보. 따라서 최종 값은 최소값과 최대값의 중간 값.

7) 나머지 속도도 마찬가지로 테스트.

-> 숫자 1 바꾸고 컴파일하고 해당 값 범위 찾고 수시간 소요.

8) 모든 속도에서 정확하다고 생각되는 지연값 검출.

6. 결론.

1) 노이즈에 따른 신호 타이밍 흔들림이 맞으며 소프트웨어로 중간에서 읽어가도록 변경하여 해결.

2) 24시간 동안 한번의 데이터 누락없이 파싱 성공.

7. 어려운 프로젝트의 보상 - 지식 부스러기들

1) 2.5Mbps 에서 부터 종단 저항없이는 200m 라인 사용이 어려움.

6-700kbps 아래는 종단 저항없이 쉴드케이블 200m 정도는 가뿐히 동작.

UART 신호라면 over sampling 되는 uart 나 아예 gpio로 만들면 해결될 것으로 보임.

2) DMA 타이머 동작은 믿을만 하다. 항상 그렇지만 내가 문제.

3) 역시 내 음악 플레이 리스트의 효과가 좋구나.

4) 예전에는 이런 문제는 한달이상 소요되었는데 하루안에 되는 걸 보면 나도 이제 고인물?

5) 최적화를 거급하다보니 10Mpbs 에서 읽어내기가 초기에는 매우 빠듯했는데 , 이제는 RX TX 사이에

딜레이를 걸고 동작시킴. 너무 최적화했나..여유가 있으니 중간에 로직 처리를 더 넣더라도 마음이 편안함.

6) 현재 MCU 에서 20Mbps 읽기도 가능할거 같으나 스펙이 아니므로 그냥 할수 있을거 같다 정도..

7) 현재 MCU 가 최소의 사양으로 생각되었으나, 더더욱 노력하면 더 저가의 MCU 및 클럭으로도 가능할 것 같은

생각이 드나, 나는 용역이므로 여기서 마무리. 근데 자꾸 원가를 절감하지 않으면 무언가 마음 한켠이

불편함. 예전에는 남이 안하는 거 오버해서 제공했으나 프로는 돈보다 10-20%만 더해주면 됨.

더 해주면 내 손해, 고객 이익이 아니라 . 나도 손해, 장기적으로 고객도 손해. 이 시장의 다른 분들에게도 손해.

8) MCU 풀로 동작키시니 10Mbps 에서는 꽤 열이 발생. 항온조 테스트시 염려할 정도는 아니나

차가운 FPGA 에 비하면 없어보이는 정도. 이거는 MCU 의 한계. 전류 소모가 많음.

처리 속도를 낮추면 기가막히게 온도가 내려감. 100ns가 나름 MCU 입장에서는 빡신가 봄.

이제 해당 제품은 공식 인증절차에 들어가게 되는데 남은 지뢰가 얼마나 될지..걱정이지만 잘 될거라 봅니다.

예전에 제가 마이컴으로 10MBps 신호를 잡아서

CRC 처리하고 다 파싱해서 4us 안에

응답패킷(CRC 포함)을 만들어서 처리하는 프로젝트에 대해서 질문드린적이 있습니다.

다들 FPGA를 권하셨지만

(당연히 FPGA 사용이 맞는 프로젝트지요)

하지만!

이론적으로 가능하다는 결론을 내고 과감히 MCU 로 도전하였고 2달 고생해서 성공한 것으로 보입니다.

아래 신호는 10Mbps 신호를 파싱해서 3.46us 만에 정상 응답하는 결과물입니다.

현재는 HSI 로 처리해서 데이터를 놓치는 경우가 많습니다. HSE 로 해보니 데이터 유실 비율이 확연히 줄어들어서, 노이즈 처리 잘하고 좋은 오실레이터를 사용해서 보드를 제작하면 될 것으로 생각됩니다.

물론 100% 패킷을 보장해야 된다던지 특수한 오류 처리를 해야 된다던지 하는 조건에는 미달하지만

현재 정도라면 이 프로토콜에서는 양호한 수준이라 생각됩니다.

그동안 검토한 내용은 아래와 같습니다.

1. 통신 주파수에 맞는 최고 클럭 MCU 를 찾자.

2. 개발보드 구매후 실제 패킷을 아날라이저로 보고 프로토콜 사양서를 참조하여 파싱 알고리즘 작성 및 검증

3. 제일 느린 통신 속도에서부터 하나씩 검증.

4. HSE 와 HSI 통신 파싱 에러율 검토

5. 응답 속도를 최대한 빠르게 하기위하여 CRC 알고리즘 재작성 및 파싱 알고리즘 최적화

6. 그냥 패킷을 전체 받고 나중에 계산하는 것이 아니라 한비트씩 받으면서 모든 연산 처리

7. 보낼때도 다 패킷을 만들고 보내는 것이 아니라 STX 부터 보내면서 데이터를 만들어 처리

8. 모든 보내고 받는 연산은 DMA 처리

9. HAL 라이브러리 거의 들어내고 레지스터 직접 연산 처리

남들이 가지 않는 길을 가서 굉장히 불안했었는데 나름 쾌감이 드는 프로젝트가 된거 같습니다.

무조건 STM32H7가 이 이정도 다 처리된다고 생각하시면 안되고

프로토콜의 여러가지 개구멍을 이용하여 처리하였으므로

일반적으로 다른 프로젝트에 적용하시면 안되니 주의바랍니다.

FPGA 쓰셔요~~~

 

안녕하세요.

 

 

최근에 엄청난 속도 최적화를 해야 될 일이 있어서 몇달간 고생을 조금 하였습니다.

 

STM32H7 하에서 이루어진 작업이므로 모든 프로젝트에 적용하기는 어렵습니다만,

거의 공통적인 부분이라 ARM 계열은 최소한 비슷하리라 생각됩니다.

 

너무 뻔한 내용일 수도 있으니 병아리들만 보셔도 좋습니다.

 

일단 어떤 기법보다 확인하는 툴이 중요하겠지요.

 

[Tool]

1. Diassembly 디버깅

  1) 컴파일러 툴을 이용하여 디어셈블하면서 내 코드가 어떻게 변환되는지 확인한다.

  2) 어셈블리 코드를 몰라도 되며 몇줄로 바뀌는지만 확인하면 충분하다.

 

2. CPU Counter 레지스터가 있으면 원하는 함수 시작부터 마칠때까지 CPU 카운트를 확인하여

    몇 카운트가 흘렀는지를 확인하여 수치로 정확하게 확인해본다.

 

도구가 준비되었으면 이제는 내 머리가 준비되면 됩니다.

[기본 지식]

1. 속도와 용량 둘다 잡을 수 없다. 싸고 좋은 물건은 없다.

   속도가 빠르면 용량이 크고 , 용량이 좋으면 속도가 느리다.

 

2. 위 1번 툴을 이용하여 C 코드가 어떻게 변경되는지 감을 조금 잡는다.

 

-아래부터는 STM32 쪽

3. 라이브러리는 끝까지 추적해서 직접 제어 하도록 한다.

    STM32 의 경우 HAL 라이브러리는 되도록 자제하고 직접 레지스터를 제어한다.

    그렇다고 무식하게 번지를 그냥 입력해서 가독성이 떨어지도록 할 필요는 없다.

 

4. 컴파일러 옵션은 speed 최대

 

5. 시스템의 캐쉬를 켤수 있다면 On ( 7-10배 증가)

 

6. DTCM 과 ITCM 이해

 

7. Bus 아키텍처를 보고 가장 짧은 라인으로 데이터가 움직이도록 처리

 

8. 되도록 DMA 처리

 

9. flash 보다는 ram 에서 실행하는게 더 빠르겠지요.

 

 

최근 17년전에 작성한 프로그램을 다시 추가 개발하고 있습니다.

 

당시 7년차일때 작성한 리눅스 프로그램으로 출장개발로 1년이 걸렸지요.

현재까지도 이 프로그램을 잘 운영되고 있고, 운영사에서 직접 유지보수하고 있지만

다른 개발자 5명 이상은 손을 거쳐간 프로그램이 되었습니다.

단순 테스트 검증시 1주일, 상세 검증은 한 달이 걸리는 나름 규모가 있는 프로그램입니다.

 

라인수 카운트를 해보니 6만5천줄 정도 되네요. 흥미로운 사실은 개발당시 리눅스 라이브러리에 대한 고정관념 같은게 있어서, C standard 라이브러리 이 외에는 전혀 다른걸 사용하지 않았다는 겁니다. 해당 줄 수가 실제 제가 코딩한 전부라는 거지요. xml parser, ftp 등등을 무슨 똥배짱인지 직접 다 코딩했었지죠. 이런 무식이! T.T

 

이 프로그램을 다시 개발하게 되었을 때 예전의 나를 보는 것 마냥 두근대고 부끄러워지더군요.

 

막상 소스를 열어보니 웬걸 제법 잘 짰는데..라고 생각되었습니다 (자화자찬 +.+)

main 문 안에 전부 task 처리하고, 변수는 struct 로 묶어서 전부 포인터 처리.

더 놀라운 사실은 17년동안 해당 전체 구조가 전혀 바뀌지 않은 상태로 유지되었다는 거고,

다른 개발자들도 제가 짠 구조 아래서 그 구조를 답습하여 프로그램을 개발해왔다는 사실입니다.

사실, 누구라도 외주 개발사 입장에서는 맘에 안들어도 전체를 뜯어 고치는 일은 전혀 다른 일이긴 합니다.

 

이번 수정은 추가 장비가 붙는 바람에 약 10% 정도 수정이 필요한 작업이었는데, 실제 집중 투여한 시간은 20일 정도입니다. 예전 7년차 개발 속도라면 2개월이 걸릴 일이 되겠군요. 17년만에 3배 이상 빨라진거 같습니다.

 

이번에 수정해야 할 부분 중  개발 당시 제일 애를 먹었던 알고리즘 수정 부분이 있었는데

도대체 왜 이렇게 구현했는지 소스를 따라가도 남의 소스를 보는 마냥 이해가 되지 않는 것이이었습니다.

그래서 해당 부분은 그 대로 남기고 , 오롯이 새로 코딩해보니 ,

결국 원래 부분과 똑같이 구현되는 것을 발견했습니다. 아, 그때 삽질한 게 아니었구나.. 하는 걸 알게 되었지요.

 

리눅스 시스템이나 쓰레드도 없는 함수 태스크 방식의 루프 프로그램이었지만

그 당시에 정말 예쁘게 짜려고 , 프로그램 경력에 오점을 남기지 않으려고 (다른 사람이 욕하는 프로그램을 짜면 안되니깐..) 나름 노력했었는데, 한참뒤에 제가 그걸 돌려받게 될 줄은 전혀 몰랐지요.

 

예전의 나의 모습을 거울로 다시 보는 듯한 경험.

그 당시의 고민의 흔적을 다시 되새기며, 그때 왜 그랬을까 한줄한줄 따라가다가

그 길이 최선이있다는 재발견.

 

흥미로운 경험이었습니다~~~

 

 

안녕하세요.

많이들 사용하는 NXP RFID (13.56Mhz) 들 칩들만 보기 쉽도록 정리해보았습니다.

단종된 제품(구할 수는 있습니다) 도 있지만 주로 통용되는 칩들이죠.

PN 시리즈와 Micom 포함된 RFID 칩은 제외했습니다.

또한, 타사 제품으로 3s logic 사 것도 있고 st 사 것도 있지만, 그거는 제가 관심만 가지고 실제 사용해보지 않아서

알려드릴 것이 없군요. NXP 사도 Micom 포함된 chip 이 더 싸야 될거 같은데, rfid 칩 따로 cpu 따로 하는 것이 더 저렴합니다.

재밌있는 사실은 특별한 레지지터 지원 유무에 따라 더 세분화된 버전도 있습니다.

정리해보니 plus 모델 빼고 종류별로 20년간 다 사용해보았군요.

NXP 에서 왜 이리 많은 칩들이 있냐면 내부적으로 버전이 올라감에 따라 기능이 개선된게 많습니다.

칩 버그도 개선이 되어서 , 간단한 tag 읽는 정도면 아주 예전 모델도 관계가 없습니다만

교통카드 프로젝트에 사용한다면 최신 칩을 사용하는 것이 안전하지요.

실제로는 66301 / 66302 / 66303 이렇게 세부 버전따라 가격과 기능이 다르긴 한테 큰 변화는 없지요.

참고로 아두이노에서 많이 사용하시는 rc522 보드를 보시면 mfrc522 을 사용하는데 기본적으로 감도가 다른 것이 비해서 낮습니다. 또한 , 말그대로 개발보드이지 rf 튜닝자체가 안되어있는 보드라 "tag 가 읽히네" 여기까지만 의미가 있고

혹시나 싸다고 그런 보드로 양산할 생각을 하시면 큰일납니다. 리더는 하나지만 tag 제조사 및 종류는 수만가지지요.

도움이 되었으면 합니다.

 

+ Recent posts