STM32F103 读取HX711


#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"


#include 
#include 
#include 


/*
 * HX711和单片机连线是: PA6接SCK  PA7接DT  单片机3.3接模块的VCC  单片机GND接模块的GND
 * 电机电机的三根线  PB5 PB6 P7
 */


#define MotorIN1	PBout( 5 )
#define MotorIN2	PBout( 6 )
#define MotorEN		PBout( 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 HX711DT		GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_7 )
#define HX711SCK	PAout( 6 )

unsigned long	Weight_Maopi;
unsigned long	HX711_Buffer;
unsigned long	Weight_Shiwu;
u8		Flag_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接SCK  2.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 )
{
	u8		t	= 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;//电机转的时候打开板子上的灯
			}else  if ( shiwu > 180 )
			{
				/* 关闭电机 */
				MotorIN1	= 1;
				MotorIN2	= 1;
				MotorEN		= 1;
				
				
				LED0=1;//电机不转的时候关闭板子上的灯
			}
		}
	}
}



你可能感兴趣的:(单片机)