鱿鱼丝 发表于 2023-2-26 16:43

STM32驱动HX711称重模块

使用模块如下图所示:
https://img-blog.csdnimg.cn/20181118223327223.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA0Njg4Mw==,size_16,color_FFFFFF,t_70
使用单片机为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;        
}




鱿鱼丝 发表于 2023-2-26 16:43

串口打印内容:
页: [1]
查看完整版本: STM32驱动HX711称重模块