STM32F103 读取HX711

#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h"#include #include #include /* * HX711和单片机连线是: PA6接SCKPA7接DT单片机3.3接模块的VCC单片机GND接模块的GND * 电机电机的三根线PB5 PB6 P7 */#define MotorIN1 PBout( 5 ) #define MotorIN2 PBout( 6 ) #define MotorENPBout( 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 HX711DTGPIO_ReadInputDataBit( GPIOA, GPIO_Pin_7 ) #define HX711SCK PAout( 6 )unsigned long Weight_Maopi; unsigned long HX711_Buffer; unsigned long Weight_Shiwu; u8Flag_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接SCK2.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 ) { u8t = 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; //电机转的时候打开板子上的灯 }elseif ( shiwu > 180 ) { /* 关闭电机 */ MotorIN1 = 1; MotorIN2 = 1; MotorEN= 1; LED0=1; //电机不转的时候关闭板子上的灯 } } } }

    推荐阅读