【专题STM32F103】HX711 测重传感器的采样值读取-HAL库版本
模块图
HX711模块+1KG5KG10KG20KG压力传感器套装 称重传感器 电子秤模块
测试代码
/*hx711侧重模块5kg测试*/ Hx711_Init();// 相关的GPIO初始化 static uint32_t weight; weight = get_hx711_ad();// 读取采样值
main.h头文件相关的代码
//位带操作,实现51类似的GPIO控制功能 //具体实现思想,参考<<CM3权威指南>>第五章(87页~92页). //IO口操作宏定义 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) //IO口地址映射 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008 #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408 #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808 #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08 #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08 //IO口操作,只对单一的IO口! //确保n的值小于16! #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出 #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出 #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入 #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出 #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入 #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出 #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入 #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
头文件
#ifndef __HX711_H #define __HX711_H #include "main.h" /*串口通信方式*/ //定义IO口 #define ADDO PCin(0) #define ADSK PCout(1) //读取AD值函数 uint32_t get_hx711_ad(void);//读取AD值函数 void Hx711_Init(void);// 相关的GPIO初始化 #endif
源文件
应用厂家提供的芯片资料。
#include "hx711.h" //初始化IIC 板 PC0->DOUT PC1->PD_SCK void Hx711_Init(void)// 相关的GPIO初始化 { GPIO_InitTypeDef GPIO_InitStructure; // RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); //使能GPIOA时钟 __HAL_RCC_GPIOC_CLK_ENABLE ( );//启动外设工作的时钟 /*配置输入SDA*/ GPIO_InitStructure.Pin = GPIO_PIN_0; GPIO_InitStructure.Mode = GPIO_MODE_INPUT ; //输入模式 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStructure.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); //HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET); // 输出低 /*配置输出SCK*/ GPIO_InitStructure.Pin = GPIO_PIN_1; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP ; //推挽输出 GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStructure.Pull = GPIO_PULLDOWN; // HX711的PD_SCK 为低电平时,芯片处于正常工作状 HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_RESET); // 输出高 } // 读取采样值 uint32_t get_hx711_ad(void)// 读取采样值 { unsigned long Count; unsigned char i; ADSK=0; Count=0; while(ADDO); // HX711的DOUT 为高电平时,表明 A/D 转换器还未准备好输出数据 for (i=0;i<24;i++){ ADSK=1; // 数据时钟 Count=Count<<1; ADSK=0; // 数据时钟 if(ADDO) Count++; } ADSK=1; // 数据时钟, 产生第25个时钟信号,设置AD的放大倍数(增益)为128 Count=Count^0x800000; ADSK=0; // HX711的PD_SCK 为低电平时,芯片处于正常工作状 return(Count); }