STM32
直播中

张飞雄

7年用户 985经验值
私信 关注
[问答]

怎样去编写STM32F103读取HX711的程序代码呢

如何利用STM32F103去读取HX711呢?
怎样去编写STM32F103读取HX711的程序代码呢?

回帖(1)

蔡维林

2021-12-13 10:48:12



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




#include
#include
#include




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




/* 这个值需要修正 根据实际 */
#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 输出低 */
}




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




/*
* ****************************************************
* 获取毛皮重量
* ****************************************************
*/
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是为了四舍五入百分位
                 */
        }
}




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;//电机不转的时候关闭板子上的灯
                        }
                }
        }
}




举报

更多回帖

发帖
×
20
完善资料,
赚取积分