使用HX711变送器模块+5kg的传感器。
- #define HX711_DATA PEin(0)
- #define HX711_SCK PEout(1)
- void HX711_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOE, &GPIO_InitStructure);
- GPIO_SetBits(GPIOE, GPIO_Pin_1);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOE, &GPIO_InitStructure);
- }
- uint8_t HX711_GetValue(uint32_t *value)
- {
- int retry = 0;
- uint32_t ret = 0;
- HX711_SCK = 0;
- while (retry < 200)
- {
- delay_us(1);
- if (HX711_DATA == 0)
- break;
- else
- retry++;
- }
- if (retry == 200) return 1;
- for (int i = 0; i < 24; i++)
- {
- HX711_SCK = 1;
- delay_us(1);
- ret = ret << 1;
- HX711_SCK = 0;
- ret |= HX711_DATA;
- delay_us(1);
- }
- HX711_SCK = 1;
- delay_us(1);
- *value = ret ^ 0x800000;
- //*value = ret;
- HX711_SCK = 0;
- delay_us(1);
- return 0;
- }
- int main(void)
- {
- u16 t;
- u16 len;
- u16 times = 0;
- uint32_t value = 0;
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- uart_init(115200); //串口初始化为115200
- LED_Init(); //LED端口初始化
- KEY_Init(); //初始化与按键连接的硬件接口
- HX711_init();
- HX711_GetValue(&value);
- printf("0x%x\r\n", value);
- delay_ms(500);
- HX711_GetValue(&value);
- printf("0x%x\r\n", value);
- delay_ms(500);
- HX711_GetValue(&value);
- printf("0x%x\r\n", value);
- delay_ms(500);
- HX711_GetValue(&value);
- printf("0x%x\r\n", value);
- delay_ms(500);
- HX711_GetValue(&value);
- printf("0x%x\r\n", value);
- delay_ms(500);
- uint32_t zero = value;
- printf("0x%x\r\n", value);
- while (1)
- {
- if (HX711_GetValue(&value) == 0)
- {
- printf("0x%x\t%d\r\n", value, value - zero);
- if (value < zero) value = zero;
- uint32_t weight = (value - zero) / 430;
- weight = weight / 0.89;
- printf("%d\t\r\n", weight);
- }
- else
- {
- printf("read error\r\n");
- }
- delay_ms(1000);
- }
- }
复制代码
代码中的*value = ret^0x800000;相当于把传感器读到的值加了0x800000,即原来的差分读出来假设是-2.5V ~ +2.5V,现在变成了0V ~ 5V,转换成了无符号数更加好计算。
测量出来的重量uint32_t weight = (value - zero) / 430;,由于应变片工艺问题,可能其值并不等效于,最终通过砝码标定,得出重量:weight = weight / 0.89;
————————————————
版权声明:小盼你最萌哒
如有侵权请联系删除
|