• “必须执行Init_Clk函数,才能采集到二氧化碳接口485数据的问题”的解决


    这个问题困扰了我很长一段时间,而且如果这个问题不解决,就有一个无法调和的矛盾:
    执行Init_Clk函数,能采集到二氧化碳接口485数据,但是功耗大;
    不执行Init_Clk函数,不能采集到二氧化碳接口485数据,但是功耗小。
    这个矛盾在这次的低功耗应用中可要了命了,我的要求是:既要能采集到所有数据,还要功耗低。

    不执行Init_Clk函数,采集二氧化碳接口485数据时,表现出来的现象是:
    485传感器没有任何响应,就好像没有给485传感器发过采集命令似的。
    但是我用板子直接连接pc测试却是好的,pc确实收到了板子发来的数据,而且pc发给板子的数据板子也能收到。

    起初以为是因为没有执行Init_Clk函数而使用的默认主频MCLK=1MHz太低了,
    然后又以为是串口波特率发生器选用的时钟源不合适,
    总之试了无数种方案之后都是失败。
    就在我想放弃的时候,突然想到了串口发送时的几个延迟,
    而这几个延迟并没有针对不同的主频做处理,会不会是这个原因呢?
    答案是确定的。
    看SendData函数中以下程序:
    #ifdef APP_HARDWARE_VERSION_3
    P9OUT |= BIT0;
    //要使用485必须要加上以下的两个延迟,否则发送的数据不全
    Delay_ms(2);
    #endif

    Uart2SendData(pcSendBuf, iSendLength);

    #ifdef APP_HARDWARE_VERSION_3
    Delay_ms(5);
    P9OUT &= ~BIT0;
    #endif
    其中Delay_ms函数是关键,我之前的处理并没有区别对待,把Delay_ms修改为以下:
    void Delay_ms(unsigned long nValue)
    {
    unsigned long nCount;
    int i;
    unsigned long j;

    #ifdef HAS_INIT_CLK
    nCount = 2048; // MCLK = XT2CLK, 16MHz
    #else
    nCount = 2048/16;
    #endif

    for (i = nValue; i > 0; i--)
    {
    for (j = nCount; j > 0; j--)
    ;
    }
    }
    注意有HAS_INIT_CLK的地方。
    修改之后,终于即便不执行Init_Clk函数也可以正确采集二氧化碳接口485数据了。

  • 相关阅读:
    SQLServer 时间差运算
    phpStudy
    解决Apache/PHP无法启动的问题
    apche的主配置文件)
    知识总结
    学完了js的知识,一起分享总结知识点
    JS的学习体会与分享
    SpringBoot -- pom.xml文件
    c++基本知识点
    c语言基本常识5
  • 原文地址:https://www.cnblogs.com/gaotaozhaolei/p/8878980.html
Copyright © 2020-2023  润新知