找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4383|回复: 5
打印 上一主题 下一主题
收起左侧

求助STM32+HX711压力传感器程序问题 蜂鸣器一直响

[复制链接]
跳转到指定楼层
楼主
ID:356695 发表于 2018-11-22 22:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用STM32 HX711实现了读取压力传感器数据,现在数据已经能读到了,但是传一次数据蜂鸣器就会响一声,很频繁刺耳,代码在压缩文件里面。

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "lcd.h"
  4. #include "w25qxx.h"
  5. #include "text.h"

  6. #include "HX711.h"
  7. #include "usart.h"
  8. #include "filter.h"
  9. #include "key.h"
  10. /******************************************************************
  11. 校准参数:
  12. 因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里
  13. 这个参数才能使测量值很准确。当发现测试出来的重量偏大时,增加该数值;
  14. 如果测试出来的重量偏小时,减小改数值。该值可以为小数。
  15. ******************************************************************/

  16. void GPIO_Config(void){

  17.           //io引脚初始化
  18.     GPIO_InitTypeDef GPIO_InitStructure;
  19.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  20.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;          //端口配置
  21.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出
  22.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //IO口速度为50MHz
  23.     GPIO_Init(GPIOA, &GPIO_InitStructure);             //根据设定?
  24.     GPIO_ResetBits(GPIOA,GPIO_Pin_8);

  25. }       
  26. int main(void)
  27. {
  28.     //ADCon_InitVal:HX711的AD采样初始值
  29.     //ADCon_CurrentVal:加载后的HX711的AD当前采样值
  30.     u32 ADCon_InitVal, ADCon_CurrentVal;
  31.     float Weight, GapValue,Adjust = 0;
  32.     float Weight_Array[10];
  33.     u8 i = 0,KeyIn = 5;
  34.     delay_init();                  //延时函数初始化
  35.     KEY_Init();
  36.           GPIO_Config();         
  37.        
  38.     //LCD初始化
  39.     LCD_Init();                //初始化LCD
  40.     W25QXX_Init();             //初始化W25Q128
  41.     font_init();               //字库信息初始化
  42.     LCD_Clear(BLACK);          //显示屏底色
  43.     BACK_COLOR = BLACK;
  44.     POINT_COLOR=GREEN;         //显示颜色
  45.     LCD_Display_Dir(0);        //默认为竖屏


  46.     /***********************************************************
  47.      本次实验使用USART1通信口,该通信口使用USART1接收完成中断,
  48.      传输波特率为115200
  49.     ***********************************************************/
  50.     //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  51.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  52.     uart_init(115200);             //串口初始化为115200
  53.     Init_HX711pin();               //HX711初始化

  54.     /***********************************************************
  55.      读取压力传感器经HX711转换后得到的AD转换初始值ADCon_InitVal
  56.      进入称重前清0,即使ADCon_InitVal = ADCon_CurrentVal, 将十
  57.      进制AD采样值的最后3位清0,主要是因为这低三位在重量不变时仍
  58.      然不断波动
  59.     ***********************************************************/
  60.     ADCon_InitVal = (HX711_Read() / 1000) * 1000;
  61.     ADCon_CurrentVal = (HX711_Read() / 1000) * 1000;
  62.     while (ADCon_InitVal != ADCon_CurrentVal) {
  63.         ADCon_InitVal = (HX711_Read() / 1000) * 1000;
  64.         ADCon_CurrentVal = (HX711_Read() / 1000) * 1000;
  65.     }


  66.     /***********************************************************
  67.      因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正
  68.      这里的GapValue这个除数。当发现测试出来的重量偏大时,增加该
  69.      数值。如果测试出来的重量偏小时,减小该数值。该数值受电阻应
  70.      变片的应变的影响,与应变基本呈线性关系,而且当加载的重量不
  71.      同时,电阻应变片的应变会有所不同,所以,可以将量程划分区间,
  72.      各区间的GapValue值不同,以获得比较精确的测量值
  73.     ***********************************************************/
  74.     GapValue = 520;               //该值根据测量值进行调整,
  75.     while (1)
  76.     {
  77.         //读取压力传感器经HX711转换后得到的AD转换当前值ADCon_CurrentVal
  78.         ADCon_CurrentVal = (HX711_Read() / 1000) * 1000;

  79.         if (ADCon_CurrentVal <= ADCon_InitVal)
  80.         {
  81.             //获取实物的AD采样数值。由于在没有任何重量的情况下,
  82.             //转换值最后三位为非0,所以将转换值的最后3位忽略不计
  83.             ADCon_CurrentVal = ADCon_InitVal-ADCon_CurrentVal  ;

  84.             //计算实物的实际重量,根据实际情况可以改变GapValue的
  85.             //值,或对Weight再加或减补偿一个小数
  86.             Weight_Array[i] = (float)ADCon_CurrentVal / GapValue;
  87.             i++;
  88.             //参数分段拟合
  89.             if(Weight_Array[i]<15)
  90.               GapValue = 502;
  91.             else if(Weight_Array[i]<30)
  92.               GapValue = 501;
  93.             else if(Weight_Array[i]<45)
  94.               GapValue = 501;
  95.             else if(Weight_Array[i]<60)
  96.               GapValue = 515;
  97.             else if(Weight_Array[i]<75)
  98.               GapValue = 516;
  99.             else if(Weight_Array[i]<90)
  100.               GapValue = 516;
  101.             else
  102.               GapValue = 520;

  103.         }

  104.         if(i>9)
  105.         {
  106.             i = 0;
  107.             Weight = Filter(Weight_Array,10);
  108.                                           
  109.             //电脑通过串口调试助手显示ADCon_CurrentVal
  110.            // printf("ADCon_CurrentVal = %d \r\n", ADCon_CurrentVal);
  111.             //电脑通过串口调试助手显示得到的重量值,单位为g
  112.             printf("Weight = %.3f g \r\n", Weight - Adjust-417.3);
  113.             //Weight = (float)Weight*0.9745+0.6432; //回归后的线性方程
  114.             Weight = (float)Weight - Adjust; //回归后的线性方程
  115.             //电脑通过串口调试助手显示得到的调整重量值,单位为g
  116.             printf("Adjust_Weight = %.3f g \r\n", Weight-417.3);
  117. /*           POINT_COLOR = RED;
  118.             LCD_ShowString(30,100,300,16,24,"Pressure sensor experiment");
  119.             POINT_COLOR = GREEN;
  120.             LCD_ShowString(30,150,100,16,24, "Weight:");
  121.             LCD_ShowString(74+84+65,150,12,16,24,"g");
  122.             LCD_ShowNum(30+84,150,(int)Weight,3,24);
  123.             LCD_ShowString(66+84,150,16,16,24,".");
  124.             LCD_ShowNum(74+84,150,(Weight-(int)Weight)*100000,5,24);
  125.             LCD_ShowString(250,300,200,16,24,"Sw Young");
  126.             LCD_ShowString(30,180,200,16,24,"Weighing peeled:");
  127.             LCD_ShowNum(30+12*16,180,Adjust*1000,5,24);
  128.             LCD_ShowString(30+12*21,180,200,16,24,"mg");  */

  129.         }
  130.                                
  131.                                                         if( Weight >800){
  132.                                                 GPIO_SetBits(GPIOA,GPIO_Pin_8);
  133.                         }
  134.                                
  135.         KeyIn = KEY_Scan(1);
  136.         if(KeyIn==WKUP_PRES)
  137.          Adjust+=0.1;
  138.         if(KeyIn==KEY1_PRES&&Adjust>0)
  139.          Adjust-=0.1;        
  140.         delay_ms(80);
  141.     }
  142. }
