找回密码
 立即注册
查看: 89|回复: 8

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

[复制链接]
  • TA的每日心情
    开心
    昨天 19:58
  • 签到天数: 104 天

    [LV.6]常住居民II

    12

    主题

    44

    回帖

    354

    积分

    中级会员

    积分
    354
    发表于 2024-3-26 15:02:49 | 显示全部楼层 |阅读模式
    视频里的程序打印的是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));
            }
    }

    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 144 天

    [LV.7]常住居民III

    27

    主题

    1355

    回帖

    4215

    积分

    论坛元老

    积分
    4215
    发表于 2024-3-26 16:07:40 | 显示全部楼层
    printf使用 %f 可以打印浮点数数据,将mv数据/1000,然后使用 %f 打印结果就行。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 19:58
  • 签到天数: 104 天

    [LV.6]常住居民II

    12

    主题

    44

    回帖

    354

    积分

    中级会员

    积分
    354
     楼主| 发表于 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





    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 144 天

    [LV.7]常住居民III

    27

    主题

    1355

    回帖

    4215

    积分

    论坛元老

    积分
    4215
    发表于 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);
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 19:58
  • 签到天数: 104 天

    [LV.6]常住居民II

    12

    主题

    44

    回帖

    354

    积分

    中级会员

    积分
    354
     楼主| 发表于 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,不会显示小数点和后面的数。

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 19:58
  • 签到天数: 104 天

    [LV.6]常住居民II

    12

    主题

    44

    回帖

    354

    积分

    中级会员

    积分
    354
     楼主| 发表于 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的函数改不出来,不知道什么问题。

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 76 天

    [LV.6]常住居民II

    4

    主题

    674

    回帖

    1059

    积分

    金牌会员

    积分
    1059
    发表于 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吗?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 19:58
  • 签到天数: 104 天

    [LV.6]常住居民II

    12

    主题

    44

    回帖

    354

    积分

    中级会员

    积分
    354
     楼主| 发表于 2024-3-26 20:42:28 | 显示全部楼层
    soma 发表于 2024-3-26 19:44
    u16 返回不是float吗?

    不是,int型,直接把U16改成float也不行,显示不出来
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 19:58
  • 签到天数: 104 天

    [LV.6]常住居民II

    12

    主题

    44

    回帖

    354

    积分

    中级会员

    积分
    354
     楼主| 发表于 2024-3-26 20:44:26 | 显示全部楼层
    soma 发表于 2024-3-26 19:44
    u16 返回不是float吗?

    我如果哪个*1000去掉就只显示0 1 2是没有小数点和小数点后的数字的
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-20 16:05 , Processed in 0.068858 second(s), 60 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表