找回密码
 立即注册

QQ登录

只需一步,快速开始

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

个性HX711电子秤制作 附STM32单片机源码带滤波

  [复制链接]
跳转到指定楼层
楼主
用饭缸盖做的秤盘,程序里的数据做了滤波处理,反应速度有点慢,不喜欢的可以去掉滤波,程序以前用的串口1 ,为了方便测试,后来改到串口2,做这个纯属娱乐,学习,锻炼动手能力

制作出来的实物图如下:


热熔胶直接打一个,有点丑


上秤盘(看看这是什么?没错,翻缸盖)


固定传感器



固定板子

stm32单片机源程序如下:
  1. /*文件名:main.c                                                                                            
  2. /*基本功能 :称重数据处理*/
  3. /*先获取一个当前重量,作为一个参考,再获取第二次重量,两次差值作为去皮清零        */
  4. /* 精度    24位   128增益*/
  5. /*  修正值与精度的关系  1mV *(2^24) * 128 = 2147483648  214.7483648                        */
  6. /*  校准后的修正值写入 Flash */
  7. /*串口发送数据作为调节指令 1: 去皮  2: g kg ct 单位切换  3:秤台校准  4:查看校准值                */
  8. #include "main.h"

  9. /************************* 主函数 **************************/
  10. int main(void)
  11. {
  12. /****************** 配置系统时钟为 72M *********************/              
  13.         SystemInit();
  14. /**************  USART2 config 115200 8-N-1  **************/               
  15.         USART2_Config();
  16. /*********************  HX711端口配置 *********************/
  17.         GPIO_INIT();
  18. /*********************  秤台数值清零  *********************/
  19.   GetRoughWeight();
  20. /********************* 读取秤台校准值 *********************/
  21.         GetFlashParameter();
  22.         if(Correction == 0xFFFFFFFF)
  23.                 {
  24.                         printf("/*** 秤台未校准 ***/ \r\n");
  25.                         Correction = SensorAccuracy1mV;//缺省设置
  26.                         printf("校准值 Correction = %f \r\n",Correction);
  27.                 }
  28. /*********************  清零成功检测  *********************/
  29.         printf("/**** STM32F103C8T6 HX711电子秤 ****/\r\n");
  30.         printf("/********* 请输入串口指令  *********/\r\n");
  31.         printf("/********* 1 称重         *********/\r\n");
  32.         printf("/********* 2 去皮         *********/\r\n");
  33.         printf("/********* 3 转换单位     *********/\r\n");
  34.         printf("/********* 4 秤台校准     *********/\r\n");
  35.         printf("/********* 5 查看校准值   *********/\r\n");
  36. /****************************************/        
  37.         while(1)
  38.                 {
  39.                         function = 0;
  40.                         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  41.                           {
  42.                                  USART_ClearFlag(USART2, USART_FLAG_RXNE);
  43.                                  USART_ClearITPendingBit(USART2,USART_IT_RXNE);
  44.                                  function = USART_ReceiveData(USART2);
  45.                           }
  46.                         if(function)
  47.                          {
  48.                                 switch( function )
  49.                                  {
  50.                                         case 1 ://称重
  51.                                                 Weighing();
  52.                                                 break;
  53.                                         case 2 ://去皮
  54.                                                 GetRoughWeight();
  55.                                           Weighing();
  56.                                                 break;
  57.                                         case 3 ://切换单位
  58.                                                 if(++unit >= 3)unit = 0;
  59.                                           Weighing();                                       
  60.                                                 break;
  61.                                         case 4 ://秤台校准
  62.                                                 WeighingCorrection();
  63.                                                 break;
  64.                                         case 5 ://查看校准值
  65.                                                 printf("校准值 Correction = %f \r\n",Correction);
  66.                                                 break;
  67.                                         default:
  68.                                                 printf("***** 无效指令 *****\r\n");
  69.                                                 break;
  70.                                  }
  71.                          }
  72.                 }
  73. }
  74. /**************     获取毛皮重量   **************/
  75. void GetRoughWeight(void)
  76. {
  77.         repeat:
  78.                 first_weight = FilterCount();
  79.                 delay_ms(1000);
  80.                 delay_ms(1000);/*  2S 后 数据稳定,说明传感器基本稳定 实际灵敏度高了 一点都不稳定  */
  81.                 rough_weight = FilterCount();
  82.         if(first_weight/50 != rough_weight/50)
  83.         goto repeat;
  84. }
  85. /***************   获取实际重量  *********************/
  86. void Weighing(void)
  87. {
  88.         actual_weight = FilterCount();
  89.         actual_weight = actual_weight - rough_weight;
  90. /*****************  单位为千克 kg         *****************/
  91.         if(unit == 0)
  92.                 {
  93.                         weight = ((float)actual_weight / Correction);
  94.                         if(weight > 10000)weight = 0;
  95.                         printf("当前重量 = %.2f kg\r\n",weight);
  96.                 }
  97. /*****************  单位为克  g          *****************/
  98.         if(unit == 1)
  99.                 {
  100.                         weight = ((float)actual_weight / Correction) *1000;
  101.                         if(weight > 10000)weight = 0;
  102.                         printf("当前重量 = %.2f g\r\n",weight);
  103.                 }
  104. /*****************  单位为克拉 ct         *****************/
  105.         if(unit == 2)
  106.                 {
  107.                         weight = ((float)actual_weight / Correction) * 5000;
  108.                         if(weight > 10000)weight = 0;
  109.                         printf("当前重量 = %.3f ct\r\n",weight);
  110.                 }        
  111. }
  112. /*********************** 秤台校准 ***********************/
  113. void WeighingCorrection(void)
  114. {
  115.         printf("请移除秤台上所有异物…… \r\n");
  116.         GetRoughWeight();//获取皮重
  117.         actual_weight = FilterCount();        
  118.         actual_weight = actual_weight - rough_weight;//秤台清零 获取当前的 “0”
  119.         printf("请放置 1 kg 标准砝码…… \r\n");
  120.         delay_ms(1000);
  121.         delay_ms(1000);
  122.         delay_ms(1000);
  123.         delay_ms(1000);
  124.         actual_weight = FilterCount();//获取 1kg 时 hx711 的值
  125.         Correction        = (float)((actual_weight - rough_weight) / 1.000);//获取修正值
  126.         Correction *= 1000;
  127.         SaveFlashParameter();//修正值写入 Flash
  128.         GetFlashParameter(); //将修正值读出,以作使用
  129.         Correction /= 1000;
  130.         printf("校准值 Correction  = %f \r\n",Correction);
  131. }
