हैलो, मैं TI CC3220SF इंट्रो प्रोग्राम चला रहा हूं जो एकीकृत तापमान सेंसर को दिखाता है। इस सेंसर से संचार I2C का उपयोग कर रहा है जो सुविधाजनक है क्योंकि मैं एक ही प्रोटोकॉल का उपयोग करके एक अलग अधिक सटीक सेंसर को लागू करना चाहता हूं। टीआई द्वारा दिए गए उदाहरण में वे तापमान को एक इंट के रूप में मापते हैं जो सटीक माप को रोक रहा है। मैंने तापमान मान कास्टिंग टाइप करने की कोशिश की लेकिन यह काम नहीं कर रहा है। क्या कोई इस समस्या को कम करने में मेरी मदद कर सकता है?

/*
 *  ======== mainThread ========
 */
void *mainThread(void *arg0)

{
  unsigned int    i;
  uint16_t        temperature;
  uint16_t        temperature_f;
  uint8_t         txBuffer[1];
  uint8_t         rxBuffer[2];
  I2C_Handle      i2c;
  I2C_Params      i2cParams;
  I2C_Transaction i2cTransaction;

/* Call driver init functions */
Display_init();
GPIO_init();
I2C_init();

/* Configure the LED pin */
GPIO_setConfig(Board_GPIO_LED0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

/* Open the HOST display for output */
display = Display_open(Display_Type_UART, NULL);
if (display == NULL) {
    while (1);
}

/* Turn on user LED */
GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_ON);
Display_printf(display, 0, 0, "Starting the i2ctmp006 example\n");

/* Create I2C for usage */
I2C_Params_init(&i2cParams);
i2cParams.bitRate = I2C_400kHz;
i2c = I2C_open(Board_I2C_TMP, &i2cParams);
if (i2c == NULL) {
    Display_printf(display, 0, 0, "Error Initializing I2C\n");
    while (1);
}
else {
    Display_printf(display, 0, 0, "I2C Initialized!\n");
}

/* Point to the T ambient register and read its 2 bytes */
txBuffer[0] = TMP006_DIE_TEMP;
i2cTransaction.slaveAddress = Board_TMP_ADDR;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.readCount = 2;

/* Take samples and print them out onto the console */
for (i = 0; i <= 5; i++) {
    if (I2C_transfer(i2c, &i2cTransaction)) {
        /* Extract degrees C from the received data; see TMP102 datasheet */
        temperature = (rxBuffer[0] << 6) | (rxBuffer[1] >> 2);

        /*
         * If the MSB is set '1', then we have a 2's complement
         * negative value which needs to be sign extended
         */
        if (rxBuffer[0] & 0x80) {
            temperature |= 0xF000;
        }
       /*
        * For simplicity, divide the temperature value by 32 to get rid of
        * the decimal precision; see TI's TMP006 datasheet
        */
        temperature /= 32;
        temperature_f = ((temperature * 9 / 5) + 32);

        Display_printf(display, 0, 0, "Sample %u: %d (C)", i, temperature);
        Display_printf(display, 0, 0, "       %u: %d (F)\n", i, temperature_f);
    }
    else {
        Display_printf(display, 0, 0, "I2C Bus fault\n");
    }

    /* Sleep for x seconds */
    sleep(1);
}

/* Deinitialized I2C */
I2C_close(i2c);
Display_printf(display, 0, 0, "I2C closed!\n");

return (0);
}
c
0
Coding Master Brody 10 जिंदा 2019, 20:08

1 उत्तर

सबसे बढ़िया उत्तर

ये दो पंक्तियाँ पूर्णांक गणित करती हैं जो सटीकता से छुटकारा दिलाती हैं

temperature /= 32;
temperature_f = ((temperature * 9 / 5) + 32);

आपको एक नया चर परिभाषित करना होगा और temperature_f प्रकार बदलना होगा।

float ftemperature = 0.0f;
float temperature_f = 0.0f;
...
ftemperature = temperature / 32.0f;
temperature_f = ((ftemperature * 9.0f / 5.0f) + 32.0f);

अधिक स्पष्ट होने के लिए, आप temperature की कास्ट इस प्रकार उपयोग कर सकते हैं:

ftemperature = ((float) temperature) / 32.0f;

हालांकि, 32.0f संकलक को उस रूपांतरण को परोक्ष रूप से करने के लिए कहने के लिए पर्याप्त है।

अब आपके पास वह सटीकता है जो आप ftemperature और temperature_f में चाहते हैं। फिर आप इसका उपयोग प्रदर्शन कार्यों में कर सकते हैं।

Display_printf(display, 0, 0, "Sample %u: %f (C)", i, ftemperature);
Display_printf(display, 0, 0, "       %u: %f (F)\n", i, temperature_f);

%f प्रारूप को थोड़ी मदद की आवश्यकता हो सकती है। आप %g का भी उपयोग करना चाह सकते हैं। इसके बारे में विवरण के लिए printf दस्तावेज़ देखें।

1
Alexis Wilke 10 जिंदा 2019, 20:44