[其他ST产品] STM32驱动HX711称重模块

[复制链接]
759|1
 楼主| 鱿鱼丝 发表于 2023-2-26 16:43 | 显示全部楼层 |阅读模式
使用模块如下图所示:

使用单片机为STM32C8T6,引脚DT -> PB7,SCK -> PB6,使用通道A

下面是驱动程序:
  1. void GPIO_Weigh_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.        
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  6.        
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  9.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  10.        
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  13.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  15. }

  16. uint32_t Read_Weigh(void)
  17. {
  18.         uint8_t i;
  19.         uint32_t value = 0;
  20.        
  21.         /**
  22.         数据手册写到,当数据输出管脚 DOUT 为高电平时,表明A/D 转换器还未准备好输出数据,此时串口时
  23.         钟输入信号 PD_SCK 应为低电平,所以下面设置引脚状态。
  24.         **/
  25.         GPIO_SetBits(GPIOB, GPIO_Pin_7); //初始状态DT引脚为高电平
  26.         GPIO_ResetBits(GPIOB, GPIO_Pin_6); //初始状态SCK引脚为低电平
  27.        
  28.         /**
  29.         等待DT引脚变为高电平
  30.         **/
  31.         while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7));
  32.         delay_us(1);
  33.        
  34.         /**
  35.         当 DOUT 从高电平变低电平后,PD_SCK 应输入 25 至 27 个不等的时钟脉冲
  36.         25个时钟脉冲 ---> 通道A 增益128
  37.         26个时钟脉冲 ---> 通道B 增益32
  38.         27个时钟脉冲 ---> 通道A 增益64
  39.         **/
  40.         for(i=0; i<24; i++) //24位输出数据从最高位至最低位逐位输出完成
  41.         {
  42. //                //方法一:
  43. //                GPIO_SetBits(GPIOB, GPIO_Pin_6); //时钟高电平
  44. //                value = value << 1; //如果DT位为低左移一位
  45. //                delay_us(1);
  46. //                GPIO_ResetBits(GPIOB, GPIO_Pin_6); //时钟低电平
  47. //                if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7))
  48. //                        value++; //如果DT位为高,值+1
  49. //                delay_us(1);
  50.                

  51.                 //方法二:
  52.                 GPIO_SetBits(GPIOB, GPIO_Pin_6);
  53.                 delay_us(1);
  54.                 GPIO_ResetBits(GPIOB, GPIO_Pin_6);
  55.                 if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) == 0)
  56.                 {
  57.                         value = value << 1;
  58.                         value |= 0x00;
  59.                 }
  60.                 if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) == 1)
  61.                 {
  62.                         value = value << 1;
  63.                         value |= 0x01;
  64.                 }
  65.                 delay_us(1);
  66.         }
  67.        
  68.         //第 25至 27 个时钟脉冲用来选择下一次 A/D 转换的输入通道和增益
  69.         GPIO_SetBits(GPIOB, GPIO_Pin_6);
  70.         value = value^0x800000;
  71.         delay_us(1);
  72.         GPIO_ResetBits(GPIOB, GPIO_Pin_6);
  73.         delay_us(1);  
  74.         return value;        
  75. }




 楼主| 鱿鱼丝 发表于 2023-2-26 16:43 | 显示全部楼层
串口打印内容:
582463fb1bb840fb9.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

480

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部