Hx711称重模块+STM32+CubeMX


文章目录

  • 一、模块和接线
  • 二、CubeMX配置
  • 1.时钟及sys
  • 2.IO口
  • 1)数据线DT设置为Input
  • 2)时钟线SCK设置为Output
  • 3.串口
  • 4.后续配置
  • 三、程序
  • 1.main.c
  • 2.hx711.c
  • 3.hx711.h
  • 4.串口重定向
  • 总结
  • 参考文章

  • 提示:以下是本篇文章正文内容,下面案例可供参考

    一、模块和接线

    传感器连接hx711,hx711连接STM32,如下图所示

    二、CubeMX配置

    1.时钟及sys



    2.IO口

    1)数据线DT设置为Input

    2)时钟线SCK设置为Output

    3.串口

    打开串口并选择中断,其他配置保持不变

    4.后续配置


    三、程序

    1.main.c

    /* Private variables ---------------------------------------------------------*/
    
    /* USER CODE BEGIN PV */
    
    
    extern uint8_t ReceiveBuff[BUFFERSIZE]; 
    extern uint8_t recv_end_flag,Rx_len;
    extern uint32_t weight_first;
    extern uint32_t weight_real;
    
    uint32_t weight_print = 0;//质量打印
    
    
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    /* USER CODE BEGIN PFP */
    
    /* USER CODE END PFP */
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    
    /* USER CODE END 0 */
    
    /**
      * @brief  The application entry point.
      * @retval int
      */
    int main(void)
    {
      /* USER CODE BEGIN 1 */
    
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USART1_UART_Init();
      MX_USART6_UART_Init();
      /* USER CODE BEGIN 2 */
    	
      printf("压力传感器HX711\r\n");
      weight_first = ReadCount();//首次读取重量进行去皮操作
      printf("首次质量weight_first=%d\n",weight_first);
      HAL_Delay(100);
    		
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
        		
    		weight_print = WeightReal();//实际质量计算
    		printf("重量为:%dg\n",weight_print);
    		HAL_Delay(100);
    		
      }
      /* USER CODE END 3 */
    }
    
    
    

    2.hx711.c

    注:根据官方给出的程序写ReadCount,红色框程序要稍微改一下。将ADSK=1;与ADSK=0;看作一个数据传输周期的开始和结束,if语句中count值仍在变化,等于数据传输还没结束,所以要将结束标志ADSK=0放到if语句后。

    1ADSK=0;//指SCK时钟线电平置低。
    2ADSK=1;//指SCK时钟线电平置高。
    3while(ADDO);//判断AD转换器是否准备好(DOUT应为低电平),ADDO=0,程序正常进行,否则ADDO=1一直进行while循环。

    4 i 的取值范围根据手册中的此处给出,为24-26,分别对应不同的通道和增益。

    #include "hx711.h"
    #include "stdio.h"
    #include "stdint.h"
    #include "gpio.h"
     
    uint8_t ReceiveBuff[BUFFERSIZE]; //接收缓冲区
    uint8_t recv_end_flag = 0,Rx_len;//接收完成中断标志,接收到字符长度
    
    uint32_t weight_first = 0;//首次质量
    uint32_t weight_real = 0;//每次读取的实际值
    
    /***********************************************************************************************
    *Name : ReadCount
    *Function : 读取传感器数值,通道A,增益128
    *Parameter :    count 计数值
                    i    24位数据计数,改变i的值可选择不同通道和增益24~26
    ***********************************************************************************************/
    uint32_t ReadCount(void)
    {
    	uint32_t Count = 0;
    	uint8_t i = 0;
    	HAL_Delay(10);
    	HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
    	
    	while(HAL_GPIO_ReadPin(DT_GPIO_Port, DT_Pin));//判断AD转换器是否准备好(DOUT应为低电平)
    	for(i = 0; i <24; i++)//24
    	{
    	  HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);
    		Count = Count << 1;		
    		if(HAL_GPIO_ReadPin(DT_GPIO_Port, DT_Pin))
    		{
    		    Count ++;
    		}
    		HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);			
    	}
    	
    	HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET);
    	Count = Count ^ 0x800000;
    	HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET);
    	return Count;
    }
    
    /***********************************************************************************************
    *Name : ReadWeight
    *Function : 读取拉力值
    *Parameter :   weight_real          实际拉力值
                   weight_first         传感器首次数据
    ***********************************************************************************************/
    uint32_t WeightReal(void)
    {
       weight_real = ReadCount();//实际质量计算
    		if(weight_first>=weight_real)
    		{
    			weight_real = weight_first-weight_real;
    			weight_real = weight_real/100;
    			//printf("重量为:%dg\n",weight_real);
    		}
    		else
    		{
    			weight_real = weight_real-weight_first;
    			weight_real = weight_real/100;
    			//printf("重量为:-%dg\n",weight_real);
    		}
    		return weight_real;
    }
    

    3.hx711.h

    #ifndef HX711
    #define HX711
    #include "stdint.h"
    
    #define BUFFERSIZE 255           //可以接收的最大字符个数       
    uint32_t ReadCount(void);
    uint32_t ReadWeight(void);
    
    #endif
    
    

    4.串口重定向

    放在usart.c中

    int fputc(int ch, FILE *f)
    {
      HAL_UART_Transmit(&huart6, (uint8_t *)&ch, 1, 0xffff);
      return ch;
    }
    
    

    总结

    提示:本文章学到的一个主要知识点是ReadCount函数中的

    通讯逻辑是先将数据线电平拉高,代表数据开始传输,等待接收完数据后,数据线电平置低,数据传输结束。

    参考文章

    涂鸦模组开发(压力传感器HX711)——2. 压力传感器HX711

    物联沃分享整理
    物联沃-IOTWORD物联网 » Hx711称重模块+STM32+CubeMX

    发表回复