基于STM32F103ZET6核心板控制HX711(称重传感器带屏蔽)
目的:
使用核心板控制传感器,实现串口打印数据。
硬件要求:
1>stm32f103zet6核心板
2>HX711(带屏蔽)
HX711有好几款板子,我这里使用的是带屏蔽的板子,只要知道引脚的功能什么板子都是一样的。
HX711原理图:
VCC | 电源正极(2.6V~5.5V稳压电路) |
GND | 接地 |
DO/RX |
数字输出,串口数据输出 (个人理解RX应该是核心板上的脚为RX接收脚) |
CK/TX | 数字输入 断电控制(高电平有效)和串口时钟输入 |
A+ | 模拟输入 通道 A 正输入端 |
A- | 模拟输入 通道 A 负输入端 |
B+ | 模拟输入 通道 B 正输入端 |
B- | 模拟输入 通道 B 负输入端 |
out+ |
模拟电源: 2.6 ~ 5.5V |
注:以上为个人理解,根据海芯的对应的,如有错误,敬请指正。(还是个大菜鸟)
硬件连接:
HX711引脚 | 核心板引脚 |
---|---|
VCC | 5V |
DO/RX | PB1 |
CK/TX | PB2 |
GND | GND |
软件:
1>STM32CubMX
2>keil5
软件配置:
借鉴涂鸦的文章,操作大似相同,我只是换了引脚,大家可以根据它的来,很全很详细。
keil5配置(还不太会使用csdn的代码段,我把加的代码移了一点位置表示了,代码也采用了涂鸦博主的,只有引脚处做了稍微的修改)
main.c文件中加
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
uint32_t ReadCount(void);
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE BEGIN PV */
#define BUFFERSIZE 255 //可以接收的最大字符个数
uint8_t ReceiveBuff[BUFFERSIZE]; //接收缓冲区
uint8_t recv_end_flag = 0,Rx_len;//接收完成中断标志,接收到字符长度
/* USER CODE END PV */
uint32_t weight_qupi=0;
uint32_t weight_shiji=0;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
#ifdef __GNUC__ //串口重定向,因为要使用print函数
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END PFP */
printf("压力传感器HX711\r\n");
weight_qupi=ReadCount();//首次读取重量进行去皮操作
printf("首次去皮weight_qupi=%d\n",weight_qupi);
HAL_Delay(100);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
weight_shiji=ReadCount();
if(weight_qupi>=weight_shiji)
{
weight_shiji=weight_qupi-weight_shiji;
weight_shiji=weight_shiji/100;
printf("重量为:%dg\r\n",weight_shiji);
}
else
{
weight_shiji=weight_shiji-weight_qupi;
weight_shiji=weight_shiji/100;
printf("重量为:-%dg\r\n",weight_shiji);
}
HAL_Delay(1000);
}
/* USER CODE BEGIN 4 */
uint32_t ReadCount(void)
{
uint32_t Count=0;
uint8_t i;
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)); //AD转换未结束则等待,否则开始读取
for (i=0;i<24;i++)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
Count=Count<<1; //下降沿来时变量Count左移一位,右侧补零
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
if(HAL_GPIO_ReadPin(DO_GPIO_Port,DO_Pin)) Count++;
}
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
Count=Count^0x800000; //第25个脉冲下降沿来时,转换数据
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
return(Count);
}
/* USER CODE END 4 */
结果图:
借鉴文章链接:
涂鸦模组开发(压力传感器HX711)——2. 压力传感器HX711_记帖的博客-CSDN博客_hx711压力传感器