2017-11-09 3 views
0

화학 실험실에서 사용하고있는 연구 프로젝트에서 우리는 ADS8320 칩을 사용하고 있습니다 (데이터 시트는 here입니다.이 도구를 사용하여 전위차계를 사용하여 전압 판독기를 내가 Processing.org에서 this code를 사용하여 데이터를 얻을 수 있었다하는 동안 라즈베리 파이 3. SPI 핀 : 나는에 촬영할 때 나는 65535의 값을 받고해야하는 데이터 시트에 읽은 내용에서SPI 데이터 처리시 비트 시프트 사용

import processing.io.*; 
SPI adc; 

void setup() { 
    //printArray(SPI.list()); 
    adc = new SPI(SPI.list()[0]); 
    adc.settings(500000, SPI.MSBFIRST, SPI.MODE0); 
} 

void draw() { 
    // read in values over SPI from an analog-to-digital 
    // converter 
    // dummy write, actual values don't matter 
    byte[] out = { 0, 0 }; 
    byte[] in = adc.transfer(out); 
    // some input bit shifting according to the datasheet 
    int val = ((in[0] & 0x1f) << 5) | ((in[1] & 0xf8) >> 3); 
    // val is between 0 and 1023 
    println(val); 
} 

최대 전압. 대신 최대 전압을 가져갈 때 127의 값을 얻고 있습니다. 나는 한 달 전에 거의 좋은 프로그래머를 선택하지는 않았지만 코드의 비트 시프트 라인에 문제가 있다고 생각합니다. :

int val = ((in[0] & 0x1f) << 5) | ((in[1] & 0xf8) >> 3); 

이것이 문제인 경우 어떻게하면 16 비트 ADS 칩과 작동하도록 설정합니까? 이 비트 쉬프트가 실제로 무엇인지 설명해 주시겠습니까? 내가 발견 한 모든 소스에서 저를 더 혼란스럽게 만들었 기 때문입니다. 이 문제에 도움이된다면 엄청 도움이 될 것입니다! 또한 중요한 정보가 누락 된 경우 나에게 알려주십시오. 다시 한 번 나는 아직 완전히 새로운 소식입니다.

+0

[프로그램 디버깅] (http://happycoding.io/tutorials/processing/debugging)을 사용하고 [mcve]로 문제를 좁히면 더 나은 행운을 볼 수 있습니다. in [0]과 in [1]의 값은 무엇입니까? 그들은 당신이 기대하는 것입니까? 그 복잡한 선을 여러 단계로 나눕니다. 어떤 단계가 예상 한 것과 다르게 행동합니까? 그렇다면 당신이 붙어 있다면, 당신은 단지 여분의 데이터를 읽지 않고 모든 몇 줄의 [mcve]를 게시 할 수 있습니다. 대신 값을 하드 코딩하십시오. –

+0

신난다. 나는 그것을 나눌 것이고, 내가 가치를 얻을 수 없는지 알 것이다. 그 선은 매우 복잡했고 나에게 1 톤을 혼란스럽게했다. 나는 그것을 나눠서 작동 코드를 얻지 못했는지, 아니면 적어도 더 나은 간결한 예제가 있는지 살펴볼 것이다. – Samsanit

+0

데이터 시트의 24 페이지에 따르면 처음 6 비트와 마지막 2 비트를 버려 2 대신 3 바이트를 읽어야 할 수도 있습니다. 결과적으로, 비트 시프트 표현은''''int val = (in [0] & 0x03) << 14) | ([1] << 6) | ([2]와 0x3f에서)'''Wikipedia는 비트 시프트 연산을 포함하여 [C에서의 비트 연산] (https://en.wikipedia.org/wiki/Bitwise_operations_in_C#Shift_operators)에 대해 이야기합니다. – v1bri

답변

1

코드 줄은 칩에서 10 비트 값을 읽는 방법입니다. 입력 0 ([0])은 데이터의 최상위 5 비트를 가지고 입력 1 ([1]에서)은 최하위 5 비트를 갖습니다. 따라서 시프트 조작. 데이터에 10 비트가 있다고 가정하면 (0b00011111 AND Input [0]) 5를 왼쪽으로 이동합니다. 그러면 0b11111000 AND Input [1]을 수행하고 3만큼 오른쪽으로 시프트합니다. OR val1 | val2과 함께 사용하면 10 비트 값이 남습니다. 그러나 칩의 데이터 시트를 방문하면 칩은 16 비트 ADC이므로 판독하지 않는 여분의 6 비트를 읽으려면 다른 핀이 필요합니다. 또한 비트 스트림의 방향을 바꿀 수 있으므로 [0]과 [1]에 올바른 핀을 연결해야합니다.