Hi3861称重模块

我用Hi3861连接称重模块HX711一直无法测量重量,
这是我的GPIO口的定义和初始化

img

img


请问该如何才能使Hi3861正确从HX711中读取重量?
能否附上示例代码?

该回答引用GPTᴼᴾᴱᴺᴬᴵ
你好!针对你的问题,以下是我给出的解决方案:

1.首先,请确保已经正确连接好了 Hi3861 和 HX711。确保引脚连接正确,并且电源和地线也连接好了。

2.其次,请注意 HX711 的电源电压和 Hi3861 的电源电压是否匹配。如果不匹配,可能会导致读取不到数据。

3.接下来,你需要编写代码来读取 HX711 的数据。以下是一个简单的示例代码,你可以根据自己的需求进行修改。

#include <stdio.h>
#include <stdlib.h>
#include <hi3861.h>

#define HX711_CLK_PORT GPIO_5
#define HX711_DATA_PORT GPIO_4

void HX711_Init() {
    gpio_init(HX711_CLK_PORT, GPIO_OUTPUT);
    gpio_init(HX711_DATA_PORT, GPIO_INPUT);
    gpio_write(HX711_CLK_PORT, 1);
    gpio_write(HX711_DATA_PORT, 1);
}

uint32_t HX711_Read() {
    uint32_t data = 0;
    uint8_t i;
    gpio_write(HX711_CLK_PORT, 0);
    delay_us(1);
    gpio_write(HX711_CLK_PORT, 1);
    delay_us(1);
    for (i = 0; i < 24; i++) {
        gpio_write(HX711_CLK_PORT, 0);
        delay_us(1);
        data <<= 1;
        if (gpio_read(HX711_DATA_PORT)) {
            data++;
        }
        gpio_write(HX711_CLK_PORT, 1);
        delay_us(1);
    }
    gpio_write(HX711_CLK_PORT, 0);
    delay_us(1);
    data ^= 0x800000;
    return data;
}

int main() {
    uint32_t weight;
    HX711_Init();
    while (1) {
        weight = HX711_Read();
        printf("weight: %d\n", weight);
        delay_ms(500);
    }
    return 0;
}

4.上述代码中,我们使用 gpio_init() 函数对 GPIO 引脚进行初始化,使用 gpio_write() 函数设置引脚输出状态,使用 gpio_read() 函数读取引脚输入状态。我们使用了一个 delay_us() 函数来进行延时。注意,如果你需要修改引脚的定义,请根据自己的实际情况进行修改。

5.在 main() 函数中,我们首先调用 HX711_Init() 函数来初始化 HX711 模块。然后在一个无限循环中,我们调用 HX711_Read() 函数来读取 HX711 模块的数据,并使用 printf() 函数打印出来。为了不让数据刷新得太快,我们在每次读取后延时了 500 毫秒。

希望这些信息能够帮助你解决问题!

先不管称重,调试输出下你从gpio获取了什么,看看获取的对不对

参考gpt和自己的思路,Hi3861是一款芯片,需要通过软件编程来实现与外部模块的通信。HX711是一款高精度、高分辨率的模拟信号放大器和模数转换器,可以将小信号转换为数字信号。为了让Hi3861能够正确读取HX711的数据,需要进行以下操作:

1 初始化GPIO口
在你提供的代码中,已经完成了GPIO口的定义和初始化。需要注意的是,HX711的DT管脚是输出数据,需要设置为输入方向,而SCK管脚是输出时钟信号,需要设置为输出方向。

2 控制SCK产生时钟信号
HX711将采样到的模拟信号转换为数字信号的过程需要时钟信号的控制。通过设置SCK管脚的电平变化,可以产生时钟信号,驱动HX711进行采样转换。需要注意的是,时钟信号的频率和占空比需要满足HX711的要求。

3 读取DT输出的数据
在产生时钟信号的过程中,需要读取HX711输出的数据。根据HX711的特性,需要读取24位的数据,并将其转换为实际的重量值。

以下是一个简单的HX711读取重量的示例代码,你可以参考一下:


#include "hi_gpio.h"

#define HX711_SCK HI_IO_NAME_GPIO_9
#define HX711_DT HI_IO_NAME_GPIO_10

