原创 [博客大赛]Hx711的读写子程序

2013-7-29 08:41 3361 6 12 分类: MCU/ 嵌入式

 

//****************************************************************
 
//采集到24位,但是只要16位。最后的8位不稳定。实际上最后的12位都不稳定
 
#define ADSK PORTCbits.RC6
#define ADDO PORTCbits.RC7
#define ADSK_out_pin   TRISCbits.TRISC6 = 0;
#define ADDO_input_pin   TRISCbits.TRISC7 = 1;
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
 
unsigned int ReadCountFromHx711(void)
{
unsigned long count;
unsigned char i;
unsigned int x16;
//------------------ADSK PIN = OUTPIN;
    //------------------ ADDO PIN = INPUT;
ADSK_out_pin
ADDO_input_pin
ADSK = 0;
count = 0;
while(ADDO);
for(i = 0;i<24 ;i++)
{
ADSK = 1;
count = count<<1;
ADSK = 0;
if (ADDO) count ++;
}
ADSK = 1;
// count = count ^ 0x800000;
Nop();
ADSK = 0;
Nop();
count = count >>8;
x16 = count &0x0000ffff;    //变化成16位的重量值
 
return(x16);
}
 
 
//-----------------------------------------------------
//采集值 为0值。
// 一上电运行,要求没有人踩在上面。
//输入参数:NONO
//输出参数: 稳定的2次采集值。 是24位的值。
//说明: 如果一直不稳定,则会显示F14 的警示。
 
unsigned int  Weigh_machine_zero(void)
{
unsigned int i,j;
do{
ClrWdt();
hour = 0xdf;           //display  Ee
minute = 0x14;
reg1_led =(hour&0xf0) >>4;         //显示也是必须的
reg2_led =hour&0x0f;
reg3_led = (minute&0xf0) >>4;
reg4_led = minute&0x0f ;
 
i = ReadCountFromHx711();          //0值
j = ReadCountFromHx711();  
 
}while (i==j); 
return(i);
}
 
 
/************************************************************************/
//换算公斤
//输入参数:标定的0值
//输出的参数: 公斤数
//用到的全局变量:Kg_proportion (每公斤的数值)。 
// 如果采集的值越重越小,则交换A+,A- 线。
 
unsigned int  Kg_ykdz (unsigned int w_zero)
{
unsigned int x16,a16,b16,zero;
zero =w_zero ;  // Weigh_zero;
x16 = ReadCountFromHx711();
if ((x16 &0x8000)==0x8000)  // 采集上来的是负值
{
if ((zero &0x8000)== 0x8000)  //如果最初采集的值也是负值,则是正确的。
{
a16 = ~zero;
b16 = ~x16;
 
if (b16 >a16) x16 = 0;   //采集的值比0值还要小,则处理
else x16 = a16 - b16;
x16 = x16 / Kg_proportion ;
return(x16);
}
else  return(0xe3e4);              // 采集的值是负的,初值是正的。错 。估计得更换A+,A-;
 
}
else
{
if ((zero &0x8000)!= 0x8000)   //采集的初值是正的,当前值也是正的。 \/////对
{
if (zero > x16)  x16 = 0;//如果没有重量的值大于采集的值,则为0
else {
x16 = x16 - zero;   //如果采集的重量大于 初始化的值。则计算。
x16 = x16 / Kg_proportion;
}
return (x16);
}
else //采集的初值是负的,当前值是正的。 也对
{
a16 =  ~zero;
x16 = x16 + a16;
x16 = x16 /Kg_proportion ;
return(x16);
}
}
 
}
//----------------------------------------------------
 
 
 
//---------------------------------------------------------------------------- 0100   标定重量
case constant_sw134: // 标定   计算Kg_proportion = 55;  //每公斤采集值  
 
Nop();
TempVal = Weigh_machine_zero();
if ((Weigh_zero &0x8000)== 0x8000) //如果最初采集的值也是负值
{
TempVal = TempVal + (~Weigh_zero);
}
else //如果最初采集的值是正值
{
TempVal = TempVal - Weigh_zero;
}
 
Kg_proportion = TempVal /80;    // 以80公斤的标定。
 
AppConfig.Name[2] = Kg_proportion;   //把标定值保存。
 
 
  // unsigned Kg_val:1;    //采集重量标定值时为1,当不采集了,则把标定的值保存到EEPROM或FLASH中。只保留一次。否则反复写
 //  EEPROM OR FLASH 对硬件有损。
       
ykdz_Flags.Kg_val = 1;        //标志位
 
break;
 
 
 
PARTNER CONTENT

文章评论6条评论)

登录后参与讨论

leejun_708981951 2014-4-17 15:17

是线性的

用户309904 2014-4-10 22:19

比如,放上1KG的东西,此时AD模拟量增加了200(以零点为基准),那么变化率就是1KG/200,当模拟量增加了1000(以零点为基准),那么放在上面的物体重量就是1000*1KG/200=5KG,是这个意思吧?如果是这样的话,得保证传感器是线性的吧?

leejun_708981951 2014-4-10 13:15

标定就是把采集值和标准重量进行比较,消除误差的过程

用户309904 2014-4-10 08:24

标定那部分没看懂,楼主能把完整程序上传下吗?

用户309904 2014-4-9 22:40

你好,那个标定部分没看懂,可以将完整的程序发上来吗?

用户1334174 2013-8-9 16:23

学习!
相关推荐阅读
esad0 2024-12-04 11:20
基于TOF微型多区激光传感器在MCU上的AI手势识别
TOF多区传感器: ND06   ND06是一款微型多区高集成度ToF测距传感器,其支持24个区域(6 x 4)同步测距,测距范围远达5m,具有测距范围广、精度高、测距稳...
esad0 2024-09-05 09:06
训练集loss下降,但是验证集loss上升
当训练集loss下降而验证集loss上升时,这通常表明模型可能出现了过拟合。‌这种情况意味着模型在训练数据上的表现优于在测试数据上的表现,即模型很好地拟合了训练数据,但对于新数据的预测能力较差。分析种...
esad0 2023-05-27 08:41
吃饱闲的玩 做的
...
esad0 2021-07-09 15:46
传说中的嘉立创紫和TMF8801测距模块
这个色彩鲜艳的PCB 就是刚推出的嘉立创紫, 我感觉有点偏黑。    激光测距传感器 TMF8801的测试板。TMF8801 的资料还需要给老外签订保密合同才可以...
esad0 2021-04-19 15:38
AIR724 一拖8 LORA 系统
         AIR724通过LORA模块  和其他的8个模块进行通讯。  从而实现1拖8的效果。  &n...
EE直播间
更多
我要评论
6
6
关闭 站长推荐上一条 /3 下一条