====== AN32011 - MODPORT를 이용한 A/D변환 ====== 큐블록에는 10비트의 A/D변환기가 들어있습니다. 이것보다도 더 높은 해상도의 A/D변환기가 필요하신 분은 별도로 A/D칩을 붙여서 해결해야 합니다. (http://blog.naver.com/cubloc/220477285916) 그런데, A/D칩을 바로 센서에 붙이면, 온갖 노이즈와 함께 들어오므로 측정결과가 매우 흔들리고 맙니다. 부가적인 노이즈 제거 회로를 앞에 붙여주어야 만족할 만할 값을 읽어올 수 있습니다. 초보자 입장에서는 만만한 일이 아닙니다. 그래서 저는 A/D칩보다는 A/D모듈을 추가해서 RS232 (또는 RS485)로 읽어오는것을 추천해드리고 있습니다. (http://blog.naver.com/cubloc/220061594085) 저희 회사 제품중에 "모드포트"라는 제품이 있습니다. RS485 모드버스 프로토콜로 연결해서 다양한 I/O를 연결할 수 있는 제품입니다. 이중 고해상도 A/D변환기가 있습니다. 13.3비트 짜리 A/D변환기 입니다. 이 것을 큐블록 MSB와 연결해 보았습니다. {{ :cublocapp:an32011:dsc03761.jpg?nolink |}} 큐블록 MSB610L-DC를 사용했습니다.이 제품은 RS232C 채널1만 있으므로, RS232-TO-RS485 변환기가 필요합니다. CN-RS232485변환기를 사용해서 MODPORT와 연결했습니다. ====== 소스 프로그램 ===== 다음과 같이 프로그래밍을 했습니다. 모드버스 프로토콜로 데이터를 읽어오는 프로그램입니다. {{ :cublocapp:an32011:an32011.zip |}} #include "MSB6XX" #define ComChannel 1 Dim _CMTxb(20) As Byte Dim _CMrxdata(32) As Byte Dim _Crcvalue As Integer Opencom ComChannel,57600,3,50,50 Dim tempA As Long Do tempA = EPhadin(1,1) Debug Dec tempA,Cr Wait 1000 Loop End Function EPhadin(CMPid As Byte, CMPno As Byte) As Long Dim tempva As Long Bclr ComChannel,0 CMBreadReg CMPid,CMPno+199,2 Delay 3 If Blen(ComChannel,0) > 6 Then Geta ComChannel,_CMrxdata,7 tempva = _CMrxdata(3) tempva = tempva * 256 + _CMrxdata(4) tempva = tempva * 256 + _CMrxdata(5) tempva = tempva * 256 + _CMrxdata(6) EPhadin = tempva Else EPhadin = 199999 '모듈못찾으면 199999 1~5v모드시 1v이하는 -111111, 5v이상은 +222222 Endif '음수는 2의 보수가 아니고, MSB만 1로 됨. Bclr ComChannel,0 End Function ' 여기서부터 모드버스 RTU용 라이브러리입니다. Sub CMBreadReg(_MBslave As Byte,_MBadr As Integer,_MBlen As Integer) _CMTxb(0) = _MBslave _CMTxb(1) = 3 _CMTxb(2) = _MBadr.Byte1 _CMTxb(3) = _MBadr.Byte0 _CMTxb(4) = _MBlen.Byte1 _CMTxb(5) = _MBlen.Byte0 Getcrc _Crcvalue,_CMTxb,6 _CMTxb(6) = _Crcvalue.Byte1 _CMTxb(7) = _Crcvalue.Byte0 Puta ComChannel,_CMTxb,8 End Sub ===== 실행결과 ===== 결과가 디버그창에 이렇게 표시됩니다. 노이즈제거 회로가 들어가 있어서, 안정적으로 값이 읽혀집니다. {{ :cublocapp:an32011:hadindebug.png?nolink |}} [[cublocapp:index|큐블록 어플리케이션 노트]]