24小(xiǎo)时联系電(diàn)话:18217114652、13661815404

中文(wén)

您当前的位置:
首页>
電(diàn)子资讯>
技术专题>
单片机开发之HX711的...

技术专题

单片机开发之HX711的计算


最近接了一个单片机开发项目,需要使用(yòng)HX711芯片来处理(lǐ)称重传感器的值。作為(wèi)一个多(duō)年老司机,在HX711官网上没找到称重值的计算方法,网上的资料也不全。因此在调试出HX711的称重值之后,将项目过程做一个记录,為(wèi)后面开发的人提供微薄的帮助。

硬件電(diàn)路在此略过不提了,简略说下HX711STM32单片机开发的过程。

1、初始化硬件HX711_init;

2、实现HX711 AD值读取函数HX711_Read_AD;

3、记录没有(yǒu)物(wù)品时HX711_Read_AD读取的ADadj;

4、编译烧录运行程序,将一个质量為(wèi)M的物(wù)品放到托盘上,HX711_Read_AD读出物(wù)品的AD值A1。可(kě)计算得到称重系数 γ=M/(A1-adj);

5将γ常量系数写入到代码中,实现HX711_Read_Weight函数,例如HX711_Read_AD读取待测物(wù)的AD值是A,待测物(wù)品质量m=(A-adj)*γ = M*(A-adj)/(A1-adj);

以下代码是HX711在STM32F103上的代码实现,已经过验证:

#define HX711_SCK       PBout(13)  //SCK

#define HX711_READ_SDA  PBin(12)   //输入SDA

static u32 adj = 0;//无物(wù)称重时HX711读出的AD

/*初始化硬件*/

void HX711_init(void)

{

      u32 sum=0;

      int i=0;

       GPIO_InitTypeDef GPIO_InitStructure;

      RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); 

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出

      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

      GPIO_Init(GPIOB, &GPIO_InitStructure);

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;     //浮空输入

      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

      GPIO_Init(GPIOB, &GPIO_InitStructure);

       HX711_Read_AD();

       for(i=0;i<10;i++){

            delay_ms(100);

            sum+=HX711_Read_AD();

      }

      adj = sum/10;

}

/**************************************************************

24bit HX711读取AD

***************************************************************/

u32 HX711_Read_AD(void)

{

      u32 count;

      u8 i;

      HX711_SCK = 0; //使能(néng)ADPD_SCK 置低)

      count=0;

      while(HX711_READ_SDA); //AD转换未结束则等待,否则开始读取

      delay_us(1);

      for (i=0;i<24;i++)

      {

            HX711_SCK=1; //PD_SCK 置高(发送脉冲)

            count=count<<1; //下降沿来时变量count左移一位,右侧补零

            if(HX711_READ_SDA) count++;

            delay_us(1);

            HX711_SCK=0; //PD_SCK 置低

            delay_us(1);

      }

      HX711_SCK=1;

      delay_us(1);

      HX711_SCK=0;

      count=count^0x800000;//25个脉冲下降沿来时,转换数据 

      return count;

} 

/*读取物(wù)品质量,单位0.1g*/

u32 HX711_Read_Weight(void)

{

      u32 weight = 0;

      u32 count = HX711_Read_AD();     

      weight=((count-adj)*0.029017+5)/10;//5是為(wèi)了四色五入,0.029017是称重系数 ,这里的单位是0.1g,如果想更换单位,请将系数乘以或除以10

      return weight;

}

计算方法依据是通过HX711读出AD值与物(wù)品质量程線(xiàn)性关系。另注意:每个HX711空载时的AD都不一样,所以每个设备的HX711模块都需要校零

作者:Winston

转载请注明出处:/TechnologyNews/c5a0fe24-4fa2-a112-54b6-3a8a33050b89.shtml

请输入搜索关键字

确定