我用Hi3861连接称重模块HX711一直无法测量重量,
这是我的GPIO口的定义和初始化
该回答引用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引脚定义和初始化设置。