91 lines
2.9 KiB
C
91 lines
2.9 KiB
C
#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;
|
||
} |