Files
STC32G_Power_Monitor/Source/hx711.c
2025-08-31 21:43:17 +08:00

91 lines
2.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "hx711.h"
#include "gpio.h"
uint32 hx711_last_read_value[10];
void hx711_init()
{
gpio_mode(HX711_DT_PIN, GPIO); // 设置DT引脚为推挽输出
gpio_mode(HX711_SCK_PIN, GPIO); // 设置SCK引脚为推挽输出
gpio_set_level(HX711_SCK_PIN, 0); // 初始化SCK为低电平
gpio_set_level(HX711_DT_PIN, 1); // 初始化DT为高电平
}
uint32 hx711_read_set(HX711_ch_enum next_ch,uint8 avg_times)
{
uint32 result = 0;
uint8 i;
if(avg_times > 10) /* 限制平均次数最大值为10 */
{
avg_times = 10;
}
gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平开始读数据 */
gpio_set_level(HX711_DT_PIN, 1); /* 确保DT高电平等待HX711准备好数据 */
while(gpio_get_level(HX711_DT_PIN) == 1); /* 等待HX711准备好数据 */
for(i = 0; i < 24; i++)
{
gpio_set_level(HX711_SCK_PIN, 1); /* SCK高电平 */
result <<= 1; /* 左移一位 */
if(gpio_get_level(HX711_DT_PIN) == 1)
{
result |= 0x01; /* 如果DT为高电平设置最低位为1 */
}
gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平 */
}
for(i = 0; i < next_ch; i++)
{
gpio_set_level(HX711_SCK_PIN, 1); /* SCK高电平 */
_nop_();
_nop_();
gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平 */
}
for(i = 0; i < 9; i++)
{
hx711_last_read_value[i] = hx711_last_read_value[i + 1]; /* 将之前的读取值向前移动 */
}
hx711_last_read_value[9] = result; /* 将当前读取的值存入最后一个位置 */
result = 0;
for(i = 0; i < avg_times; i++)
{
result += hx711_last_read_value[i]/avg_times; /* 累加读取的值 */
}
return result; /* 返回读取到的数据 */
}
uint8 hx711_single_read_non_blocking(HX711_ch_enum next_ch)
{
uint32 result = 0;
uint8 i;
gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平开始读数据 */
gpio_set_level(HX711_DT_PIN, 1); /* 确保DT高电平等待HX711准备好数据 */
if(gpio_get_level(HX711_DT_PIN) == 1)
{
return 0; /* 如果DT为高电平表示HX711未准备好数据 */
}
for(i = 0; i < 24; i++)
{
gpio_set_level(HX711_SCK_PIN, 1); /* SCK高电平 */
result <<= 1; /* 左移一位 */
if(gpio_get_level(HX711_DT_PIN) == 1)
{
result |= 0x01; /* 如果DT为高电平设置最低位为1 */
}
gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平 */
}
for(i = 0; i < next_ch; i++)
{
gpio_set_level(HX711_SCK_PIN, 1); /* SCK高电平 */
_nop_();
_nop_();
gpio_set_level(HX711_SCK_PIN, 0); /* SCK低电平 */
}
for(i = 0; i < 9; i++)
{
hx711_last_read_value[i] = hx711_last_read_value[i + 1]; /* 将之前的读取值向前移动 */
}
hx711_last_read_value[9] = result; /* 将当前读取的值存入最后一个位置 */
return 1;
}