Энкодер двоично - десятичный. первые четыре бита (единицы из 10) досчитывают до 9 и происходит перенос разряда в пятый бит (десятки). Затем 5,6,7,8 биты досчитывают до 9, и происходит перенос разряда в бит 9.
Для BCD кода. Код (C++): static const uint8_t input_pin[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Config Pins Input Here bit-0 to 9 unsigned int Read_input(){ unsigned int res(0); for ( uint8_t i = 4; --i; ) // 3 .. 1 { uint8_t D(0); // decimal digit for( uint8_t j = 5; --j; ) // 4 .. 1 { D << 1; D |= digitalRead( input_pin[ 4 * i - j ]) == LOW; // Bitwise for active LOW } res = res * 10 + D; } // Print 0-1023 position with line feed return res; }
это зачем? хэш какой то... Код (C++): ^ (dec_position&0x1) Код (C++): dec_position = pin_state[9]; for( int i = 8; i >= 0; i = i -1){ dec_position = (dec_position << 1) | (pin_state[i]); }
Для бинарного 10 битного Код (C++): static const uint8_t input_pin[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Config Pins Input Here bit-0 to 9 unsigned int Read_input1024(){ unsigned int res(0); for ( uint8_t i = 10; i--; ) // 9 .. 0 { res << 1; res |= digitalRead( input_pin[ i ]) == LOW; // Bitwise for active LOW } // Print 0-1023 position with line feed return res; }
У вас в коде нет синхронизации опроса со сменой кода. Пока ардуина читает бит, другие биты могут поменяться. Нужно сразу после изменения бита 0 (+ небольшая фора ) начинать чтение, пока код установлен. Или подряд два показания снимать. Если не поменялись, значит можно засчитывать попытку. Если поменялись, первое отбрасываем и повторяем попытку.
С синхронизацией. Исправлено и проверено на стенде. Код (C++): // 1.1 static const uint8_t input_pin[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Config Pins Input Here bit-0 to 9 unsigned int Read_input1024(){ // 10 бит binary unsigned int res(0); for ( uint8_t i = 10; i--; ) // 9 .. 0 { res = ( res << 1 ) | digitalRead( input_pin[ i ] ) == LOW; // Bitwise for active LOW } // Print 0-1023 position with line feed return res; } void setup() { // put your setup code here, to run once: Serial.begin(9600); while(!Serial){} Serial.println("Starting..."); for(byte i = 10; i--; ){ // declare pin mode pinMode( input_pin[i], INPUT ); } } void loop() { // put your main code here, to run repeatedly: static unsigned int v1( 0xFFFF ); bool new_v(false); unsigned int v2; while ( ( v2 = Read_input1024() ) != v1 ) { // значение изменилось, повторим попытку до стабилизации v1 = v2; new_v = true; // если значение не менялось, new_v останется false } if ( new_v ) { // значение изменилось, обработаем его Serial.print( v2 , BIN); Serial.print( "\t" ); Serial.println( map( v2, 0, 1024, 0, 360), DEC); // градусы } }