STM32
登录
直播中
张飞雄
7年用户
982经验值
私信
关注
[问答]
怎样去编写STM32F103读取HX711的程序代码呢
开启该帖子的消息推送
STM32F103
HX711
代码
如何利用
STM32
F103去读取HX711呢?
怎样去编写STM32F103读取HX711的程序代码呢?
回帖
(1)
蔡维林
2021-12-13 10:48:12
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include
#include
#include
/*
* HX711和单片机连线是: PA6接SCK PA7接DT 单片机3.3接模块的VCC 单片机GND接模块的GND
* 电机电机的三根线 PB5 PB6 P7
*/
#define MotorIN1 PBout( 5 )
#define MotorIN2 PBout( 6 )
#define MotorEN PBout( 7 )
void InitIOMotor( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
/* 电机 B5 B6 B7 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 推挽输出 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* IO口速度为50MHz */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_Init( GPIOB, &GPIO_InitStructure ); /* 推挽输出 ,IO口速度为50MHz */
MotorIN1 = 1;
MotorIN2 = 1;
MotorEN = 1;
}
/* 这个值需要修正 根据实际 */
#define GapValue 0.38755
#define HX711DT GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_7 )
#define HX711SCK PAout( 6 )
unsigned long Weight_Maopi;
unsigned long HX711_Buffer;
unsigned long Weight_Shiwu;
u8 Flag_Error = 0;
void InitioHX711( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); /* 使能PB,PE端口时钟 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 推挽输出 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* IO口速度为50MHz */
/* hx711 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /* 设置成上拉输入 */
GPIO_Init( GPIOA, &GPIO_InitStructure ); /* 初始化GPIOE7 */
/* HX711 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /* LED1-->PE.6 端口配置, 推挽输出 */
GPIO_Init( GPIOA, &GPIO_InitStructure ); /* 推挽输出 ,IO口速度为50MHz */
GPIO_ResetBits( GPIOA, GPIO_Pin_6 ); /* PE.2 输出低 */
}
/* 3.3V供电 2.2接SCK 2.3接DT */
unsigned long HX711_Read( void )
{
unsigned long Count;
unsigned char i;
HX711SCK = 0; /* SCL=0;使能AD(PD_SCL 置低) */
Count = 0;
while ( HX711DT )
;
/* AD转换未结束则等待,否则开始读取 */
for ( i = 0; i < 24; i++ )
{
HX711SCK = 1; /* SCL = 1; PD_SCL 置高(发送脉冲) */
Count = Count << 1; /*下降沿来时变量Count左移一位,右侧补零 */
delay_us( 1 );
HX711SCK = 0; /* SCL=0; PD_SCL 置低 */
if ( HX711DT )
Count++; /* if(SDA) Count++; */
delay_us( 1 );
}
HX711SCK = 1; /* SCL=1; */
Count = Count ^ 0x800000; /* 第25个脉冲下降沿来时,转换数据 */
delay_us( 1 );
HX711SCK = 0; /* SCL=0; */
return(Count);
}
/*
* ****************************************************
* 获取毛皮重量
* ****************************************************
*/
void Get_Maopi( void )
{
Weight_Maopi = HX711_Read();
}
/*
* ****************************************************
* 称重
* ****************************************************
*/
void Get_Weight( void )
{
HX711_Buffer = HX711_Read();
if ( HX711_Buffer > Weight_Maopi )
{
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; /* 获取实物的AD采样数值。 */
Weight_Shiwu = (unsigned long) ( (float) Weight_Shiwu / GapValue); /* 计算实物的实际重量 */
/*
* 因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
* 当发现测试出来的重量偏大时,增加该数值。
* 如果测试出来的重量偏小时,减小改数值。
* 该数值一般在4.0-5.0之间。因传感器不同而定。
* +0.05是为了四舍五入百分位
*/
}
}
int main( void )
{
u8 t = 0;
unsigned long shiwu = 0;
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 ); /* 设置NVIC中断分组2:2位抢占优先级,2位响应优先级 */
delay_init(); /* 延时函数初始化 */
LED_Init(); /* LED RELAY 初始化 */
uart_init( 115200 );
InitIOMotor(); /* 初始化电机端口 */
InitioHX711(); /* 初始化IO */
Get_Maopi(); /* 获取皮重 */
delay_ms( 500 ); /* 延时等待确定稳定后再次获取皮重 */
Get_Maopi(); /* 获取皮重 */
while ( 1 )
{
delay_ms( 10 );
if ( t++ > 10 )
{
t = 0;
/* 刷新重量的显示 */
Get_Weight();
if ( Flag_Error == 0 )
{
shiwu = Weight_Shiwu / 1000; /* 单位是g */
}else{
shiwu=0;//读取异常 ,一般不会异常
}
if ( shiwu < 160 )
{
/* 打开电机 */
MotorIN1 = 0;
MotorIN2 = 1;
MotorEN = 0;
LED0=0;//电机转的时候打开板子上的灯
}else if ( shiwu > 180 )
{
/* 关闭电机 */
MotorIN1 = 1;
MotorIN2 = 1;
MotorEN = 1;
LED0=1;//电机不转的时候关闭板子上的灯
}
}
}
}
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include
#include
#include
/*
* HX711和单片机连线是: PA6接SCK PA7接DT 单片机3.3接模块的VCC 单片机GND接模块的GND
* 电机电机的三根线 PB5 PB6 P7
*/
#define MotorIN1 PBout( 5 )
#define MotorIN2 PBout( 6 )
#define MotorEN PBout( 7 )
void InitIOMotor( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
/* 电机 B5 B6 B7 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 推挽输出 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* IO口速度为50MHz */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_Init( GPIOB, &GPIO_InitStructure ); /* 推挽输出 ,IO口速度为50MHz */
MotorIN1 = 1;
MotorIN2 = 1;
MotorEN = 1;
}
/* 这个值需要修正 根据实际 */
#define GapValue 0.38755
#define HX711DT GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_7 )
#define HX711SCK PAout( 6 )
unsigned long Weight_Maopi;
unsigned long HX711_Buffer;
unsigned long Weight_Shiwu;
u8 Flag_Error = 0;
void InitioHX711( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); /* 使能PB,PE端口时钟 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 推挽输出 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* IO口速度为50MHz */
/* hx711 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /* 设置成上拉输入 */
GPIO_Init( GPIOA, &GPIO_InitStructure ); /* 初始化GPIOE7 */
/* HX711 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /* LED1-->PE.6 端口配置, 推挽输出 */
GPIO_Init( GPIOA, &GPIO_InitStructure ); /* 推挽输出 ,IO口速度为50MHz */
GPIO_ResetBits( GPIOA, GPIO_Pin_6 ); /* PE.2 输出低 */
}
/* 3.3V供电 2.2接SCK 2.3接DT */
unsigned long HX711_Read( void )
{
unsigned long Count;
unsigned char i;
HX711SCK = 0; /* SCL=0;使能AD(PD_SCL 置低) */
Count = 0;
while ( HX711DT )
;
/* AD转换未结束则等待,否则开始读取 */
for ( i = 0; i < 24; i++ )
{
HX711SCK = 1; /* SCL = 1; PD_SCL 置高(发送脉冲) */
Count = Count << 1; /*下降沿来时变量Count左移一位,右侧补零 */
delay_us( 1 );
HX711SCK = 0; /* SCL=0; PD_SCL 置低 */
if ( HX711DT )
Count++; /* if(SDA) Count++; */
delay_us( 1 );
}
HX711SCK = 1; /* SCL=1; */
Count = Count ^ 0x800000; /* 第25个脉冲下降沿来时,转换数据 */
delay_us( 1 );
HX711SCK = 0; /* SCL=0; */
return(Count);
}
/*
* ****************************************************
* 获取毛皮重量
* ****************************************************
*/
void Get_Maopi( void )
{
Weight_Maopi = HX711_Read();
}
/*
* ****************************************************
* 称重
* ****************************************************
*/
void Get_Weight( void )
{
HX711_Buffer = HX711_Read();
if ( HX711_Buffer > Weight_Maopi )
{
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; /* 获取实物的AD采样数值。 */
Weight_Shiwu = (unsigned long) ( (float) Weight_Shiwu / GapValue); /* 计算实物的实际重量 */
/*
* 因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
* 当发现测试出来的重量偏大时,增加该数值。
* 如果测试出来的重量偏小时,减小改数值。
* 该数值一般在4.0-5.0之间。因传感器不同而定。
* +0.05是为了四舍五入百分位
*/
}
}
int main( void )
{
u8 t = 0;
unsigned long shiwu = 0;
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 ); /* 设置NVIC中断分组2:2位抢占优先级,2位响应优先级 */
delay_init(); /* 延时函数初始化 */
LED_Init(); /* LED RELAY 初始化 */
uart_init( 115200 );
InitIOMotor(); /* 初始化电机端口 */
InitioHX711(); /* 初始化IO */
Get_Maopi(); /* 获取皮重 */
delay_ms( 500 ); /* 延时等待确定稳定后再次获取皮重 */
Get_Maopi(); /* 获取皮重 */
while ( 1 )
{
delay_ms( 10 );
if ( t++ > 10 )
{
t = 0;
/* 刷新重量的显示 */
Get_Weight();
if ( Flag_Error == 0 )
{
shiwu = Weight_Shiwu / 1000; /* 单位是g */
}else{
shiwu=0;//读取异常 ,一般不会异常
}
if ( shiwu < 160 )
{
/* 打开电机 */
MotorIN1 = 0;
MotorIN2 = 1;
MotorEN = 0;
LED0=0;//电机转的时候打开板子上的灯
}else if ( shiwu > 180 )
{
/* 关闭电机 */
MotorIN1 = 1;
MotorIN2 = 1;
MotorEN = 1;
LED0=1;//电机不转的时候关闭板子上的灯
}
}
}
}
举报
更多回帖
rotate(-90deg);
回复
相关问答
STM32F103
HX711
代码
怎样
去
使用
hx711
压力传感器模块
呢
2021-10-19
2189
stm32
与
hx711
通讯问题
2018-04-29
9008
HX711
模块
读取
称重传感器的值怎么
读取
不了?
2016-12-21
13980
关于称重传感器
HX711
程序
的疑问
2014-07-28
12344
如何
去
实现一种基于51单片机的
HX711
称重计的设计?
2021-07-19
1661
关于高精度AD转换芯片
HX711
的请教
2013-10-18
5932
带
HX711
的ESP-07不工作要怎么处理?
2023-02-27
321
称重传感器和
Hx711
怎么与pic MCU连接?
2020-03-30
3043
请问
stm32
如何使用
HX711
读电子秤的值?
2021-11-26
1710
请问
HX711
怎么使用?如何完成对它的控制?
2021-10-13
4389
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分