2016-05-01 10 views
0

Я использую чип digipot Mcp41010 и задаюсь вопросом, как изменить положение стеклоочистителя чипа с аналоговым входным напряжением, которое я могу настроить, мне нужен способ декрементации (-) положение стеклоочистителя, если напряжение перейдет в определенную точку и увеличит (++) положение стеклоочистителя назад в нормальное положение, это код, который я обнаружил, что просто исчезает положение стеклоочистителя вверх и вниз. Мне нужно способ управления им. Я до сих пор очень новичок в arduino, так жаль, если мое объяснение было достаточно ясным.Как управлять позицией стеклоочистителя Mcp41010 с аналоговым значением

int CS_signal = 12;      // Chip Select signal onsul pin 2 of Arduino 
int CLK_signal = 52;      // Clock signal on pin 4 of Arduino 
int MOSI_signal = 51;     // MOSI signal on pin 5 of Arduino 
byte cmd_byte2 = B00010001 ;   // Command byte 
int initial_value = 100;    // Setting up the initial value 

void initialize() {      // send the command byte of value 100 (initial value) 
spi_out(CS_signal, cmd_byte2, initial_value); 
} 

void spi_out(int CS, byte cmd_byte, byte data_byte){       // we need this function to send command byte and data byte to the chip 

digitalWrite (CS, LOW);             // to start the transmission, the chip select must be low 
spi_transfer(cmd_byte); // invio il COMMAND BYTE 
delay(2); 
spi_transfer(data_byte); // invio il DATA BYTE 
delay(2); 
digitalWrite(CS, HIGH);             //  to stop the transmission, the chip select must be high 
} 

void spi_transfer(byte working) { 
for(int i = 1; i <= 8; i++) {           //  Set up a loop of 8 iterations (8 bits in a byte) 
if (working > 127) { 
digitalWrite (MOSI_signal,HIGH) ;         // If the MSB is a 1 then set MOSI high 
} else { 
digitalWrite (MOSI_signal, LOW) ; }         // If the MSB is a 0 then set MOSI low           

digitalWrite (CLK_signal,HIGH) ;          // Pulse the CLK_signal high 
working = working << 1 ;            // Bit-shift the working byte 
digitalWrite(CLK_signal,LOW) ;           // Pulse the CLK_signal low 
} 
} 

void setup() { 
pinMode (CS_signal, OUTPUT); 
pinMode (CLK_signal, OUTPUT); 
pinMode (MOSI_signal, OUTPUT); 

initialize(); 

Serial.begin(9600);              // setting the serial speed 
Serial.println("ready!"); 
} 

void loop() { 
for (int i = 0; i < 255; i++) { 
spi_out(CS_signal, cmd_byte2, i); 
Serial.println(i); delay(10); 
} 
for (int i = 255; i > 0; --i) { 
spi_out(CS_signal, cmd_byte2, i); 
Serial.println(i); 
delay(10); 
} 
} 
+0

Вы должны инициализировать SPI, прежде чем использовать его. Не нужно настраивать MOSI, MISO, SCK вручную. Посмотрите на официальный пример SPI в качестве отправной точки. –

+0

Я думаю, что нашел ответ на мою проблему. Я отвечу, потому что не могу поместить свой код в комментарий. – ChrisPlusPlus

+0

@ Владимир Цыкунов - В настоящий момент мой код работает в основном смысле, когда у меня есть подробности, я вернусь к вам. – ChrisPlusPlus

ответ

0
int CS_signal = 12;      // Chip Select signal onsul pin 2  of Arduino 
int CLK_signal = 52;      // Clock signal on pin 4 of Arduino 
int MOSI_signal = 51;     // MOSI signal on pin 5 of Arduino 
byte cmd_byte2 = B00010001 ;   // Command byte 
int initial_value = 100;    // Setting up the initial value 

void initialize() {      // send the command byte of value 100 (initial value) 
spi_out(CS_signal, cmd_byte2, initial_value); 

}

void spi_out(int CS, byte cmd_byte, byte data_byte){      // we need this function to send command byte and data byte to the chip 

digitalWrite (CS, LOW);             // to start the transmission, the chip select must be low 
spi_transfer(cmd_byte); // invio il COMMAND BYTE 
delay(2); 
spi_transfer(data_byte); // invio il DATA BYTE 
delay(2); 
digitalWrite(CS, HIGH);             // to stop the transmission, the chip select must be high 
} 

void spi_transfer(byte working) { 
for(int i = 1; i <= 8; i++) {           // Set up a loop of 8 iterations (8 bits in a byte) 
if (working > 127) { 
    digitalWrite (MOSI_signal,HIGH) ;         // If the MSB is a 1 then set MOSI high 
} else { 
    digitalWrite (MOSI_signal, LOW) ; }         // If the MSB is a 0 then set MOSI low           

digitalWrite (CLK_signal,HIGH) ;          // Pulse the CLK_signal high 
working = working << 1 ;            // Bit-shift the working byte 
digitalWrite(CLK_signal,LOW) ;           // Pulse the CLK_signal low 
} 
} 

void setup() { 
pinMode (CS_signal, OUTPUT); 
pinMode (CLK_signal, OUTPUT); 
pinMode (MOSI_signal, OUTPUT); 

initialize(); 

Serial.begin(9600);              // setting the serial speed 
Serial.println("ready!"); 
} 

    void loop() { 
    // read the input on analog pin 0: 
    int sensorValue = analogRead(A0); 
    if(sensorValue <= 200){ 
    // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V): 
    float voltage = sensorValue * (5.0/1023.0); 
    // print out the value you read: 
    Serial.println(voltage); 

    int i = sensorValue;{ 
    spi_out(CS_signal, cmd_byte2, i); 
    Serial.println(i); 

    } 
    } 

    } 
+0

Я вроде как разобрался, но это код, который работает для того, что я хочу делать. – ChrisPlusPlus

+0

Хорошо, что вы делаете настройки низкого уровня из своего собственного кода. Когда проблемы будут решены, лучше перейдите к изъятию библиотек Arduino, это поможет сэкономить ваше время в будущем. –