#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* 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;//电机不转的时候关闭板子上的灯
}
}
}
}
STM32F103 读取HX711
猜你喜欢
转载自blog.csdn.net/x1131230123/article/details/102817229
今日推荐
周排行