复制代码

所有资料51hei提供下载:
Pressure-transducer-Based-on-STM32-HX711-master.rar (362.09 KB, 下载次数: 29)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:396960 发表于 2018-11-23 09:21 | 只看该作者
看你的注释,没有蜂鸣器相关,应该是这里吧?“ if( Weight >800){GPIO_SetBits(GPIOA,GPIO_Pin_8); ”
那问题就是“Weight”了,看看是不是读取、输出一次的重量后需要清零??若有清零试试让“Weight”低过比较值试试。。
回复

使用道具 举报

板凳
ID:94031 发表于 2018-11-23 11:15 | 只看该作者
需要硬件原理图,蜂鸣器接在哪里。
回复

使用道具 举报

地板
ID:328683 发表于 2018-11-23 13:47 | 只看该作者
上传原理图,要不然靠猜呀
回复

使用道具 举报

5#
ID:356695 发表于 2018-11-23 20:22 | 只看该作者
xuyaqi 发表于 2018-11-23 11:15
需要硬件原理图,蜂鸣器接在哪里。

没有原理图,就是直接通过HX711把传感器接在板子上。  我试了一下,只要把P01口不接,蜂鸣器就不响,接了就响,P01口是传感器输入口。
回复

使用道具 举报

6#
ID:356695 发表于 2018-11-23 20:23 | 只看该作者
phang 发表于 2018-11-23 09:21
看你的注释,没有蜂鸣器相关,应该是这里吧?“ if( Weight >800){GPIO_SetBits(GPIOA,GPIO_Pin_8); ”
那 ...

PA8是控制电机的,跟这个蜂鸣器应该无关,我发现P01口就是传感器输入那个口,拔掉蜂鸣器就不响了,接了就响
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表