Controlando la salida DAC de 8 bits sobre I2C: ayuda de conversión de caracteres decimales a binarios

1

Aclarando mi pregunta un poco. Estamos utilizando una placa PIC32 con un DAC de 8 bits MCP4706, controlado sobre I2C. Si escribimos un valor binario (por ejemplo, 0b00000100) en el DAC, sale como se espera. Sin embargo, estamos tratando de cambiar de manera incremental la salida de voltaje del DAC, que ingresa a un seguidor de voltaje que controla un MOSFET que permite que la corriente fluya desde una fuente de alta corriente a una batería.

Aquí hay un esquema de todo eso. No es perfecto, pero sale del punto.

Un pin analógico mide el valor de salida de un sensor de corriente en línea con la batería, que controla el flujo de corriente, esencialmente. Actualmente, nuestra conversión entre voltaje y corriente se realiza de manera arbitraria, lo cual está bien. Busco obtener valores cada vez mayores del DAC, pero estoy leyendo 0.00V en todo momento desde la salida, a menos que establezca manualmente el valor DAC. Aquí estoy agregando un código diferente:

// Control voltage sent to DAC as a function of Cvolt read from current sensor
void CurrentControl()
{
    double current;
    // Gets values for Cvolt and Bvolt
    getAnalog();
    // ARBITRARY CONVERSION, NEED TO CHANGE
    current = Cvolt*.0035;

    // Current should be between 8A and 9A at all times for safety
    if(current <= 8.0)
    {
        // if current is less than 8A, increase DAC value
        shift = shift + 1;

        // safety control; keep shift at 255 (max) if it tries to go higher
        if(shift > 255)
            shift = 255;
        // write value to DAC Vout register
        SendI2C3(DAC,0b00000000,shift);
    }
    else if(current >= 9.0)
    {
        // if current is more than 9A, decrease DAC value
        shift = shift - 1;

        // safety control; keep shift at 0 if it tries to go lower
        if( shift < 0)
            shift = 0;
        // write value to DAC Vout register
        SendI2C3(DAC,0b00000000,shift);
    }
}

.

.
.

// Send data to I2C line at given address
void SendI2C3(char addrs,char regis, char data)
{
    char ack;
    I2C_start();
    ack=I2C_write(addrs); //Address for LED is 0x50
    ack=I2C_write(regis); //0xFE for LED
    ack=I2C_write(data);  //0x20to0x7F standard
    I2C_stop();
}
    
pregunta alextoombs

3 respuestas

1

Dado que "dec" es un int, ya es un valor binario. Solo debes asegurarte de que esté entre 0 y 255 inclusive, y enviarlo al DAC, sin necesidad de conversión de decimal a binario (y tu confusión con los arreglos de caracteres y cadenas no sirve de nada).

Puede ser útil ver cómo establece "dec" en el valor deseado ...

    
respondido por el Peter Bennett
0

necesitas definir char bitsc; como un puntero char (char * bitsc;), entonces su declaración  bitsc = (char) bits; Habrá que cambiar a bitsc = bits; por lo tanto, de esta manera tiene sentido asignar el puntero de los bits de la matriz a los bits de puntero de caracteres. lo que debería solucionar el error en su printf ya que ahora está proporcionando un puntero de carácter para el argumento relacionado con el modificador% 8s. No estoy completamente seguro, pero luego intentaría char * high="0b11111111"; y char * low="0b00000000"; Finalmente, en C, no puede devolver una cadena desde una función; sin embargo, puede devolver un puntero a la cadena, por lo que la definición de la función tendría que cambiar a char * decToDAC (int dec), que debería estar bien, ya que ahora devolverá char * pointer a las cadenas binarias

    
respondido por el Kvegaoro
0

Debido a que el valor ya es un entero, debería poder usar el código que se muestra a continuación utilizando putchar para generar directamente el valor en binario.

He incluido los valores de retorno que tenía en el código original, aunque no los recomendaría porque no hay manera de decir la diferencia entre un valor menor que cero y cero y el mismo para los números de rango excesivo y 255.

char decToDAC(int dec) {
   if (dec > 255)
      return 0xFF;
   else if (dec < 0)
      return 0x00;
   else {
       putchar(dec);
       return dec;
    }
}
    
respondido por el PeterJ

Lea otras preguntas en las etiquetas