0

如何获取变量伏特以在 LCD 上显示浮点数?

LCD 只显示带有很多小数位的浮点值,并以 E 结尾。我只需要 2 个小数位,那么如何显示呢?

int main (void){

    adcinit();

    lcd_init();//initializes LCD
    lcd_clear();//clear screen
    lcd_home();


    uint16_t value;
    float volts;
    while(1){
        ADCSRA |= (1<<ADSC);//start ADC conversion
        delay_ms(54);//delay 54 millisecond
        value = ADCW;//assign ADC conversion to value
        volts=(value*5)/1023;
        lcd_goto_xy(0,0);// coordinates of the cursor on LCD Display
        lcd_printf("ADC Value: %d ",value);//display on LCD
        lcd_goto_xy(0,1);// coordinates of the cursor on LCD Display
        lcd_printf("Volts: %f ",volts);//display on LCD
    }
}
4

3 回答 3

2

我在原始帖子的最后一句话中回答问题 - 而不是标题。但这是您项目的正确答案。

你说“我只需要 2 位小数” - 所以这应该告诉你不需要浮点数学。物理学家和工程师需要浮点数来表示非常非常小或非常非常大的数量,但您需要“定点” - 这意味着进行整数数学并正确选择单位。定点更快,更准确,并减少了编译二进制文件的大小,因为不需要浮点代码。

最简单的解决方案是使用整数并显示毫伏,就像您刚刚使用的 delay() 函数接受整数毫秒数的参数一样,而不是小数秒数。

#define VREF 5000
uint32_t mvolts;
.
.
mvolts=(value*VREF)>>10; // No floats here...
lcd_printf("milliVolts: %d",mvolts); // ...and no casts

如果您必须显示电压,那么这可以解决问题:

lcd_printf("Volts: %d.%02d ",mvolts/1000, (mvolts%1000)/10);

请注意,顺便说一句,mvolts 是一个 32 位整数,因为您现在将 10 位数字乘以 5000,而这不适合 16 位。这是必需的,因为您需要在进行缩放时保持值的准确性。我不认为这是题外话,因为我认为您确实想要显示正确的值,或者显示这两个小数位是没有意义的。

除非你很小心,否则编译器将计算出 5000/1024 - 4.8828125 的值 - 然后进行整数运算,这会切断小数部分并最终将 ADC 结果乘以 4。为了保证正确的行为,请乘以5000 然后除以 2 个单独的操作。因为 1024 是 2**10,所以右移 10 位等同于除以 1024。

最后 - 不要假设从 ADC 读取 1023 实际上意味着 5.000 伏到 4 位有效数字;通过调整来校准经过测试的电压表#define VREF以获得正确的结果。

于 2016-11-22T14:44:57.270 回答
0

如果函数lcd_printf()基于与 Arduino 函数相同的库sprintf(),则格式说明符'%f'即使用作'%.2f'.

第 1 步:在提出替代解决方案之前,有必要从从模数转换器读取的数值中得到一个经过良好计算的浮点值。

如果 ADC 是10-bits,则范围应该是1024(而不是 1023)。

value = ADCW;//assign ADC conversion to value
volts=((float)value*5.0f)/(1024.0f); 

Step2.1:显示 2 位小数固定浮点值的第一个快速解决方案是将其转换为 2 个整数。

lcd_printf("Volts: %d.%02d ",(int)volts, (int)(volts*100)%100));//display on LCD

代替

lcd_printf("Volts: %.2f ",volts);//display on LCD

步骤 2.2:显示 2 位小数固定浮点值的更“官方”解决方案是使用“Arduino sprintf float not formatting”dtostrf()中提出的函数。

char str_volts[15]; // to store the float-to-string converted value
lcd_printf("Volts: %s ",dtostrf(volts, 4, 2, str_volts));//display on LCD
// 4 = minimum number of char ('X.XX'), 2 = number of decimals

代替

lcd_printf("Volts: %.2f ",volts);//display on LCD
于 2016-11-21T12:51:15.183 回答
0

尝试这个:

编辑:我刚刚编辑了电压的显示,因为值是 int。但原则是一样的。

int main (void){

    adcinit();

    lcd_init();//initializes LCD
    lcd_clear();//clear screen
    lcd_home();


    uint16_t value;
    float volts;
    while(1){
        ADCSRA |= (1<<ADSC);//start ADC conversion
        delay_ms(54);//delay 54 millisecond
        value = ADCW;//assign ADC conversion to value
        volts=(float)(value*5)/1023;
        lcd_goto_xy(0,0);// coordinates of the cursor on LCD Display
        lcd_printf("ADC Value: %d ",value);//display on LCD
        lcd_goto_xy(0,1);// coordinates of the cursor on LCD Display
        lcd_printf("Volts: %.2f ",volts);//display on LCD
    }
}
于 2016-11-21T05:09:32.443 回答