mtiaopi 发表于 2024-3-26 15:02:49

求教:用冲哥视频里的程序串口打印ADC数值

视频里的程序打印的是mv,如何转换成带小数的V打印出来

#include "COMM/STC32G.h"
#include "COMM/usb.h"
#include "adc.h"

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD="@STCISP#";


void main()
{
        u16 adc_val;
        sys_init();
        usb_init();
        ADC_init();
        EA=1;
        P2M0=0X00;
        P2M1=0X00;
        while(1)
        {
                delay_ms(2);
                if(DeviceState !=DEVSTATE_CONFIGURED)
                        continue;
                if(bUsbOutReady)
                {
                        usb_OUT_done();
                }
                adc_val=ADC_Read(0);
                printf ("当前ADC数\xfd值:%d\t%dmv\r\n",(int)adc_val,ADC_CAL_Voltage(adc_val));
        }
}

乘风飞扬 发表于 2024-3-26 16:07:40

printf使用 %f 可以打印浮点数数据,将mv数据/1000,然后使用 %f 打印结果就行。

mtiaopi 发表于 2024-3-26 17:25:07

乘风飞扬 发表于 2024-3-26 16:07
printf使用 %f 可以打印浮点数数据,将mv数据/1000,然后使用 %f 打印结果就行。 ...

printf ("当前ADC数\xfd值:%d\t%fmv\r\n",(int)adc_val,ADC_CAL_Voltage(adc_val/1000));

这样吗?改成这样的话显示就是下面的怎么调后面的0.000。。都不会变

当前ADC数值:1075        0.000000mv





乘风飞扬 发表于 2024-3-26 17:33:10

mtiaopi 发表于 2024-3-26 17:25
printf ("当前ADC数\xfd值:%d\t%fmv\r\n",(int)adc_val,ADC_CAL_Voltage(adc_val/1000));

这样吗?改成 ...

我不知道你 ADC_CAL_Voltage 函数是怎么写的,但是从上面的代码猜测应该是这么改:
printf ("当前ADC数\xfd值:%d\t%fmv\r\n",(int)adc_val,ADC_CAL_Voltage(adc_val)/1000);

mtiaopi 发表于 2024-3-26 18:41:29

乘风飞扬 发表于 2024-3-26 17:33
我不知道你 ADC_CAL_Voltage 函数是怎么写的,但是从上面的代码猜测应该是这么改:
printf ("当前ADC数\x ...

u16 ADC_CAL_Voltage(u16 num)
{
        return num*2.5*1000/4096;
}
一样的,直接改成%f不动其它地方显示就是0。000000不管ADC的数值怎么变,哪个都不会变,我把这个的*1000去掉就只显示0或1或2,不会显示小数点和后面的数。

mtiaopi 发表于 2024-3-26 19:33:06

乘风飞扬 发表于 2024-3-26 17:33
我不知道你 ADC_CAL_Voltage 函数是怎么写的,但是从上面的代码猜测应该是这么改:
printf ("当前ADC数\x ...

void main()
{
        u16 adc_val;
//        u16 adc_val1;
//        u16 adc_val2;
        sys_init();
        usb_init();
        ADC_init();
        EA=1;
        P2M0=0X00;
        P2M1=0X00;
        while(1)
        {
                float a;
                delay_ms(2);
                if(DeviceState !=DEVSTATE_CONFIGURED)
                        continue;
                if(bUsbOutReady)
                {
                        usb_OUT_done();
                }
                adc_val=ADC_Read(8);
          a=adc_val*2.5/4096;
                printf ("当前ADC数\xfd值:%d\t%fv\r\n",(int)adc_val,a);

当前ADC数值:2960        1.806641v


把程序改成这样就可以了,用哪个ADC_CAL_Voltage的函数改不出来,不知道什么问题。

soma 发表于 2024-3-26 19:44:37

mtiaopi 发表于 2024-3-26 18:41
u16 ADC_CAL_Voltage(u16 num)
{
        return num*2.5*1000/4096;


u16 返回不是float吗?

mtiaopi 发表于 2024-3-26 20:42:28

soma 发表于 2024-3-26 19:44
u16 返回不是float吗?

不是,int型,直接把U16改成float也不行,显示不出来

mtiaopi 发表于 2024-3-26 20:44:26

soma 发表于 2024-3-26 19:44
u16 返回不是float吗?

我如果哪个*1000去掉就只显示0 1 2是没有小数点和小数点后的数字的
页: [1]
查看完整版本: 求教:用冲哥视频里的程序串口打印ADC数值