专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
HX711称重模块资源分享
2019-07-21 02:03
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
6234
13
1639
感谢各位大佬的帮助,让我完成了称重模块的校准
现在把资料分享给大家
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
秋天
2019-07-21 17:41
[mw_shl_code=c,true]#include "stm32f10x.h"
#include "hx711.h"
#include "delay.h"
#include "24cxx.h"
#define ADIO GPIOC //ad口
#define DATA GPIO_Pin_11 //数据口
#define CLK GPIO_Pin_10 //时钟
#define ADCLK RCC_APB2Periph_GPIOC //生命ad时钟挂在APB2P.C上
double hx711_buffer=0;//定义hx711_buffer来接受hx711read读取的信息
double weight_maopi=0;//毛皮重量
double weight_shiwu=0;//实物重量
u32 am;//毛皮重量整数部分
double a;//处理毛皮重量等同于毛皮重量(可有可无)
double b;//毛皮重量小数部分
const u8 TEXT_Buffer[]={"WarShipSTM32 IIC TEST"};//可有可无
#define SIZE sizeof(TEXT_Buffer) //只是为了得到SIZE
void ADInit(void) //AD初始化
{
GPIO_InitTypeDef GPIO_InitStructure; //结构体
RCC_APB2PeriphClockCmd(ADCLK,ENABLE); //使能时钟口
GPIO_InitStructure.GPIO_Pin = CLK; //PC10为时钟口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADIO,&GPIO_InitStructure); //PC.10时钟口
GPIO_InitStructure.GPIO_Pin = DATA; //PC11为数据口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADIO,&GPIO_InitStructure); //PC.11数据口
}
unsigned long HX711_Read(void) //读取711读到的数据
{
unsigned long val = 0;
unsigned char i = 0;
float p;
GPIO_SetBits(ADIO,DATA);
GPIO_ResetBits(ADIO,CLK);
while(GPIO_ReadInputDataBit(ADIO,DATA));
delay_us(1);
for(i=0;i<24;i++)
{
GPIO_SetBits(ADIO,CLK);
val=val<<1;
delay_us(1);
GPIO_ResetBits(ADIO,CLK);
if(GPIO_ReadInputDataBit(ADIO,DATA))
val++;
delay_us(1);
}
GPIO_SetBits(ADIO,CLK);
val = val^0x800000;
delay_us(1);
GPIO_ResetBits(ADIO,CLK);
delay_us(1);
p=val;
return p;
}
double Get_Maopi(void)
{
hx711_buffer=HX711_Read();
weight_maopi=hx711_buffer/100;
weight_maopi=weight_maopi/7.26;//参数可换,不同的称重模块对应不同的参数,需自己标定
a=weight_maopi;
am=(u32)weight_maopi;
b=a-am;//处理毛皮重量,分整数小数分别存入24C02的两个地址位。
if(am-12120<20) //并不是简单地掉电存储,而是通过获取毛皮的数据得到的am在12120左右,这个可以靠
{ //每个人的毛皮重量进行设定,取巧设计,不是掉电存储,是每次都会存储。因为高精度的6kg称重模块会受外界影响,其数据是动态的
AT24CXX_Write(0,(u8*)&am,SIZE);//存整数到24C02的0地址
AT24CXX_Write(5,(u8*)&b,SIZE);//存小数到24C02的5地址
weight_maopi=am+b;//再将整数与小数相加赋值给毛皮
}
else
{
AT24CXX_Read(0,(u8*)&am,SIZE);//读整数从24C02的0地址
AT24CXX_Read(5,(u8*)&b,SIZE);//读小数数从24C02的0地址
weight_maopi=am+b;//再将整数与小数相加赋值给毛皮
}
return a; //返回值
}
double Get_Weight(void)
{
double m;
hx711_buffer=HX711_Read();
hx711_buffer=hx711_buffer/100;
hx711_buffer=hx711_buffer/7.26;//处理实物重量
if(hx711_buffer>weight_maopi)
{
weight_shiwu=hx711_buffer;
weight_shiwu=weight_shiwu-weight_maopi;
}
m=weight_shiwu;
return m;
}
[/mw_shl_code]
加载中...
查看其它13个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include "hx711.h"
#include "delay.h"
#include "24cxx.h"
#define ADIO GPIOC //ad口
#define DATA GPIO_Pin_11 //数据口
#define CLK GPIO_Pin_10 //时钟
#define ADCLK RCC_APB2Periph_GPIOC //生命ad时钟挂在APB2P.C上
double hx711_buffer=0;//定义hx711_buffer来接受hx711read读取的信息
double weight_maopi=0;//毛皮重量
double weight_shiwu=0;//实物重量
u32 am;//毛皮重量整数部分
double a;//处理毛皮重量等同于毛皮重量(可有可无)
double b;//毛皮重量小数部分
const u8 TEXT_Buffer[]={"WarShipSTM32 IIC TEST"};//可有可无
#define SIZE sizeof(TEXT_Buffer) //只是为了得到SIZE
void ADInit(void) //AD初始化
{
GPIO_InitTypeDef GPIO_InitStructure; //结构体
RCC_APB2PeriphClockCmd(ADCLK,ENABLE); //使能时钟口
GPIO_InitStructure.GPIO_Pin = CLK; //PC10为时钟口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADIO,&GPIO_InitStructure); //PC.10时钟口
GPIO_InitStructure.GPIO_Pin = DATA; //PC11为数据口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADIO,&GPIO_InitStructure); //PC.11数据口
}
unsigned long HX711_Read(void) //读取711读到的数据
{
unsigned long val = 0;
unsigned char i = 0;
float p;
GPIO_SetBits(ADIO,DATA);
GPIO_ResetBits(ADIO,CLK);
while(GPIO_ReadInputDataBit(ADIO,DATA));
delay_us(1);
for(i=0;i<24;i++)
{
GPIO_SetBits(ADIO,CLK);
val=val<<1;
delay_us(1);
GPIO_ResetBits(ADIO,CLK);
if(GPIO_ReadInputDataBit(ADIO,DATA))
val++;
delay_us(1);
}
GPIO_SetBits(ADIO,CLK);
val = val^0x800000;
delay_us(1);
GPIO_ResetBits(ADIO,CLK);
delay_us(1);
p=val;
return p;
}
double Get_Maopi(void)
{
hx711_buffer=HX711_Read();
weight_maopi=hx711_buffer/100;
weight_maopi=weight_maopi/7.26;//参数可换,不同的称重模块对应不同的参数,需自己标定
a=weight_maopi;
am=(u32)weight_maopi;
b=a-am;//处理毛皮重量,分整数小数分别存入24C02的两个地址位。
if(am-12120<20) //并不是简单地掉电存储,而是通过获取毛皮的数据得到的am在12120左右,这个可以靠
{ //每个人的毛皮重量进行设定,取巧设计,不是掉电存储,是每次都会存储。因为高精度的6kg称重模块会受外界影响,其数据是动态的
AT24CXX_Write(0,(u8*)&am,SIZE);//存整数到24C02的0地址
AT24CXX_Write(5,(u8*)&b,SIZE);//存小数到24C02的5地址
weight_maopi=am+b;//再将整数与小数相加赋值给毛皮
}
else
{
AT24CXX_Read(0,(u8*)&am,SIZE);//读整数从24C02的0地址
AT24CXX_Read(5,(u8*)&b,SIZE);//读小数数从24C02的0地址
weight_maopi=am+b;//再将整数与小数相加赋值给毛皮
}
return a; //返回值
}
double Get_Weight(void)
{
double m;
hx711_buffer=HX711_Read();
hx711_buffer=hx711_buffer/100;
hx711_buffer=hx711_buffer/7.26;//处理实物重量
if(hx711_buffer>weight_maopi)
{
weight_shiwu=hx711_buffer;
weight_shiwu=weight_shiwu-weight_maopi;
}
m=weight_shiwu;
return m;
}
[/mw_shl_code]
一周热门 更多>