打印
[应用相关]

STM32F103 读取HX711

[复制链接]
996|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
drer|  楼主 | 2021-7-5 16:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"


#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/*
* 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;
}


使用特权

评论回复
沙发
drer|  楼主 | 2021-7-5 16:26 | 只看该作者
/* 这个值需要修正 根据实际 */
#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 输出低 */
}


使用特权

评论回复
板凳
drer|  楼主 | 2021-7-5 16:27 | 只看该作者
/* 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);
}


使用特权

评论回复
地板
drer|  楼主 | 2021-7-5 16:28 | 只看该作者
/*
* ****************************************************
* 获取毛皮重量
* ****************************************************
*/
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是为了四舍五入百分位
                 */
        }
}


使用特权

评论回复
5
drer|  楼主 | 2021-7-5 16:29 | 只看该作者
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;//电机不转的时候关闭板子上的灯
                        }
                }
        }
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

3315

帖子

4

粉丝