找回密码
 立即注册
查看: 231|回复: 4

读内部1.19V的ADC电压值,但是没有输出不正确 | 已解决

[复制链接]
  • TA的每日心情
    奋斗
    2024-1-19 16:32
  • 签到天数: 2 天

    [LV.1]初来乍到

    5

    主题

    6

    回帖

    59

    积分

    注册会员

    积分
    59
    发表于 2024-3-3 10:58:29 | 显示全部楼层 |阅读模式
    主函数main.c中
    int main()
    {
        uint32 system_tick = 0; // C语言定义必须放在最前面
        uint8 recv_buff[DEBUG_UART_RX_BUF_LENGTH];
        uint16 adc;
        uint16 recv_len;
        uint16 vref1v19;
        float ftest;
        sys_init();

        // 启动提示
        LED_STA = LED_ON;
        delay_ms(500);
        LED_STA = LED_OFF;
        delay_ms(500);
        LED_STA = LED_ON;
        delay_ms(500);
        LED_STA = LED_OFF;
        delay_ms(500);

        buf[0] = 0xAA;
        buf[1] = 0x5A;

        // 启动提示
        printf("system initialized\r\n");

        while (1)
        {
            LED_STA = LED_ON;
            delay_ms(500);
            LED_STA = LED_OFF;
            delay_ms(500);
            debug_uart_send(buf, 2); // 调试串口发送数据
            // adc = adc_read(15);
            vref1v19 = adc_readref1v19();                                                                              // 读取内部1.19V参考电压的实际值
            printf("system tick = %d, vref=%d.%dV\r\n", system_tick++, (int)vref1v19 / 1000, vref1v19 % (uint16)1000); // 调试串口打, 是不支持除法运算还是取千位方法不对??
            printf("system tick = %d, vref=%dmV, %dmV,\r\n", system_tick++, vref1v19, vref1v19);                       // 调试串口打印

            recv_len = debug_uart_getbuff(recv_buff);
            if (recv_len > 0)
            {
                printf("recv message:\r\n");
                debug_uart_send(recv_buff, recv_len);
            }
        }
        return 0;
    }

    读取内部1.19V代码
    /// @brief 获取内部1.19V参考电压的值, 单位是mV
    /// @return 1.19V参考电压的实际值
    uint16 adc_readref1v19()
    {
        uint16 vref = (CHIPID7 << 8) + CHIPID8;
        return vref;
    }


    实际打印结果
    截图202403031056558971.jpg

    为什么用/和%运算没有结果,更无语的是同样打印vref1v19的值(在没有重新取值的条件下),第一次打印的是0,第二次是1180mV
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

    积分
    4187
    发表于 2024-3-3 19:11:44 | 显示全部楼层
    可以直接使用printf打印浮点数数据。
    具体参考开天斧,屠龙刀例程包:09-ADC采样NTC数据-软件防抖-过采样使用-串口1返回结果
    1.     vADC = ((float)j * 2.5 / 4096);  //计算NTC电压, Vref=2.5V
    2.     printf("P13=%fV  ",vADC);
    复制代码


    C51/C251编译器使用printf函数的注意事项参考帖子:
    printf函数 的 格式参数; USB接口 使用 printf 打印数据
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6864
    (出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    半小时前
  • 签到天数: 103 天

    [LV.6]常住居民II

    14

    主题

    407

    回帖

    990

    积分

    荣誉版主

    热心市民

    积分
    990
    发表于 2024-3-3 19:31:21 | 显示全部楼层
    CHIPID属于特殊寄存器,读取前需要使能访问XFR
    P_SW2 |= 0x80;
    睁开眼睛做场梦~~~
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-1-19 16:32
  • 签到天数: 2 天

    [LV.1]初来乍到

    5

    主题

    6

    回帖

    59

    积分

    注册会员

    积分
    59
     楼主| 发表于 2024-3-3 22:52:37 | 显示全部楼层
    已经解决了,stc重定向的printf支持flaot输出, 主要还是printf以及格式输出的问题, 另外尽量不要在printf参数中放计算
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-1-19 16:32
  • 签到天数: 2 天

    [LV.1]初来乍到

    5

    主题

    6

    回帖

    59

    积分

    注册会员

    积分
    59
     楼主| 发表于 2024-3-4 10:58:31 | 显示全部楼层
    乘风飞扬 发表于 2024-3-3 19:11
    可以直接使用printf打印浮点数数据。
    具体参考开天斧,屠龙刀例程包:09-ADC采样NTC数据-软件防抖-过采样使 ...

    感谢,现在理解了
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-20 01:23 , Processed in 0.062740 second(s), 48 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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