当前位置:   article > 正文

STM32F系列通过hx711芯片实现压力传感器的测量(CUBEMAX)_hx711连什么口

hx711连什么口

一、模块

HX711 采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的 24 位 A/D 转换芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端 MCU 芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道 A 或通道 B,与其内部的低噪声可编程放大器相连。

引脚介绍:

VCC和GND引脚分别为HX711芯片的电源输入端口。

VCC引脚是连接到5V或3.3V的正电源,GND引脚是连接到地的负电源。

DOUT是HX711芯片的数据输出端口,它输出经过A/D转换处理后的24位数据。

SCK是HX711芯片的时钟输入端口,用于控制A/D转换的时钟。

HX711介绍工作原理:


HX711传感器由一个二进制模数转换器(ADC)和一个放大器组成。ADC可以将模拟信号转换为数字信号,而放大器可以扩大信号的幅度,以便更精确地测量。在称重应用中,HX711传感器可以通过应变量来测量物体的质量。

应变量是由当物体受到压力时会发生应变的特殊材料制成的。将应变量粘贴到测量物体的表面,当物体受到压力并伸展时,应变量也会发生变化。压力越大,应变量的变化也越大。

HX711压力传感器的工作原理基于万用表电桥原理,利用压力传感器的阻值变化来实现重量的测量。

二、CubeMX配置

1.时钟及sys

 

2.IO口 

注意:数据线DT配置为输入模式

 

注意:时钟线SCK配置为输出模式

3.串口 

默认配置,不需要改变

4.后续配置

三、程序

1.main.c

  1. int main(void)
  2. {
  3. /* USER CODE BEGIN 1 */
  4. /* USER CODE END 1 */
  5. /* MCU Configuration--------------------------------------------------------*/
  6. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7. HAL_Init();
  8. /* USER CODE BEGIN Init */
  9. /* USER CODE END Init */
  10. /* Configure the system clock */
  11. SystemClock_Config();
  12. /* USER CODE BEGIN SysInit */
  13. delay_init(72);
  14. /* 延时初始化 */
  15. /* USER CODE END SysInit */
  16. /* Initialize all configured peripherals */
  17. MX_GPIO_Init();
  18. MX_USART1_UART_Init();
  19. /* USER CODE BEGIN 2 */
  20. /* USER CODE END 2 */
  21. /* Infinite loop */
  22. /* USER CODE BEGIN WHILE */
  23. while (1)
  24. {
  25. /* USER CODE END WHILE */
  26. /* USER CODE BEGIN 3 */
  27. Get_Weight();
  28. Get_Maopi();
  29. uint32_t a=0;
  30. printf("净重量 = %d g\r\n",Weight_Shiwu); //打印
  31. printf("初始重量 = %d g\r\n",Weight_Maopi); //打印
  32. HAL_Delay(1000);
  33. }
  34. /* USER CODE END 3 */
  35. }

2.hx711.c

  1. /************************************************************************************
  2. *************************************************************************************/
  3. #include "HX711.h"
  4. #include "delay.h"
  5. uint32_t HX711_Buffer;
  6. uint32_t Weight_Maopi;
  7. uint32_t Weight_Shiwu;
  8. uint32_t Flag_Error = 0;
  9. //卡尔曼滤波
  10. float KalmanFilter(float inData)
  11. {
  12. static float prevData = 0; //先前数值
  13. static float p = 10, q = 0.001, r = 0.001, kGain = 0; // q控制误差 r控制响应速度
  14. p = p + q;
  15. kGain = p / ( p + r ); //计算卡尔曼增益
  16. inData = prevData + ( kGain * ( inData - prevData ) ); //计算本次滤波估计值
  17. p = ( 1 - kGain ) * p; //更新测量方差
  18. prevData = inData;
  19. return inData; //返回滤波值
  20. }
  21. //校准参数
  22. //因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
  23. //当发现测试出来的重量偏大时,增加该数值。
  24. //如果测试出来的重量偏小时,减小改数值。
  25. //该值可以为小数
  26. #define GapValue 106.5
  27. //****************************************************
  28. //读取HX711
  29. //****************************************************
  30. uint32_t HX711_Read(uint8_t pulse) //增益128 PULSE 脉冲
  31. {
  32. uint32_t count =0;
  33. uint8_t i;
  34. HX720_CLK_L();
  35. if(HAL_GPIO_ReadPin(DAT_GPIO_Port,DAT_Pin)==0)
  36. {
  37. for(i=0;i<24;i++)
  38. {
  39. HX720_CLK_H();
  40. delay_us(1);
  41. count=count<<1;
  42. HX720_CLK_L();
  43. delay_us(1);
  44. if(HAL_GPIO_ReadPin(DAT_GPIO_Port,DAT_Pin)==1)
  45. {
  46. count++;
  47. }
  48. }
  49. for(i=0;i<pulse-24;i++)
  50. {
  51. HX720_CLK_H();
  52. delay_us(1);
  53. HX720_CLK_L();
  54. delay_us(1);
  55. }
  56. count=count^0x800000;//第25个脉冲下降沿来时,转换数据
  57. }
  58. // HX720_CLK_H();
  59. // count=count^0x800000;//第25个脉冲下降沿来时,转换数据
  60. // delay_us(1);
  61. // HX720_CLK_H();
  62. return(count);
  63. }
  64. //****************************************************
  65. //获取毛皮重量
  66. //****************************************************
  67. void Get_Maopi(void)
  68. {
  69. Weight_Maopi = HX711_Read(25);
  70. Weight_Maopi=KalmanFilter(Weight_Maopi);
  71. }
  72. //****************************************************
  73. //称重
  74. //****************************************************
  75. void Get_Weight(void)
  76. {
  77. HX711_Buffer = HX711_Read(25);
  78. if(HX711_Buffer > Weight_Maopi)
  79. {
  80. Weight_Shiwu = HX711_Buffer;
  81. Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取实物的AD采样数值。
  82. Weight_Shiwu = ((float)Weight_Shiwu/GapValue)-478; //计算实物的实际重量
  83. //因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
  84. //当发现测试出来的重量偏大时,增加该数值。
  85. //如果测试出来的重量偏小时,减小改数值。
  86. Weight_Shiwu=KalmanFilter(Weight_Shiwu);
  87. }
  88. }

3.hx711.h

  1. #ifndef __HX711_H
  2. #define __HX711_H
  3. #include "main.h"
  4. #include "gpio.h"
  5. #define HX720_CLK_H() HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,GPIO_PIN_SET) //时钟线置高电平
  6. #define HX720_CLK_L() HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,GPIO_PIN_RESET)//时钟线置低电平
  7. extern uint32_t HX711_Read(void);
  8. extern void Get_Maopi(void);
  9. extern void Get_Weight(void);
  10. extern uint32_t HX711_Buffer;
  11. extern uint32_t Weight_Maopi;
  12. extern uint32_t Weight_Shiwu;
  13. extern uint32_t Flag_Error;
  14. #endif

4.串口重定向

  1. /* USER CODE BEGIN 1 */
  2. #include <stdio.h>
  3. int fputc(int ch, FILE *f)
  4. {
  5. HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  6. return ch;
  7. }
  8. int fgetc(FILE *f)
  9. {
  10. uint8_t ch = 0;
  11. HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  12. return ch;
  13. }
  14. /* USER CODE END 1 */

5.实验结果

总结

提示:本文章学到的一个主要知识点写时序

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/800892
推荐阅读
相关标签
  

闽ICP备14008679号