精华内容
下载资源
问答
  • 使用stm32HX711电子秤设计,STM8
  • hx711串口stm32例程

    2018-05-08 16:17:21
    可用于压力传感器的hx711模块代码,根据不同的传感器,要改变相应的参数才能更加精确
  • HX711-stm32f407

    2018-05-29 14:59:11
    本资源主要是使用STM32-F407配置引脚通过HX711压力传感器模块进行测量物体重量,直接可以使用的,本人自己写的,可以看我的博客,有实际的效果图。
  • 查看: 35712|回复: 60STM32写的HX711程序当前离线积分初级会员, 积分 73, 距离下一级还需 127 积分积分金钱73注册时间2014-8-20在线时间0 小时电梯直达发表于 2014-9-6 19:55:40|只看该作者|只看大图|倒序浏览|阅读...

    查看: 35712|回复: 60

    print.png

    thread-prev.png

    thread-next.png

    STM32写的HX711程序

    当前离线积分

    userinfo.gif

    3cadf8eb7001bb03076bf561ffb73640.png

    star_level2.gif

    初级会员, 积分 73, 距离下一级还需 127 积分

    积分金钱73

    注册时间2014-8-20

    在线时间0 小时

    电梯直达

    fj_btn.png

    online_member.gif

    发表于 2014-9-6 19:55:40

    |

    只看该作者

    |只看大图

    arw_r.gif

    |倒序浏览

    |阅读模式

    5金钱

    我用32写的一个读HX711的程序用来做一个称重传感器,为什么会出现重量越大数值越小

    while(1)

    {

    PAin(1)=1;

    delay_us(5);

    PAout(2)=0;

    temp=0;

    while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1);

    //while(1)

    //{

    PAout(2)=0;

    for(i=0;i<24;i++)

    {

    PAout(2)=1;

    //GPIO_SetBits(GPIOA,GPIO_Pin_2);

    temp=temp<<1;

    delay_us(10);

    PAout(2)=0;

    //GPIO_ResetBits(GPIOA,GPIO_Pin_2);

    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1)

    {

    temp++;

    }

    }

    GPIO_SetBits(GPIOA,GPIO_Pin_2);

    delay_us(10);

    //temp=temp^0x800000;

    GPIO_ResetBits(GPIOA,GPIO_Pin_2);

    //temp=(temp+22020)*0.0676-67880;

    //temp=(temp*0.000000298)*240;

    temp=(temp*0.00298)/42;

    Weight=temp-1;

    printf("%f\n",Weight);

    LCD_ShowNum(30,30,Weight,16,16);

    delay_ms(1000);

    最佳答案

    回复【7楼】欣晨:---------------------------------unsigned long Read_HX711(void)  //读HX711芯片输出的数据。{unsigned long val = 0;unsigned char i = 0;GPIO_SetBits(GPIOB,GPIO_Pin_13);   //DOUT=1GPIO_ResetBits(GPIOB,GPIO_Pin_12);   //SCK=0while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)); & ...

    当前离线

    userinfo.gif

    5273535ea1e80927f503245866d86b4e.png

    star_level2.gif

    star_level1.gif

    中级会员, 积分 335, 距离下一级还需 165 积分

    积分金钱335

    注册时间2013-6-1

    在线时间0 小时

    online_member.gif

    发表于 2014-9-6 19:55:41

    |

    只看该作者

    回复【7楼】欣晨:

    ---------------------------------

    unsigned long Read_HX711(void)  //读HX711芯片输出的数据。

    {

    unsigned long val = 0;

    unsigned char i = 0;

    GPIO_SetBits(GPIOB,GPIO_Pin_13);   //DOUT=1

    GPIO_ResetBits(GPIOB,GPIO_Pin_12);   //SCK=0

    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13));   //等待DOUT=0

    delay_us(1);

    for(i=0;i<24;i++)

    {

    GPIO_SetBits(GPIOB,GPIO_Pin_12);   //SCK=1

    val=val<<1;

    delay_us(1);

    GPIO_ResetBits(GPIOB,GPIO_Pin_12);   //SCK=0

    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13))   //DOUT=1

    val++;

    delay_us(1);

    }

    GPIO_SetBits(GPIOB,GPIO_Pin_12);

    val = val^0x800000;

    delay_us(1);

    GPIO_ResetBits(GPIOB,GPIO_Pin_12);

    delay_us(1);

    return val;

    }

    亲测无误,不用谢

    当前离线

    userinfo.gif

    5273535ea1e80927f503245866d86b4e.png

    star_level2.gif

    star_level1.gif

    中级会员, 积分 335, 距离下一级还需 165 积分

    积分金钱335

    注册时间2013-6-1

    在线时间0 小时

    online_member.gif

    发表于 2014-9-6 19:55:41

    |

    只看该作者

    回复【17楼】xingzhe:

    ---------------------------------

    那就是传感器受力方向反了。。。

    2366c2f52f6a214538673322e1494f6d.png

    star_level3.gif

    star_level3.gif

    star_level3.gif

    积分金钱157747

    注册时间2010-12-1

    在线时间1919 小时

    online_admin.gif

    发表于 2014-9-6 22:23:43

    |

    只看该作者

    帮顶....

    a665a88c88b37a7eae5a97db2d22b260.png

    新手上路, 积分 33, 距离下一级还需 17 积分

    积分金钱33

    注册时间2014-9-7

    在线时间0 小时

    online_member.gif

    发表于 2014-9-7 11:47:21

    |

    只看该作者

    可能是传感器放的方向不对,你用的是应变片式的称重传感器吗?

    ab99be357bb4a12fdc7f443eedd45397.png

    star_level3.gif

    star_level2.gif

    金牌会员, 积分 2222, 距离下一级还需 778 积分

    积分金钱2222

    注册时间2011-12-15

    在线时间37 小时

    online_member.gif

    发表于 2014-9-7 12:37:19

    |

    只看该作者

    说明你操作错误了,HX711还是蛮简单的。

    专业制作STM32 物联网通信模块板,模块交流群:369840039。

    当前离线积分

    userinfo.gif

    3cadf8eb7001bb03076bf561ffb73640.png

    star_level2.gif

    初级会员, 积分 73, 距离下一级还需 127 积分

    积分金钱73

    注册时间2014-8-20

    在线时间0 小时

    ico_lz.png

    楼主|

    发表于 2014-9-8 15:03:14

    |

    只看该作者

    回复【3楼】大叔的萌妹纸:

    ---------------------------------

    我用的是S型的

    e77357ac492f4bfccc04eec5c8e864fa.gif

    新手上路, 积分 34, 距离下一级还需 16 积分

    积分金钱34

    注册时间2014-9-8

    在线时间5 小时

    online_member.gif

    发表于 2014-9-8 18:20:19

    |

    只看该作者

    你怎么定义的端口啊

    当前离线积分

    userinfo.gif

    6023d34aa14a4f889720c6b27b0826c6.gif

    新手上路, 积分 39, 距离下一级还需 11 积分

    积分金钱39

    注册时间2014-3-15

    在线时间0 小时

    online_member.gif

    发表于 2014-10-18 10:46:06

    |

    只看该作者

    楼主是怎么解决的我也出现了同样的问题  求指导

    当前离线

    qq.gifuserinfo.gif

    a37b41f12b55d161c434cf49a713bd7d.png

    star_level3.gif

    高级会员, 积分 568, 距离下一级还需 432 积分

    积分金钱568

    注册时间2014-5-12

    在线时间149 小时

    online_member.gif

    发表于 2014-10-21 14:34:32

    |

    只看该作者

    回复【8楼】Scy:

    ---------------------------------

    跪求完整程序  包括端口设置的 我的估计是端口设置问题

    当前离线

    userinfo.gif

    5273535ea1e80927f503245866d86b4e.png

    star_level2.gif

    star_level1.gif

    中级会员, 积分 335, 距离下一级还需 165 积分

    积分金钱335

    注册时间2013-6-1

    在线时间0 小时

    online_member.gif

    发表于 2014-10-21 21:11:44

    |

    只看该作者

    回复【9楼】新生:

    ---------------------------------

    void HX711_Init(void)//初始化HX711端口

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //SCK

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //DOUT

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

    GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5

    }

    605353b5e1baf8daf4649d3f6b859101.gif

    新手上路, 积分 47, 距离下一级还需 3 积分

    积分金钱47

    注册时间2012-9-19

    在线时间0 小时

    online_member.gif

    发表于 2014-10-22 13:42:51

    |

    只看该作者

    回复【10楼】Scy:

    ---------------------------------

    请教一下去皮清零功能如何写?最近有个项目做个电子秤测试压力的。对这个不是很熟悉?能交流一下吗?

    当前离线

    qq.gifuserinfo.gif

    a37b41f12b55d161c434cf49a713bd7d.png

    star_level3.gif

    高级会员, 积分 568, 距离下一级还需 432 积分

    积分金钱568

    注册时间2014-5-12

    在线时间149 小时

    online_member.gif

    发表于 2014-10-22 17:32:19

    |

    只看该作者

    #ifndef __HX711_H__

    #define __HX711_H__

    void ADInit(void); //??????AD?????????ü??????I/O??????

    unsigned long HX711_Read(void);  //??AD???????????????

    #endif

    #include "stm32f10x.h"

    #include "hx711.h"

    #include "delay.h"

    #define ADIO GPIOC        //?¨??AD??????????I/O????×é??

    #define DATA GPIO_Pin_11  //?¨??AD????????????????????????

    #define CLK  GPIO_Pin_10  //?¨??AD???????±????????????????

    #define ADCLK RCC_APB2Periph_GPIOC  //?¨??AD?????ù??????I/O???????±???

    void ADInit(void) //??????AD??????????I/O??????

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(ADCLK,ENABLE);

    GPIO_InitStructure.GPIO_Pin = CLK;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //CLK?????¨??????????

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(ADIO,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = DATA;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//DATA?????¨??????????

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(ADIO,&GPIO_InitStructure);

    }

    unsigned long HX711_Read(void)  //??AD????????????????

    {

    unsigned long val = 0;

    unsigned char i = 0;

    GPIO_SetBits(ADIO,DATA);

    GPIO_ResetBits(ADIO,CLK);

    while(GPIO_ReadInputDataBit(ADIO,DATA));

    delay_us(1);

    for(i=0;i<24;i++)

    {

    GPIO_SetBits(ADIO,CLK);

    val=val<<1;

    delay_us(1);

    GPIO_ResetBits(ADIO,CLK);

    if(GPIO_ReadInputDataBit(ADIO,DATA))

    val++;

    delay_us(1);

    }

    GPIO_SetBits(ADIO,CLK);

    val = val^0x800000;

    delay_us(1);

    GPIO_ResetBits(ADIO,CLK);

    delay_us(1);

    return val;

    }

    当前离线

    qq.gifuserinfo.gif

    a37b41f12b55d161c434cf49a713bd7d.png

    star_level3.gif

    高级会员, 积分 568, 距离下一级还需 432 积分

    积分金钱568

    注册时间2014-5-12

    在线时间149 小时

    online_member.gif

    发表于 2014-10-22 17:33:07

    |

    只看该作者

    调试通过 .H .C文件都上传了 供有需要的人下载吧

    e451c1e0d49ece02e651b8f1efdf238e.gif

    新手入门, 积分 23, 距离下一级还需 -3 积分

    积分金钱23

    注册时间2013-5-8

    在线时间0 小时

    online_member.gif

    发表于 2014-12-3 16:08:55

    |

    只看该作者

    跟楼主出现了一样状况,程序也是调试通过的程序,信号线也对掉过 还是不行! 求指导

    当前离线

    userinfo.gif

    5273535ea1e80927f503245866d86b4e.png

    star_level2.gif

    star_level1.gif

    中级会员, 积分 335, 距离下一级还需 165 积分

    积分金钱335

    注册时间2013-6-1

    在线时间0 小时

    online_member.gif

    发表于 2014-12-3 16:53:22

    |

    只看该作者

    回复【14楼】xingzhe:

    ---------------------------------

    输出信号是带符号的,负数时这个数据的bit23是符号位

    你确定你的程序里写了val = val^0x800000; ?

    当前离线

    userinfo.gif

    5273535ea1e80927f503245866d86b4e.png

    star_level2.gif

    star_level1.gif

    中级会员, 积分 335, 距离下一级还需 165 积分

    积分金钱335

    注册时间2013-6-1

    在线时间0 小时

    online_member.gif

    发表于 2014-12-3 16:53:54

    |

    只看该作者

    回复【11楼】nishuizhou:

    ---------------------------------

    抱歉没看到,我没有继续做下去,所以没办法帮你

    e451c1e0d49ece02e651b8f1efdf238e.gif

    新手入门, 积分 23, 距离下一级还需 -3 积分

    积分金钱23

    注册时间2013-5-8

    在线时间0 小时

    online_member.gif

    发表于 2014-12-3 17:18:47

    |

    只看该作者

    回复【15楼】Scy:

    ---------------------------------

    I’m SURE!! 程序如下:  基本和你的一样 !

    unsigned long ReadAD(void)  //??AD????????????????

    {

    unsigned long val = 0;

    unsigned char i = 0;

    GPIO_SetBits(ADIO,DATA);

    GPIO_ResetBits(ADIO,CLK);

    while(GPIO_ReadInputDataBit(ADIO,DATA));

    delay_us(1);

    for(i=0;i<24;i++)

    {

    GPIO_SetBits(ADIO,CLK);

    val=val<<1;

    delay_us(1);

    GPIO_ResetBits(ADIO,CLK);

    if(GPIO_ReadInputDataBit(ADIO,DATA))

    val++;

    delay_us(1);

    }

    GPIO_SetBits(ADIO,CLK);

    val = val^0x800000;

    delay_us(1);

    GPIO_ResetBits(ADIO,CLK);

    delay_us(1);

    return val;

    }

    e451c1e0d49ece02e651b8f1efdf238e.gif

    新手入门, 积分 23, 距离下一级还需 -3 积分

    积分金钱23

    注册时间2013-5-8

    在线时间0 小时

    online_member.gif

    发表于 2015-1-5 11:16:18

    |

    只看该作者

    回复【18楼】Scy:

    ---------------------------------

    已解决,确实是信号线 S+ 与S— 接反了,3Q very much!!

    7b8c22bcd1df63cdca228f62b990f74e.png

    star_level2.gif

    star_level1.gif

    中级会员, 积分 404, 距离下一级还需 96 积分

    积分金钱404

    注册时间2013-1-11

    在线时间107 小时

    online_member.gif

    发表于 2015-5-12 14:55:04

    |

    只看该作者

    回复【8楼】Scy:

    ---------------------------------

    谢谢,好使

    为啥还要考试啊。。。。。。。

    4ac59d75e7cccb402d736de1795179cf.png

    star_level2.gif

    初级会员, 积分 58, 距离下一级还需 142 积分

    积分金钱58

    注册时间2015-1-26

    在线时间6 小时

    online_member.gif

    发表于 2015-5-27 21:11:19

    |

    只看该作者

    你好,请问你们用711做的电子称转换速度为多大,能达到毫秒级别么

    199014267f1e30df6ce9c6bcd18248c3.png

    star_level2.gif

    初级会员, 积分 66, 距离下一级还需 134 积分

    积分金钱66

    注册时间2012-9-12

    在线时间8 小时

    online_member.gif

    发表于 2015-5-29 16:51:50

    |

    只看该作者

    回复【8楼】Scy:

    ---------------------------------

    你好!请问你有做温度补偿的吗?

    当前离线

    userinfo.gif

    5273535ea1e80927f503245866d86b4e.png

    star_level2.gif

    star_level1.gif

    中级会员, 积分 335, 距离下一级还需 165 积分

    积分金钱335

    注册时间2013-6-1

    在线时间0 小时

    online_member.gif

    发表于 2015-6-4 20:48:47

    |

    只看该作者

    回复【22楼】刀锋1937:

    ---------------------------------

    没有

    当前离线积分

    userinfo.gif

    f215f023be996c11ab127a05f5dd1e72.gif

    新手上路, 积分 36, 距离下一级还需 14 积分

    积分金钱36

    注册时间2015-6-24

    在线时间0 小时

    online_member.gif

    发表于 2015-6-25 10:46:36

    |

    只看该作者

    回复【8楼】Scy:

    ---------------------------------

    还要有其他的配置程序吧

    a4f77a3f72760fbfdae9f442648bffce.gif

    star_level2.gif

    初级会员, 积分 54, 距离下一级还需 146 积分

    积分金钱54

    注册时间2015-5-21

    在线时间11 小时

    online_member.gif

    发表于 2015-7-8 14:58:44

    |

    只看该作者

    /*******************************************************

    ±?????????????×÷?????????÷ר??AD???? HX711 ?????ò??

    ********************************************************/

    #include 

    #include "ad_hx711.h"

    #include "delay.h"

    #include "usart.h"

    #define ADIO GPIOA        //?¨??AD??????????I/O????×é??

    #define DATA GPIO_Pin_0  //?¨??AD????????????????????????

    #define CLK  GPIO_Pin_1  //?¨??AD???????±????????????????

    #define ADCLK RCC_AHB1Periph_GPIOA  //?¨??AD?????ù??????I/O???????±????

    void ADInit(void) //??????AD??????????I/O??????

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB1PeriphClockCmd(ADCLK,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_Init(ADIO,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = DATA;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//DATA?????¨?????????

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(ADIO,&GPIO_InitStructure);

    }

    unsigned long ReadAD(void)  //??AD????????????????

    {

    unsigned long val = 0;

    unsigned char i = 0;

    GPIO_SetBits(ADIO,DATA);

    GPIO_ResetBits(ADIO,CLK);

    while(GPIO_ReadInputDataBit(ADIO,DATA));

    delay_us(5);

    for(i=0;i<24;i++)

    {

    GPIO_SetBits(ADIO,CLK);

    val=val<<1;

    delay_us(5);

    GPIO_ResetBits(ADIO,CLK);

    if(GPIO_ReadInputDataBit(ADIO,DATA))

    val++;

    delay_us(5);

    }

    GPIO_SetBits(ADIO,CLK);

    val = val^0x800000;

    delay_us(5);

    GPIO_ResetBits(ADIO,CLK);

    delay_us(5);

    return val;

    }

    long double filter(void)  //?????ù?????¨·¨????????

    {

    unsigned long max=0,min=0,SUM,BUF[12],Average;

    int i=0;

    for(i=0;i<12;i++)

    {

    BUF=ReadAD();

    printf("%ld\r\n",BUF);

    if(i==0)

    {

    max=BUF[0];

    min=BUF[0];

    }

    if(i>0)

    {

    if(BUF>max) max=BUF;

    if(BUF

    }

    }

    for(i=0;i<12;i++)

    {

    if(!(BUF==max||BUF==min))

    {

    SUM=SUM+BUF;

    }

    }

    Average=SUM/(12-2);

    return Average;

    }>

    a4f77a3f72760fbfdae9f442648bffce.gif

    star_level2.gif

    初级会员, 积分 54, 距离下一级还需 146 积分

    积分金钱54

    注册时间2015-5-21

    在线时间11 小时

    online_member.gif

    发表于 2015-7-8 14:59:58

    |

    只看该作者

    回复【25楼】zhangfeng:

    ---------------------------------

    大神们能不能帮我看一看,有什么问题,为什么读出来的数一只是8388608

    d747124722d087847aa0feb397b32492.gif

    新手入门, 积分 21, 距离下一级还需 -1 积分

    积分金钱21

    注册时间2015-7-12

    在线时间0 小时

    online_member.gif

    发表于 2015-7-12 22:52:05

    |

    只看该作者

    回复【13楼】新生:

    ---------------------------------

    请问.h和.c是上传到哪里了啊?

    d99e334d849de218366ab478dac60300.gif

    新手入门, 积分 22, 距离下一级还需 -2 积分

    积分金钱22

    注册时间2015-9-14

    在线时间0 小时

    online_member.gif

    发表于 2015-9-15 18:54:45

    |

    只看该作者

    回复【19楼】xingzhe:

    ---------------------------------

    请问你下, 你的压力传感器  用的是什么啊  , 量程是多少的,可以发下链接吗

    d99e334d849de218366ab478dac60300.gif

    新手入门, 积分 22, 距离下一级还需 -2 积分

    积分金钱22

    注册时间2015-9-14

    在线时间0 小时

    online_member.gif

    发表于 2015-9-15 18:55:38

    |

    只看该作者

    请问你下, 你的压力传感器  用的是什么啊  , 量程是多少的,可以发下链接吗

    bf706ea72994bf086e1bec5892d62346.png

    star_level2.gif

    star_level1.gif

    中级会员, 积分 418, 距离下一级还需 82 积分

    积分金钱418

    注册时间2015-5-5

    在线时间23 小时

    online_member.gif

    发表于 2015-12-25 13:48:15

    |

    只看该作者

    回复【8楼】Scy:

    ---------------------------------

    帅哥。把称重模块的完整程序发一份给我吧

    弹起华丽的乐章 撕下最后的伪装

    bf706ea72994bf086e1bec5892d62346.png

    star_level2.gif

    star_level1.gif

    中级会员, 积分 418, 距离下一级还需 82 积分

    积分金钱418

    注册时间2015-5-5

    在线时间23 小时

    online_member.gif

    发表于 2015-12-25 14:43:31

    |

    只看该作者

    回复【8楼】Scy:

    ---------------------------------

    主程序是如何写。

    弹起华丽的乐章 撕下最后的伪装

    f9348ce8f7ed64d3dfe035f7dbdc834c.gif

    新手入门, 积分 7, 距离下一级还需 13 积分

    积分金钱7

    注册时间2016-5-8

    在线时间0 小时

    online_member.gif

    发表于 2016-5-8 20:44:49

    |

    只看该作者

    楼主你好,能发一份正确的程序给我参考下吗?m18710317500@163.com  谢谢

    f103a500bf616d0977bcfbe2e154f110.png

    star_level3.gif

    star_level3.gif

    积分金钱3635

    注册时间2015-4-18

    在线时间370 小时

    online_member.gif

    发表于 2016-7-4 09:29:31

    |

    只看该作者

    确实是可以的。。。。

    4d0f189e0efccce2696a18f42d9e1735.gif

    新手上路, 积分 42, 距离下一级还需 8 积分

    积分金钱42

    注册时间2016-7-9

    在线时间9 小时

    online_member.gif

    发表于 2016-7-9 16:29:14

    |

    只看该作者

    积分

    userinfo.gif

    b33f2b8d364aa8b7eceaba0d7a1b5591.gif

    新手入门, 积分 9, 距离下一级还需 11 积分

    积分金钱9

    注册时间2016-7-9

    在线时间0 小时

    online_member.gif

    发表于 2016-7-9 21:04:08

    |

    只看该作者

    亲,可以给个注释么,新手,谢谢哈

    1a827b5232f85ad53748f1873789d941.png

    star_level2.gif

    初级会员, 积分 132, 距离下一级还需 68 积分

    积分金钱132

    注册时间2016-6-1

    在线时间33 小时

    online_member.gif

    发表于 2016-7-25 10:07:48

    |

    只看该作者

    60f912ef2f456a7e99243f3a5451a68d.png

    star_level2.gif

    初级会员, 积分 130, 距离下一级还需 70 积分

    积分金钱130

    注册时间2016-3-27

    在线时间83 小时

    online_member.gif

    发表于 2016-8-29 21:02:29

    |

    只看该作者

    没有完整的程序吗,驱动部分看明白了,主程序怎么写呢

    当前离线积分

    userinfo.gif

    b948cf32a106f0c6af9c2f22b9cd25fe.png

    star_level2.gif

    初级会员, 积分 66, 距离下一级还需 134 积分

    积分金钱66

    注册时间2016-3-10

    在线时间14 小时

    online_member.gif

    发表于 2016-10-31 22:50:34

    |

    只看该作者

    有没有 完整版的 发一份  新手有点费劲

    sad.gif

    sad.gif

    2b6d528e278851bda7429c6bf4612a6a.png

    star_level3.gif

    star_level2.gif

    金牌会员, 积分 1099, 距离下一级还需 1901 积分

    积分金钱1099

    注册时间2016-7-19

    在线时间168 小时

    online_member.gif

    发表于 2016-11-21 10:25:38

    |

    只看该作者

    你好!

    val = val^0x800000;

    这句话的作用没看明白,val是补码数据,与0x800000进行异或,如果是负数则可以将补码转化为源码,但如果是正数就不行了呀。请问这句话的作用是什么诶

    2b6d528e278851bda7429c6bf4612a6a.png

    star_level3.gif

    star_level2.gif

    金牌会员, 积分 1099, 距离下一级还需 1901 积分

    积分金钱1099

    注册时间2016-7-19

    在线时间168 小时

    online_member.gif

    发表于 2016-11-21 13:17:18

    |

    只看该作者

    楼主你好,请问你的Hx711是买的模块吗?我现在买了一个模块是要求5V左右提供电工作电压,但看芯片手册有个要求:数字电源(DVDD)应使用与 MCU 芯片相同的的数字供电电源。那如果用STM32可以吗

    xinruhzishui 该用户已被删除

    online_member.gif

    发表于 2017-3-12 10:03:04

    |

    只看该作者

    提示: 作者被禁止或删除 内容自动屏蔽

    51d5c03aa122ff0fdc21bc19b7ffed0a.png

    star_level2.gif

    初级会员, 积分 193, 距离下一级还需 7 积分

    积分金钱193

    注册时间2017-2-14

    在线时间21 小时

    online_member.gif

    发表于 2017-4-11 10:24:21

    |

    只看该作者

    求助,为什么我的程序读出来的值一直是-1。不知道你有没有遇到过这种情况

    技术不行的技术宅

    51d5c03aa122ff0fdc21bc19b7ffed0a.png

    star_level2.gif

    初级会员, 积分 193, 距离下一级还需 7 积分

    积分金钱193

    注册时间2017-2-14

    在线时间21 小时

    online_member.gif

    发表于 2017-4-14 16:49:44

    |

    只看该作者

    技术不行的技术宅

    当前离线积分

    userinfo.gif

    90ad0eaabad24f4f9e4057f6bf68743b.gif

    新手上路, 积分 38, 距离下一级还需 12 积分

    积分金钱38

    注册时间2017-4-14

    在线时间5 小时

    online_member.gif

    发表于 2017-5-4 14:42:58

    |

    只看该作者

    我也在弄hx711,但跑程序的时候,if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1)这个判断总是否定,temp一直是0,为什么啊?

    当前离线积分

    userinfo.gif

    90ad0eaabad24f4f9e4057f6bf68743b.gif

    新手上路, 积分 38, 距离下一级还需 12 积分

    积分金钱38

    注册时间2017-4-14

    在线时间5 小时

    online_member.gif

    发表于 2017-5-4 15:14:45

    |

    只看该作者

    DATA一直为0,总跳不到temp++;这一句,最后出来val=0异或0x8000000 出来8388608

    当前离线积分

    userinfo.gif

    90ad0eaabad24f4f9e4057f6bf68743b.gif

    新手上路, 积分 38, 距离下一级还需 12 积分

    积分金钱38

    注册时间2017-4-14

    在线时间5 小时

    online_member.gif

    发表于 2017-5-4 15:15:10

    |

    只看该作者

    有人能解释一下吗

    当前离线

    userinfo.gif

    dafc576fa3b43b976642a747ccc0004f.png

    star_level3.gif

    高级会员, 积分 523, 距离下一级还需 477 积分

    积分金钱523

    注册时间2016-1-11

    在线时间132 小时

    online_member.gif

    发表于 2017-5-4 17:11:17

    |

    只看该作者

    当前离线积分

    qq.gifuserinfo.gif

    c1b18da9e842faa813e78614571a2e60.png

    新手上路, 积分 32, 距离下一级还需 18 积分

    积分金钱32

    注册时间2013-11-3

    在线时间3 小时

    online_member.gif

    发表于 2017-5-5 09:38:04

    |

    只看该作者

    楼主能发一份源码作参考吗?万分感谢

    当前离线积分

    qq.gifuserinfo.gif

    c1b18da9e842faa813e78614571a2e60.png

    新手上路, 积分 32, 距离下一级还需 18 积分

    积分金钱32

    注册时间2013-11-3

    在线时间3 小时

    online_member.gif

    发表于 2017-5-5 09:44:05

    |

    只看该作者

    楼主能发一份源码作参考吗?万分感谢 1569190243@qq.com

    当前离线积分

    userinfo.gif

    90ad0eaabad24f4f9e4057f6bf68743b.gif

    新手上路, 积分 38, 距离下一级还需 12 积分

    积分金钱38

    注册时间2017-4-14

    在线时间5 小时

    online_member.gif

    发表于 2017-5-5 11:16:37

    |

    只看该作者

    展开全文
  • STM32F103称重模块HX711调试 #include "sys_init.h" unsigned long HX711_Buffer = 0; unsigned long Weight_Maopi = 0,Weight_Shiwu = 0; void Get_Maopi() { HX711_Buffer = HX711_Read(); Weight_Maopi = ...
  • STM32 hx711电子称程序

    2016-02-24 15:24:16
    提供STM32接收HX711对传感器信号放大,A/D转换成的数字信号的代码,以及数字滤波(限幅平均滤波)代码,有去皮,调整比例功能
  • stm32f103 HX711串口例程

    2016-04-07 15:08:18
    stm32f103 HX711串口例程
  • 电子秤.rar STM32 HX711

    2021-07-04 19:09:05
    STM32F103单片机,HX711模数转换芯片,全桥电阻应变片,TFT液晶屏显示
  • stm32下的HX711称重模块的程序

    万次阅读 多人点赞 2018-08-15 20:18:15
    HX711模块本身特别好,24位AD,加内部放大器(可以64和128增益,放大倍数),但无奈它的串口太智障,解释的也不是很清楚。现在我程序调试成功了,使用的HAL库,下载链接如下: ... 注意,这里的说明只包含关键部分——...

    HX711模块本身特别好,24位AD,加内部放大器(可以64和128增益,放大倍数),但无奈它的串口太智障,解释的也不是很清楚。现在我程序调试成功了,使用的HAL库,下载链接如下:

    https://download.csdn.net/download/kissgoodbye2012/10606554

    注意,这里的说明只包含关键部分——串口部分,其他的自己看datasheet或者淘宝的资料了解。

    1.与HX711连接的单片机需要的外设资源,两个普通IO口,一个输入(推荐浮空输入),一个输出。

    如下图所示:对于HX711模块,其中DT(Dout),用于向外传输数据,也就是数据线,方向对外;其中SCK(PD_SCK)是输入外部时钟的,也就是时钟线。

    所以,对于单片机,需要一个输入IO口,读取Dout的数据;需要一个输出IO口,发送时钟信号(方波),输出给HX711模块。

    2.串口时序

    想要正确使用这个串口需要读时序图,如图所示:

    对于单片机来说,与Dout连接的输入IO口,电平从高变成低电平,说明HX711准备好了,可以发送数据了。

    这个时候,与PD_SCK连接的输出IO口,开始发送方波(时钟),每个方波读取一位数据,数据总共24位。

    图上有三个PD_SCK的时序图,是用于选择下一次不同的通道和增益用的,所以这个模块可以同时采集两路惠斯通电桥的值。按照实际情况,选择一种或者两种的组合。所以单片机最少要发25个脉冲,前24个用于读取这次的AD转换数据,最后一个用于选择下一次的通道和增益。

    注意:其实关键的就是那几个T1,2,3,4的时间要求,不能低于也不能超时,否则都不能得到正确结果。

    3.程序讲解——关键部分

    我用的HAL库,所以就这样讲了,原理一样你可以用标准库实现。

    (1)延时us函数,我就用简单的用软件延时实现了,你可以自己用其他方法实现,越准对实现越有利其实。

    (2)读取采样值

    HX711模块的串口输出数据为24位的转换值数据。

    代码如下,count为读取到的值,通过移位,一位一位读取;

    首先,将单片机输出口变成低电平,如果高电平达到一定时间会复位HX711模块的,所以平时一定将输出口电平置为低;

    然后就是等待单片机输入口的电平变低,为了防止硬件出错,在这里设置了超时时间,实际效果大概1s,过了1s直接跳出循环,           避免一直等待,同时超时跳出时的AD值非常大,容易排除它;然后就加了一个误触发消除,用的延时的方法。

    然后就进入读取AD转换值了,先将单片机输出口电平变高,延时一定时间,然后变低,然后读入输入口的电平状态,写入count.

    最后,循环24次后,发最后一个脉冲,说明下一次AD转换为通道A,128增益。与0x800000异或是因为为了排除负值,这个后面会讲。

    到这里,AD转换后的值就读取了,后面的就简单了,看你怎样用数据吧,读取实际的重量,淘宝的资料足够了。

    //****************************************************
    //读取HX711,对第一个交互力传感器
    //****************************************************
    unsigned long HX711_Read(void)	//增益128
    {
    	unsigned long count; 
    	unsigned char i; 	
    	
      	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);//模块没准备好时,单片机在CLK线上输出低电平
      	count=0;
    	int ii=0;
        while(1)
    	{
    	    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==0)
    		{
    			delay_us(1);
    			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==0)
    			{
    				break;
    			}			
    		}
    			
    		ii++;
    		if(ii>=1000000)
    		{
    			break;
    		}
    	}
    	delay_us(1);
      	for(i=0;i<24;i++)
    	{ 			
    		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
    		delay_us(1);
    	  	count=count<<1; 	
    		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);		
    	  	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==1)//读入数据
    		{
    			count++; 
    		}		
    			
    	} 
    	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET);
    	delay_us(2);
        count=count^0x800000;//第25个脉冲下降沿来时,转换数据
    	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET);
    	return(count);
    }

    4.为什么异或0x800000.

    查看博客:https://blog.csdn.net/yanjinxu/article/details/47861323

    写的不错,这样我就懂了

    5.最后,是防坑指南

    HX711是有10Hz或80Hz可选采样输出的。

    关于这个的理解我也说一下吧:意思是只能是这两个采样率,就算你串口读取的查询频率再高,比如100Hz,1000Hz去使用读取函数,都只能等着,就是等Hx711模块到10Hz或这80Hz的时间到了,给你发送数据。

    (1)淘宝购买的传感器加模块

    如图,这家的货还是挺好的,但是传感器模块只能10Hz输出频率,不能选择80Hz,它硬件做死了,没给选择接口,淘宝上类似的HX711模块一大堆,反正只要和它长得一样,就是10Hz输出的,不能选择80Hz。

    芯片上选择10Hz还是80Hz的引脚是:15 RATE引脚,具体看datasheet

    一种解决方法是:将芯片的右边第2和第3引脚(与GND连接的)的走线用刀割断,然后将右边第2与右边第1引脚(与VCC-5V连接的)焊锡连接。或者就是,买淘宝单独的带选择引脚的模块,这个是有的,也不贵,这样输出频率就可以选择80Hz。

    (2)不同的压力传感器在空载的时候是有读数差异的

    实测:有的空载是0,有的空载是200g。

    这个后期可以通过标定,或者程序上的操作修改,这个看自己吧。好了,经验分享完毕,有人有对程序的改进建议,欢迎告知。

    展开全文
  • STM32 HX711驱动程序

    2021-07-21 09:26:43
    IO使用宏定义,使用时候只需更改.h文件IO对应你的IO即可
  • 关于STM32和压力传感器HX711的连接问题:STM32F407和HX711的代码需要使用串口吗?如果需要使用,具体要用哪个串口呢?还有STM32F407的仿真和HX711的仿真要在哪里做呢?
  • 基于stm32hx711的压力传感器代码

    热门讨论 2015-07-09 20:27:41
    单片机是STM32F103ZET6,结合HX711读取压力传感器传输进来的压力值,利用串口送到PC显示
  • 使用库函数编写,平台为STM32F407,串口直接打印出测量数据
  • STM32-CS1237&HX711;.zip

    2019-08-13 21:34:24
    STM32F103 用CS1237 /HX711 芯片制作电子秤 具体可参考: https://blog.csdn.net/qq_28056277/article/details/99445088
  • STM32HX711电子秤设计

    2020-11-24 10:14:04
    基于STM32F4的电子屏OLED显示的16按键矩阵按键设置单价,加减乘除按键实现电子秤的设计。(有小数点功能)
  • 1,基于STM32+HX711芯片的称重程序代码,称重程序见附件,实际重量和实物的函数关系需要自己按照实际情况推导,一般是线性关系,非常简单;只要测试几组已知重量的实物,然后测试weight函数返回值,根据这几组数据...
  • 【正点原子】阿波罗STM32F767开发板 使用hx711称重传感器采集数据, 串口输出重量。当采集重量大于1000g时,让PB1引脚置1,外接的灯亮。
  • STM32单片机驱动hx711.c

    2021-08-03 14:33:46
    代码已验证
  • STM32F103 用CS1237 /HX711 芯片制作电子秤

    千次阅读 热门讨论 2019-08-13 21:33:34
    STM32F103 用CS1237 /HX711 芯片制作电子秤 ** 【注:学习STM32总结做的笔记,大神勿喷。有不足之处还望不吝赐教,谢谢。工程代码在最后。】 19年全国大学生电子设计大赛 简易多功能液体容器电子秤 CS1237 HX711 ...

    STM32F103 用CS1237 /HX711 芯片制作电子秤

    【注:学习STM32总结做的笔记,大神勿喷。有不足之处还望不吝赐教,谢谢。工程代码在最后。】

    19年全国大学生电子设计大赛 简易多功能液体容器电子秤 CS1237 HX711 压力传感器 STM32F103 2019年全国大学生电子设计竞赛试题清单 2019年全国大学生电子设计竞赛仪器设备和主要元器件清单


    【福利/参考/学习资料】
    2019年全国大学生电子设计竞赛仪器设备和主要元器件清单
    2019年全国大学生电子设计竞赛试题清单
    2017年全国大学生电子设计竞赛仪器设备和主要元器件清单
    全国大学生电子设计竞赛资料(收集)
    https://pan.baidu.com/s/1Ayy-kWOaLqlpOQgsYy7UUw
    https://pan.baidu.com/s/1fhTiDL7GUUBYx-WcJoWHNQ
    https://pan.baidu.com/s/1–VqCzF2nMporwkkKYIrXw
    https://pan.baidu.com/s/1eIk9hmbHhbBSZ4tW1o1T7Q
    (文件太多,只能分开)

    本人有幸参与了19年的全国大学生电子设计大赛(广东赛区选拔赛),选择了K题,制作简易多功能液体容器,(即,电子秤与及检测重量、分辨不同液体和高度、密度等物理量)。
    在这里插入图片描述在这里插入图片描述
    电子秤制作原理什么的就不多介绍了,下面链接是电子秤制作原理,想具体了解的,可以看看。
    http://www.doc88.com/p-695275844769.html
    这比赛呢,我们团队使用超声波测高、电子秤测重、PH计测酸、电导计测电导,从物理、化学的角度考虑,通过不同传感器检测不同液体AD值,从而区分不同液体,具体怎么做就不细说了。。


    本篇就只简单介绍STM32F103 用CS1237 /HX711 芯片制作电子秤,比赛其他的就不涉及了。

    直接上原理图:
    在这里插入图片描述

    测重,用 CS1237 和 HX711 芯片,其实做法一样,只要数据稳定,都能精准检测。程序写法都一样的,反正这两种芯片我都试了,都ok的,但下面我就以CS1237芯片的为例。
    下面就看代码吧,我把要注意的都注释说明了,不懂再联系我。
    就是为了数据的精准度,我采用了多次分段测量,求重量和AD的关系;然后通过每次测量得到的AD,反推,就能得到一个精准的重量。
    注:压力传感器形变测量有最大限制,如果超过后可能会造成永久性物理损坏。

    mian.c

    #include "stm32f10x.h"
    #include "uart.h"
    #include "cs1237.h"
    #include "key.h"
    
    /*
      2019.8.12 子非鱼
      测重,用 CS1237 和 HX711 芯片,其实做法一样,只要数据稳定,都能精准检测。程序写法都一样的。
    */
    
    float one_weight=0,two_weight,weight,zhun_weight,zhongliang;		//重量
    
    int main(void)
    {	
    	int i;	
    	int32_t temp,adc,one_zhongliang; //  ,zhongliang
    	
    	USART1_Init(); // 初始化串口1 波特率9600
    	CS1237_Init_JX();
    	delay_ms(300);
    	CS1237_Config();
    	delay_ms(100);
    	USART1_Send_byte(Read_Config());
    	
    	 
    /*第一次取值 用作基准值 用于复位后去皮用 我比赛时没用到这段*/
    
    //	for(i=0;i<20;i++)  /* 用于复位后 循环取第19次值 前面的值用于稳定数据 */
    //	{
    //		weight = Read_CS1237();/*读取CS1237的数据*/
    //		weight = weight + 28000; /* +28000 是因为传感器/芯片的原因导致读回来的值,是负值(-20500~正数++)。需要制零(尽可能接近零),方便从零开始计数。也有些是往负数++ ,这需要看情况。 */
    //		if(i==19)
    //		{
    //		one_weight = weight;
    //		}
    //	//  printf("*******%f/r/n  ",one_weight);			
    //	}		
    //	delay_ms(100);
    
    
      while (1)
      { 
    ///
    /*
    实时按键去皮(清零)
    跟上面注释的说明一样的,现在只是实时按键清零而已
    */
    		if(KEY1==0)
    			{
    		delay_ms(10);
    		one_weight = Read_CS1237();//读取CS1237的数据
    	    one_weight = one_weight + 28000;					
    		}
    /		
    					
    		two_weight = Read_CS1237();//读取CS1237的数据
    	    two_weight = two_weight + 28000;//取一次值,处理一次
    		two_weight = two_weight - one_weight;	/* one_weight定义时值要为零,否则会出错 */
    	    weight     = two_weight/100000; //这里对读取CS1237的数据 缩小了100000倍(可以缩小,也可以不缩小。我的缩小了)
    		
    //		printf("*******%f/r/n  ",weight);
    		
    /
    		
    /*
    下面采用数据分段计算的方法,以求更高的精度
    
    		    c = ad / g  
    
    被测物质量g                  对应值ad ( weight )                系数c ( ad/g )
    50                             0.210                            0.0042
    100                            0.420                            0.0042
    150                            0.629                            0.00419
    200                            0.833                            0.004165
    250                            1.044                            0.004176
    300                            1.253                            0.004177
    ...                            ...                              ...
    900                            3.766                            0.004184
    */
    
    /*
    转化为克
            g  = ad / c
    zhongliang = weight / c
    
    判断读取CS1237的数据weight的值,落在哪个区间,然后选取相应的 系数c ( ad/g ) 值
    */
    
    		if(weight>0.001&&weight<0.2101){zhongliang = weight / 0.0042  ;} //50g
    		if(weight>0.210&&weight<0.4201){zhongliang = weight / 0.0042  ;} //100g
    		if(weight>0.420&&weight<0.6291){zhongliang = weight / 0.00419 ;} //150g		
    		if(weight>0.629&&weight<1.8331){zhongliang = weight / 0.004165 ;} //200g
    		if(weight>0.833&&weight<1.0441){zhongliang = weight / 0.004176 ;} //250g
    		if(weight>1.044&&weight<1.2531){zhongliang = weight / 0.004177 ;} //300g
    		if(weight>1.253&&weight<1.4641){zhongliang = weight / 0.004183 ;} //350g
            if(weight>1.464&&weight<1.6661){zhongliang = weight / 0.004165 ;} //400g
    		if(weight>1.666&&weight<1.8741){zhongliang = weight / 0.004164 ;} //450g
    		if(weight>1.874&&weight<2.0851){zhongliang = weight / 0.00417 ;} //500g
    		if(weight>2.085&&weight<2.2961){zhongliang = weight / 0.0041745 ;} //550g
    		if(weight>2.296&&weight<2.5071){zhongliang = weight / 0.00418 ;} //600g
    		if(weight>2.507&&weight<2.7171){zhongliang = weight / 0.00418 ;} //650g
    		if(weight>2.717&&weight<2.9241){zhongliang = weight / 0.004178 ;} //700g
    		if(weight>2.924&&weight<3.1381){zhongliang = weight / 0.004175 ;} //750g
    		if(weight>3.138&&weight<3.3481){zhongliang = weight / 0.004185 ;} //800g
    		if(weight>3.348&&weight<3.5561){zhongliang = weight / 0.0041835 ;} //850g
    		if(weight>3.556&&weight<3.7661){zhongliang = weight / 0.0041844 ;} //900g
    		if(weight>3.766)               {zhongliang = weight / 0.004191 ;} //900g以上
    
    	    printf("*******%f*********%f/r/n  ",weight,zhongliang);
      }	
      	
    }
    

    **

    cs1237.c

    **

    #include "cs1237.h"
    #include "uart.h"
    
    
    //OUT引脚输入输出 方向设置  PA3
    #define OUT_IN()  {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8<<12;}
    #define OUT_OUT() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3<<12;}
    
    // PA2-----CLK
    // PA3-----OUT
    
    void Delay1us(void)
    {
    	__IO uint32_t t=5;
    	
    	while(t--);
    }
    
    void Delay1ms(void)
    {
    	__IO uint32_t t=8000;
    	
    	while(t--);
    }
    
    void delay_ms(__IO uint16_t ms)
    {
    	do{
    		Delay1ms();
    	}while(ms--);
    }
    
    // 初始化PA2 PA3
    // PA2-----CLK
    // PA3-----OUT
    void CS1237_Init_JX(void)
    {	
    	GPIO_InitTypeDef  GPIO_InitStructure;					
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	
    	
    	// PA2 ----- CLK  设置为输出
    	// PA3 ----- OUT  设置为输出
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;		
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    		
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK拉高
    	GPIO_SetBits(GPIOA, GPIO_Pin_3);	// OUT拉高
    }
    
    //配置CS1237芯片
    void CS1237_Config(void)
    {
    	unsigned char i;
    	unsigned char dat;
    	unsigned int count_i=0;//溢出计时器
    	
    	dat = 0X0C;   //芯片地配置 内部REF 输出40HZ PGA=128 通道A 0X1C   
    	OUT_OUT();
    	GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
    	OUT_IN();
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2);// 时钟拉低
    	while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1) //等待CS237准备好
    	{
    		delay_ms(1);
    		count_i++;
    		if(count_i > 300)
    		{
    			OUT_OUT();
    			GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT引脚拉高
    			GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK引脚拉高
    			return;//超时,则直接退出程序
    		}
    	}
    	for(i=0;i<29;i++)// 1 - 29
    	{
    		GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    		Delay1us();
    		GPIO_ResetBits(GPIOA, GPIO_Pin_2);	// CLK=0;
    		Delay1us();
    	}
    	OUT_OUT();
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//30
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//31
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//32
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//33
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//34
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_ResetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//35
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);Delay1us();GPIO_SetBits(GPIOA, GPIO_Pin_3);GPIO_ResetBits(GPIOA, GPIO_Pin_2);Delay1us();//36
    	//37     写入了0x65
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    	Delay1us();
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2);	// CLK=0;
    	Delay1us();
    	
    	for(i=0;i<8;i++)// 38 - 45个脉冲了,写8位数据
    	{
    		GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    		Delay1us();
    		if(dat&0x80)
    			GPIO_SetBits(GPIOA, GPIO_Pin_3);// OUT = 1
    		else
    			GPIO_ResetBits(GPIOA, GPIO_Pin_3);
    		dat <<= 1;
    		GPIO_ResetBits(GPIOA, GPIO_Pin_2);	// CLK=0;
    		Delay1us();
    	}
    	GPIO_SetBits(GPIOA, GPIO_Pin_3);// OUT = 1
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    	Delay1us();
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2);	// CLK=0;
    	Delay1us();
    }
    
    // 读取芯片的配置数据
    unsigned char Read_Config(void)
    {
    	unsigned char i;
    	unsigned char dat=0;//读取到的数据
    	unsigned int count_i=0;//溢出计时器
    //	unsigned char k=0,j=0;//中间变量
    	
    	OUT_OUT();
    	GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
    	OUT_IN();
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2);//时钟拉低
    	while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)//等待芯片准备好数据
    	{
    		delay_ms(1);
    		count_i++;
    		if(count_i > 300)
    		{
    			OUT_OUT();
    			GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    			GPIO_SetBits(GPIOA, GPIO_Pin_3);	// OUT=1;
    			return 1;//超时,则直接退出程序
    		}
    	}
    
    	for(i=0;i<29;i++)// 产生第1到29个时钟
    	{
    		GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    		Delay1us();
    		GPIO_ResetBits(GPIOA, GPIO_Pin_2);	// CLK=0;
    		Delay1us();
    	}
    	
    	OUT_OUT();
    	
    	GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
    	Delay1us();
    	GPIO_SetBits(GPIOA, GPIO_Pin_3); 
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
    	Delay1us();// 这是第30个时钟
    	
    	GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
    	Delay1us();
    	GPIO_ResetBits(GPIOA, GPIO_Pin_3);
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
    	Delay1us();// 这是第31个时钟
    	
    	GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
    	Delay1us();
    	GPIO_SetBits(GPIOA, GPIO_Pin_3);
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
    	Delay1us();//32
    	
    	GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
    	Delay1us();
    	GPIO_ResetBits(GPIOA, GPIO_Pin_3);
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
    	Delay1us();//33
    	
    	GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
    	Delay1us();
    	GPIO_SetBits(GPIOA, GPIO_Pin_3); 
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
    	Delay1us();//34
    	
    	GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
    	Delay1us();
    	GPIO_SetBits(GPIOA, GPIO_Pin_3);
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
    	Delay1us();//35
    	
    	GPIO_SetBits(GPIOA, GPIO_Pin_2); // CLK=1;
    	Delay1us();
    	GPIO_ResetBits(GPIOA, GPIO_Pin_3);
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2); // CLK=0;
    	Delay1us();//36
    	
    	GPIO_SetBits(GPIOA, GPIO_Pin_3);
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    	Delay1us();
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2);	// CLK=0;
    	Delay1us();//37     写入0x56 即读命令
    	
    	dat=0;
    	OUT_IN();
    	for(i=0;i<8;i++)// 第38 - 45个脉冲了,读取数据
    	{
    		GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    		Delay1us();
    		GPIO_ResetBits(GPIOA, GPIO_Pin_2);	// CLK=0;
    		Delay1us();
    		dat <<= 1;
    		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)
    			dat++;
    	}
    	
    	//第46个脉冲
    	GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    	Delay1us();
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2);	// CLK=0;
    	Delay1us();
    	
    	OUT_OUT();
    	GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
    	
    	return dat;
    }
    
    //读取ADC数据,返回的是一个有符号数据
    int32_t Read_CS1237(void)
    {
    	unsigned char i;
    	uint32_t dat=0;//读取到的数据
    	unsigned int count_i=0;//溢出计时器
    	int32_t temp;
    	
    	OUT_OUT();
    	GPIO_SetBits(GPIOA, GPIO_Pin_3); //OUT引脚拉高
    	OUT_IN();
    	GPIO_ResetBits(GPIOA, GPIO_Pin_2);//时钟拉低
    	while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)//等待芯片准备好数据
    	{
    		delay_ms(1);
    		count_i++;
    		if(count_i > 300)
    		{
    			OUT_OUT();
    			GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    			GPIO_SetBits(GPIOA, GPIO_Pin_3);	// OUT=1;
    			return 1;//超时,则直接退出程序
    		}
    	}
    	
    	dat=0;
    	for(i=0;i<24;i++)//获取24位有效转换
    	{
    		GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    		Delay1us();
    		dat <<= 1;
    		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==1)
    			dat ++;
    		GPIO_ResetBits(GPIOA, GPIO_Pin_2);	// CLK=0;
    		Delay1us();
    	}
    	
    	for(i=0;i<3;i++)//接着前面的时钟 再来3个时钟
    	{
    		GPIO_SetBits(GPIOA, GPIO_Pin_2);	// CLK=1;
    		Delay1us();
    		GPIO_ResetBits(GPIOA, GPIO_Pin_2);	// CLK=0;
    		Delay1us();
    	}
    	
    	OUT_OUT();
    	GPIO_SetBits(GPIOA, GPIO_Pin_3); // OUT = 1;
    	
    	if(dat&0x00800000)// 判断是负数 最高位24位是符号位
    	{
    		temp=-(((~dat)&0x007FFFFF) + 1);// 补码变源码
    	}
    	else
    		temp=dat; // 正数的补码就是源码
    	
    	return temp;
    }
    
    

    cs1237.h


    #ifndef __CS1237_H
    #define __CS1237_H
    
    
    #include "stm32f10x.h"
    
    void Delay1us(void);
    void Delay1ms(void);
    void delay_ms(__IO uint16_t ms);
    void CS1237_Init_JX(void);
    void CS1237_Config(void);
    unsigned char Read_Config(void);
    int32_t Read_CS1237(void);
    
    #endif
    
    

    【注:文件源码是Keil uVision5–STM32工程文件】
    参考文件源码下载链接:
    https://download.csdn.net/download/qq_28056277/11541590
    原创文章,转载请注明出处,谢谢。

    展开全文
  • STM32驱动HX711称重模块

    千次阅读 多人点赞 2018-11-18 22:38:14
    使用单片机为STM32C8T6,引脚DT -&amp;amp;amp;gt; PB7,SCK -&amp;amp;amp;gt; PB6,使用通道A 下面是驱动程序: void GPIO_Weigh_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2...

    使用模块如下图所示:
    在这里插入图片描述
    使用单片机为STM32C8T6,引脚DT -> PB7,SCK -> PB6,使用通道A
    下面是驱动程序:

    void GPIO_Weigh_Init(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    	
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    }
    
    uint32_t Read_Weigh(void)
    {
    	uint8_t i;
    	uint32_t value = 0;
    	
    	/**
    	数据手册写到,当数据输出管脚 DOUT 为高电平时,表明A/D 转换器还未准备好输出数据,此时串口时
    	钟输入信号 PD_SCK 应为低电平,所以下面设置引脚状态。
    	**/
    	GPIO_SetBits(GPIOB, GPIO_Pin_7); //初始状态DT引脚为高电平
    	GPIO_ResetBits(GPIOB, GPIO_Pin_6); //初始状态SCK引脚为低电平
    	
    	/**
    	等待DT引脚变为高电平
    	**/
    	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7));
    	delay_us(1);
    	
    	/**
    	当 DOUT 从高电平变低电平后,PD_SCK 应输入 25 至 27 个不等的时钟脉冲
    	25个时钟脉冲 ---> 通道A 增益128
    	26个时钟脉冲 ---> 通道B 增益32
    	27个时钟脉冲 ---> 通道A 增益64
    	**/
    	for(i=0; i<24; i++) //24位输出数据从最高位至最低位逐位输出完成
    	{
    //		//方法一:
    //		GPIO_SetBits(GPIOB, GPIO_Pin_6); //时钟高电平
    //		value = value << 1; //如果DT位为低左移一位
    //		delay_us(1);
    //		GPIO_ResetBits(GPIOB, GPIO_Pin_6); //时钟低电平
    //		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7))
    //			value++; //如果DT位为高,值+1
    //		delay_us(1);
    		
    
    		//方法二:
    		GPIO_SetBits(GPIOB, GPIO_Pin_6);
    		delay_us(1);
    		GPIO_ResetBits(GPIOB, GPIO_Pin_6);
    		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) == 0)
    		{
    			value = value << 1;
    			value |= 0x00;
    		}
    		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) == 1)
    		{
    			value = value << 1;
    			value |= 0x01;
    		}
    		delay_us(1);
    	}
    	
    	//第 25至 27 个时钟脉冲用来选择下一次 A/D 转换的输入通道和增益
    	GPIO_SetBits(GPIOB, GPIO_Pin_6); 
    	value = value^0x800000; 
    	delay_us(1); 
    	GPIO_ResetBits(GPIOB, GPIO_Pin_6); 
    	delay_us(1);  
    	return value; 	
    }
    

    串口打印内容:
    在这里插入图片描述

    展开全文
  • 该资源实现了重力传感器的数据采集、分析、串口输出,基于STM32进行开发
  • STM32F103 用CS1237 /HX711 芯片制作电子秤 具体可参考: https://blog.csdn.net/qq_28056277/article/details/99445088
  • STM32-F407使用HX711测量物体重量

    万次阅读 多人点赞 2018-05-29 15:02:05
    本文主要介绍STM32-F407使用HX711测量物体重量 一、写在前面 首先必须说一说网上虽然有很多相似的代码,但是大多都是51的,淘宝给的只有51和arduino的,网上偶有完整的103的代码,大部分都没有办法直接用,写...
  • _stm32-usart2-hx711-0919.rar

    2019-10-08 12:58:35
    使用hx711模块,采用串口2,串口通信打印在电脑上,实现的功能有,称台校准,称重,查看校准值,去皮,程序运行的慢,耐心等待,
  • stm32HX711称重模块的程序

    千次阅读 2019-06-22 08:52:40
    HX711模块本身特别好,24位AD,加内部放大器(可以64和128增益,放大倍数),但无奈它的串口太智障,解释的也不是很清楚。现在我程序调试成功了,使用的HAL库,下载链接如下: https://download.csdn.net/...
  • 使用STM32F407读取HX711压力传感器模块

    千次阅读 多人点赞 2018-09-12 10:11:35
    但是在网上找到的代码往往都很老了,用现在常用的stm32板子都或多或少有一些问题,尤其是在一些购买该模块地方那里要的资料就更没法用了,不过还是可以做些参考的。然后又跟着时序图在stm32f407的板子上写了一遍,...
  • 一个是海芯科技出的HX711等24位AD,一个是塞普拉斯出的CS5532等24位AD。国产芯片和进口芯片有差距,但是国产芯片也解决了很多应用的问题,替代了很多进口产品。 最近在用海芯科技出的HX720,芯片内部集成了低噪声...
  • STM32 hx711电子称老出现8388608或8388607的原因和调试记录 自己做的板子,STM32F103C8T6和HX711,电路为官网推荐电路。 STM32F103采用PB8和PB9接HX711的DO和CLK。软件可以参考...
  • 基于STM32F030的HX711,IIC,AT24C02程序,适合初学者。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 605
精华内容 242
关键字:

hx711stm32