基于STM32设计的数字电子秤
时间:2022-07-22 11:00:00
1. 项目介绍
称重计量是当今社会活动中不可缺少的一部分,随着国际交流的发展,称重计量的国际统一越来越重要。
电子称重技术是现代称重测量和控制系统工程的重要基础之一。近年来,随着现代科学技术的进步,电子称重技术取得了快速的发展,电子秤在测量领域也发挥着越来越重要的作用。特别是商用电子衡器,具有精度高、反应灵敏、性能稳定、结构简单、环境适应性强、电子计算机结合方便、称重测量和过程控制自动化的特点,广泛应用于工商贸易、能源交通、冶金矿
电子秤的工作原理是通过称重传感器收集被测物体的重量,并将其转换为电压信号。输出电压信号通常很小,需要通过前端信号处理电路准确线性放大。放大后的模拟电压信号通过A/D转换电路转换成数字量,送入主控电路的单片机,然后由单片机控制OLED显示屏显示被测物体的重量。为了提高实际应用中数据采集的精度,并在传感器和A/D芯片之间加上信号调理电路。
采用当前项目STM32 称重模块 OLED实现了简单的电子秤项目,称重模块采用24位ADC芯片,精度高。实现称重、校准、去皮等功能。
硬件介绍:
MCU:STM32F103ZET6,只要是STM32F1X本系列工程代码通用。
称重模块: 淘宝购买的称重模块
OLED: SPI接口的0.96寸OLED中景园电子屏幕OLED屏。
完整工程下载地址: https://download.csdn.net/download/xiaolong1126626497/63993934
视频演示地址: https://live.csdn.net/v/182608
项目运行效果:
2. 项目实现
2.1 称重传感器
称重传感器是一种压力传感器,也称为悬臂梁压力传感器。安装时需要一端固定,另一端受力。内部有四个应变电阻片,共同形成电桥。当受力端施加压力时,传感器外壳会变形,从而影响应变电阻片的电阻值。
下面是称重传感器的原理图:
称重传感器实物图:
用于称重传感器CS1237 作为一种转换芯片,用于将微小的电压信号转换为具有 24 位精度的数字信号。模块信号输入端可接受差分信号,内部有可编程操作放大器放大输入端的弱信号。模块内置的温度传感器可以粗略估计周围的温度。该模块可用于各种工业过程控制场合,如电子秤、血液计、智能变换器等。
CS1237中有1路ADC,集成1路差分输入,信号输入可以是差分输入信号AINP、AINN,它也可以是温度传感器的输出信号,由寄存器切换输入信号(ch_sel控制。
CS1237是采用2线SPI串行通信,通过SCLK和DRDY/DOUT可实现数据接收和功能配置。
实现代码如下:
#include "ADC-CS1237.h"static long AD_Res_Last=0; //上一轮ADC数值保存/*定义CS1237使用的GPIO口CLK PB14 时钟线OUT PB15 数据输出线*/void CS1237_GPIO_INIT(void){ RCC->APB2ENR |= 0x01 << 3; //打开PB口 GPIOB->CRH &= 0xF0FFFFFF; ///清零寄存器 GPIOB->CRH |= 0x03000000; ///通用推拉输出 5000MHz GPIOB->ODR |= 1<< 14; //拉高CLK电平}void CS1237_DRDY(void) //配置PB15为输入{ GPIOB->CRH &= 0x0FFFFFFF; //寄存器清零 GPIOB->CRH |= 0x80000000; //上下拉输入模式}void CS1237_DOUT(void) //配置PB15为输出{
GPIOB->CRH &= 0x0FFFFFFF; //寄存器清零 GPIOB->CRH |= 0x30000000; //通用推挽输出 50MHz}//CS1237进入低功耗模式void CS1237_Power_Down(void){
CLK_HIGH delay_us(200); //CLK上拉时间应超过100us,恢复后下拉时间至少10us}//配置CS1237芯片void Con_CS1237(void){
u8 i; u8 dat; u8 count_i=0; //溢出计时器 dat = CS_CON; // 0100 1000 CS1237_DOUT(); OUT_HIGH delay_ms(310); //上电建立时间 CS1237_DRDY(); //配置PB15为输入 CLK_LOW //时钟拉低 while(INT) //芯片准备好数据输出 时钟已经为0,数据也需要等CS1237全部拉低为0才算都准备好 {
printf("123\r\n"); delay_ms(100); //10HZ下转换时间是100ms count_i++; if(count_i > 150) {
CLK_HIGH; CS1237_DOUT(); OUT_HIGH return; //超时,则直接退出程序 } } for(i=0;i<29;i++) // 1 - 29 {
One_CLK; } CS1237_DOUT(); CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6); //30 CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6); //31 CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6); //32 CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6); //33 CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6); //34 CLK_HIGH;delay_us(6);OUT_LOW;CLK_LOW;delay_us(6); //35 CLK_HIGH;delay_us(6);OUT_HIGH;CLK_LOW;delay_us(6); //36 One_CLK; //37 写入了0x65 for(i=0;i<8;i++) // 38 - 45个脉冲了,写8位数据 {
CLK_HIGH; delay_us(6); if(dat&0x80) OUT_HIGH else OUT_LOW dat <<= 1; CLK_LOW; delay_us(6); } CS1237_DRDY(); One_CLK; //46个脉冲拉高数据引脚}//读取芯片的配置数据u8 Read_CON(void){
u8 i; u8 dat=0; //读取到的数据 u8 count_i=0; //溢出计时器 CS1237_DOUT(); OUT_HIGH CS1237_DRDY(); //配置PB15为输入 CLK_LOW //时钟拉低 while(INT) //芯片准备好数据输出 时钟已经为0,数据也需要等CS1237全部拉低为0才算都准备好 {
delay_ms(100); count_i++; if(count_i > 150) {
CLK_HIGH; CS1237_DOUT(); OUT_HIGH; return 1; //超时,则直接退出程序 } } for(i=0;i<29;i++) // 1 - 29 {
One_CLK; } CS1237_DOUT()元器件数据手册、IC替代型号,打造电子元器件IC百科大全!