• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

【已解决】基于stm32f4的hx711一直称不出来重量

zhczlzhang 2018-04-04 浏览量:3443
手头有一块HX711模块,一直在用51开发,开发的很好,突发奇想移植到STM32F4上面去,于是就写了代码,现在问题是编译通过了,下载到板子上去后一直称不出来重量,东西放在上面也不显示加减,很苦恼,调试了2天没结果,网上也没有相应的文章,请大家帮帮忙。代码如下。串口显示结果。QQ截图20180404161045.png
//hx711代码
#include "HX711.h"
#include "delay.h"
#include "stm32f4xx.h"

void AD_init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);

	GPIO_InitStructure.GPIO_Pin = CLK;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//CLKÒý½Å¶¨ÒåÍÆÍìÊä³ö
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
	GPIO_Init(ADIO,&GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = DATA;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //DATAÒý½Å¶¨Ò帡¿ÕÊäÈë
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(ADIO,&GPIO_InitStructure);		 
}


//****************************************************
//³ÆÖØ1
//****************************************************
unsigned long ReadAD(void)  //¶ÁADоƬÊä³öµÄÊý¾Ý¡£
{
	unsigned long count; 
	unsigned char i; 
  GPIO_SetBits(ADIO,DATA);
	//delay_us(2);
	GPIO_ResetBits(ADIO,CLK);
	//delay_us(2);	
  count=0;
  //delay_us(2);	
  while(GPIO_ReadInputDataBit(ADIO,DATA)); 
	//delay_us(2);
  for(i=0;i<24;i++)
	{ 
	  	GPIO_SetBits(ADIO,CLK);
			//delay_us(2);		
	  	count=count<<1; 
			//delay_us(2); 
			GPIO_ResetBits(ADIO,CLK); 
		  //delay_us(2);
			if(GPIO_ReadInputDataBit(ADIO,DATA))
					//delay_us(2);
					count++; 
					//delay_us(2);
	} 
 	GPIO_SetBits(ADIO,CLK); 
	//delay_us(2);
  count=count^0x800000;
	delay_us(2);
	GPIO_ResetBits(ADIO,CLK);
  //delay_us(2);
	return(count); 		
}


long double filter(void)  //»¬¶¯¾ùÖµÂ˲¨·¨µÄº¯Êý¡£   
{
	unsigned long max=0,min=0,SUM,BUF[12],Average;
	int i=0;
		
	
for(i=0;i<12;i++)
	{
		BUF[i]=ReadAD();
	//printf("%ld\r\n",BUF[i]);
		if(i==0)
		{
			max=BUF[0];
			min=BUF[0];
		}
		if(i>0)
		{
			if(BUF[i]>max) max=BUF[i];
			if(BUF[i]<min) min=BUF[i];
		}
	}
	for(i=0;i<12;i++)
	{
		if(!(BUF[i]==max||BUF[i]==min))
		{
			SUM=SUM+BUF[i];	
		}
	}
	Average=SUM/(12-2);
	return Average;
	
}


//主函数

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "main.h"
#include "HX711.h"


  

int main(void)
{
	 long t=0;

	delay_init(168);
	AD_init();	
	uart_init(115200);	
	
	while(1)
		{ 
			delay_ms(500);
			t = ReadAD();
			printf("t1=%ld\r\n",t);				
			delay_ms(500);
			t = filter();
			printf("t2=%ld\r\n",t);		

}
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:10
  • 太巧了吧,我也是一直是8388607,用的是MSP430,你解决了吗

zhczlzhang 回复了 TangHsiangYu:没有!51上面就很稳,移植到其他上面就不行。 回复
电子老工程师 回复了 :https://www.chemi-con.co.jp/products/relatedfiles/capacitor/catalog/MVLRA-e.PDF 回复

  • 你这样很难让别人回答的。。。你在51上做可以,在STM32F4上不行?HX711接口操作确认完全正确吗
zhczlzhang 回复了 skawu:确认正确,参考了好几个。 回复
电子老工程师 回复了 :实物与图纸相符没有问题。 回复

  • 你的delay是自己写的吗?51那个是用for循环做的软件延时,延时时间在stm32上会差很多的。

    stm32的HAL库里有systick的用法,你可以使用stm32的delay函数

zhczlzhang 回复了 xukejing:就是用的stm32的DELAY函数。 回复
电子老工程师 回复了 :G = BUF=1 上电 默认值;;; T = BUF=0 上电 默认值 回复

电子老工程师 回复了 :IR2110S Infineon Technologies 请参考。 回复

电子老工程师 回复了 :材质不一样,可以替代 回复

电子老工程师 回复了 :封装: SOT-23-3L 品牌: JSMSEMI(杰盛微) 型号: 2SC3356-R25,国产的电流最大100mA 回复

zhczlzhang 回复了 我是爆米花啊:RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); 回复
电子老工程师 回复了 :GPC40AG,SL Power Electronics Manufacture of Condor/Ault Brands,供参考 回复

  • 延时应该不对,要看一下HX711的时序要求

    我看你程序里面把所有的delay都删了,这个应该是不行的

zhczlzhang 回复了 chen0000009:按照官方的程序来试着延时了下,不行,然后我试验着去延时,都是没反应。我看了很多人的F4的程序,都出现这个问题了。大家好像都没解决,解决了的也不说。 回复
电子老工程师 回复了 :同系列没有没有黄色的。 回复

  • 问题已解决!好吧其实出现这个问题很简单,我在这里直接说一下,免得很多人都不知道这个解决方法。STM32开发板跟单片机开发板有一点不一样,你在单片机开发板上,随便哪个IO口都可以作为独立的IO口来用,但是在探索者开发板上不行,因为他的IO口都被占用了,你如果用不是开发板上的外设,而是自己的外设去抢占IO口,就会出现操作无反应的状况。我把STM32F4开发指南看了一遍才在1.2.3章节找到IO口分配表,找到了可以独立的IO口,然后重新分配了IO口引脚,然后程序下载烧录,运行完美,没有一点问题。
    所以大家记住,在使用相关的开发板时,一定要注意IO口的引脚分配问题。
电子老工程师 回复了 :品牌: Slkor(萨科微) 型号: SS24 请参考。 回复

  • 跟引脚复用应该没关系,原子的板子有哪些IO被占用了都是有说明的。HX711也是I2C器件,I2C器件通信是需要握手确认的,延时不能删,删了就无法正常通信了。

相关问题

问题达人换一批

【已解决】基于stm32f4的hx711一直称不出来重量