void HX711_init()
{
    // 初始化GPIO口
    hi_gpio_init();
    hi_io_set_pull(HX711_SCK, HI_IO_PULL_UP);
    hi_io_set_pull(HX711_DT, HI_IO_PULL_UP);
    hi_io_set_func(HX711_SCK, HI_IO_FUNC_GPIO);
    hi_io_set_func(HX711_DT, HI_IO_FUNC_GPIO);
    hi_gpio_set_dir(HX711_SCK, HI_GPIO_DIR_OUT);
    hi_gpio_set_dir(HX711_DT, HI_GPIO_DIR_IN);
}

uint32_t HX711_read()
{
    // 等待DT管脚变为低电平
    while (hi_gpio_read(HX711_DT) == HI_TRUE);
    // 读取24位数据
    uint32_t value = 0;
    for (int i = 0; i < 24; i++)
    {
        // 产生时钟信号
        hi_gpio_set_output_val(HX711_SCK, HI_TRUE);
        hi_gpio_set_output_val(HX711_SCK, HI_FALSE);
        // 读取DT输出的数据
        value <<= 1;
        if (hi_gpio_read(HX711_DT) == HI_TRUE)
        {
            value |= 0x01;
        }
    }
    // 转换为实际重量值
    value ^= 0x800000;
    value += 1;
    value *= 0.001;
    return value;
}

int main()
{
    HX711_init();
    uint32_t weight = HX711_read();
    return 0;
}


参考GPT和自己的思路,您需要使用HX711的通信协议来与其通信以读取重量数据。通信协议是串行通信协议,它需要通过SCK(时钟)和DT(数据)引脚进行通信。您可以使用以下代码来实现HX711与Hi3861的通信:

#include "hi_types.h"
#include "hi_gpio.h"
#include "hi_io.h"

#define HX711_SCK HI_IO_NAME_GPIO_9
#define HX711_DT HI_IO_NAME_GPIO_10

void HX711_Init(void)
{
    //初始化GPIO
    hi_gpio_init();
    //设置上拉
    hi_io_set_pull(HX711_SCK, HI_IO_PULL_UP);
    hi_io_set_pull(HX711_DT, HI_IO_PULL_UP);
    //设置GPIO管脚复用
    hi_io_set_func(HX711_SCK, HI_IO_FUNC_GPIO_9_GPIO);
    hi_io_set_func(HX711_DT, HI_IO_FUNC_GPIO_10_GPIO);
    //设置GPIO输入输出方向
    hi_gpio_set_dir(HX711_SCK, HI_GPIO_DIR_OUT);
    hi_gpio_set_dir(HX711_DT, HI_GPIO_DIR_IN);
}

unsigned long HX711_Read(void)
{
    unsigned long count = 0;
    unsigned char i;

    //在DT引脚上产生一个脉冲
    hi_gpio_set_val(HX711_SCK, HI_GPIO_VAL_LOW);
    hi_gpio_set_val(HX711_SCK, HI_GPIO_VAL_HIGH);
    hi_gpio_set_val(HX711_SCK, HI_GPIO_VAL_LOW);

    //读取DT引脚的值,接收24个bit数据
    for (i = 0; i < 24; i++)
    {
        hi_gpio_set_val(HX711_SCK, HI_GPIO_VAL_HIGH);
        count = count << 1;
        if (hi_gpio_get_input_val(HX711_DT) == HI_GPIO_VAL_HIGH)
        {
            count++;
        }
        hi_gpio_set_val(HX711_SCK, HI_GPIO_VAL_LOW);
    }

    //设置通道和增益
    hi_gpio_set_val(HX711_SCK, HI_GPIO_VAL_HIGH);
    hi_gpio_set_val(HX711_SCK, HI_GPIO_VAL_LOW);

    count = count ^ 0x800000;

    return count;
}

以上代码中,HX711_Init函数用于初始化GPIO引脚,并将SCK引脚设置为输出模式,将DT引脚设置为输入模式。HX711_Read函数用于读取HX711中的重量数据。在此函数中,使用SCK引脚在DT引脚上产生一个脉冲,然后读取DT引脚的值,接收24个bit数据,最后将通道和增益设置为默认值。返回的值是读取的重量数据。

您可以调用HX711_Init函数来初始化HX711,然后调用HX711_Read函数来读取HX711中的重量数据。例如:

int main()
{
    HX711_Init();
    unsigned long weight = HX711_Read();
    return 0;
}

请注意,您可能需要根据实际情况修改代码中的GPIO引脚定义和初始化设置。