复制代码

201811031410423.jpg (1.17 MB, 下载次数: 148)

好像有点歪

好像有点歪

201811031410422.jpg (1.07 MB, 下载次数: 263)

打个孔

打个孔

201811031410421.jpg (1.26 MB, 下载次数: 147)

没错,翻缸盖

没错,翻缸盖

20181103141042.jpg (1.9 MB, 下载次数: 139)

看看这是什么

看看这是什么

201811031410424.jpg (1.16 MB, 下载次数: 143)

就这样吧

就这样吧

201811031410425.jpg (1.22 MB, 下载次数: 146)

HX711 成品,淘宝很便宜的,没必要自己做

HX711 成品,淘宝很便宜的,没必要自己做

201811031410426.jpg (1.74 MB, 下载次数: 145)

红 黑 白 绿

红 黑 白 绿

201811031410427.jpg (1.37 MB, 下载次数: 146)

没找到弯针

没找到弯针

201811031410429.jpg (1.1 MB, 下载次数: 139)

这个不错,结实

这个不错,结实

2018110314104210.jpg (1.2 MB, 下载次数: 147)

其实用这个也挺好的,又绝缘

其实用这个也挺好的,又绝缘

2018110314104211.jpg (998.59 KB, 下载次数: 159)

还是当绝缘垫用吧

还是当绝缘垫用吧

2018110314104212.jpg (1.4 MB, 下载次数: 153)

固定一下

固定一下

2018110314104213.jpg (1.91 MB, 下载次数: 144)

还行,不算太丑

还行,不算太丑

0.png (19.12 KB, 下载次数: 133)

0.png

stm32-usart2-hx711-0919.rar

255.09 KB, 下载次数: 200, 下载积分: 黑币 -5

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:58925 发表于 2019-1-24 13:46 | 只看该作者
谢谢分享,好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:75369 发表于 2019-7-31 04:16 | 只看该作者
谢谢分享,楼主的饭碗厉害
回复

使用道具 举报

地板
ID:604602 发表于 2019-8-28 10:04 | 只看该作者
有用,楼主动手能力真强
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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