//****************************************************************
//采集到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;
leejun_708981951 2014-4-17 15:17
用户309904 2014-4-10 22:19
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