电子称DIY(贴应变片+写代码)
第一步、應變片介紹
?
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二部分:應變片如何測量應變力的(對應的R1\R2\R3\R4實際上的貼片方法):
?
?
電橋的四個臂上接工作應變片,都參與機械變形,同處一個溫度
場,溫度影響相互抵消,電壓輸出靈敏度高。當 4 個應變片的材料、
阻值都想同時,可推導出以下公式:
?
?
?
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第三部分、原理圖(帶器件參數):
?
?部分圖片來自網絡
?(注:以上原理圖中的R1\R2\R3\R4均為圖二對應的電阻。應和圖二所示一致。)
?
第四部分、程序代碼:
51代碼采集部分:
1 /*============================================= 2 AD24位數值提取函數 3 一般提取6、7、8位數據 4 =============================================*/ 5 unsigned long ReadCount(void) 6 { 7 // unsigned long Count; 8 unsigned char i; 9 ADSK=0; 10 Count=0; 11 while(ADDO); 12 for (i=0;i<24;i++) 13 { 14 ADSK=1; 15 Count=Count<<1; 16 ADSK=0; 17 if(ADDO) Count++; 18 } 19 ADSK=1; 20 Count=Count^0x800000;//抑或 21 ADSK=0; 22 return(Count); 23 }?
STM32代碼:
?
1 /*============================================= 2 AD24位數值提取函數 3 一般提取6、7、8位數據 4 =============================================*/ 5 //#define ADD0_R GPIO_ResetBits(GPIOA,GPIO_Pin_1) 6 //#define ADD0_S GPIO_SetBits(GPIOA,GPIO_Pin_1) 7 //#define ADSK_R GPIO_ResetBits(GPIOA,GPIO_Pin_2) 8 //#define ADSK_S GPIO_SetBits(GPIOA,GPIO_Pin_2) 9 10 unsigned long ADC_ReadCount(void) 11 { 12 unsigned char i; 13 unsigned long Count; 14 Count=0; 15 GPIO_ResetBits(GPIOC,GPIO_Pin_5);//ADSK=0; 16 delay_us(20); 17 while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)==1)// while(ADDO); 18 delay_us(20); 19 for (i=0;i<24;i++) 20 { 21 GPIO_SetBits(GPIOC,GPIO_Pin_5);//ADSK=1; 22 delay_us(20); 23 Count=Count<<1; 24 GPIO_ResetBits(GPIOC,GPIO_Pin_5);//ADSK=0; 25 delay_us(20); 26 if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)==1) Count++; 27 delay_us(20); 28 } 29 GPIO_SetBits(GPIOC,GPIO_Pin_5);//ADSK=1; 30 delay_us(20); 31 Count=Count^0x800000;//抑或 32 GPIO_ResetBits(GPIOC,GPIO_Pin_5);//ADSK=0; 33 delay_us(20); 34 return(Count); 35 }?
?完整測試代碼:
51帶串口收發采集書籍的完整代碼:
1 #include<reg52.h> 2 #include <math.h> 3 #define uint unsigned int 4 #define uchar unsigned char 5 uchar flag ,a ,i; 6 uchar code table[]="I Get "; 7 /// 8 sbit ADDO = P1^5; 9 sbit ADSK = P1^0; 10 unsigned long Count; 11 void delay_50ms(uint t); 12 /*============================================= 13 AD24位數值提取函數 14 一般提取6、7、8位數據 15 =============================================*/ 16 unsigned long ReadCount(void) 17 { 18 // unsigned long Count; 19 unsigned char i; 20 ADSK=0; 21 Count=0; 22 while(ADDO); 23 for (i=0;i<24;i++) 24 { 25 ADSK=1; 26 Count=Count<<1; 27 ADSK=0; 28 if(ADDO) Count++; 29 } 30 ADSK=1; 31 Count=Count^0x800000;//抑或 32 ADSK=0; 33 return(Count); 34 } 35 /*============================================ 36 求平均值函數 37 ===============================================*/ 38 long averageValue(uchar times) 39 { 40 uchar i; 41 long sum = 0; 42 for (i = 0; i < times; i++) 43 { 44 sum += ReadCount(); 45 } 46 47 return sum / times; 48 } 49 /*=============================================== 50 串口初始化函數 51 ===============================================*/ 52 void init() 53 { 54 TMOD=0x20; 55 TH1=0xfd; 56 TL1=0xfd; 57 TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=0; 58 59 } 60 void delay_50ms(uint t) 61 { 62 uint j; 63 for( ;t>0;t--) 64 for(j=6245;j>0;j--); 65 66 } 67 68 void main() 69 { 70 71 unsigned long num; 72 uchar s[9]; 73 init(); 74 while(1) 75 { 76 /************************************/ 77 num=averageValue(20); 78 num=num-8650000; 79 num=num*416; 80 for(i=8;i>0;i--) 81 { 82 s[i-1]=(uchar)num%10+0x30; 83 if(num<1) 84 s[i-1]=0x30; 85 num=num /10; 86 } 87 s[8]='G'; 88 /************************************/ 89 /*================================================== 90 long val = (averageValue() - _offset);//_offset 91 return (float) val / _scale;//再.H函數中設置scale = 416.f 92 93 =====================================================*/ 94 95 96 97 ES=0;//關閉串口中斷 98 for(i=0;i<9;i++) 99 { 100 SBUF=s[i];//通過串口發送數據 101 while(!TI);//檢查是否發送數據發送完畢 102 TI=0; 103 } 104 delay_50ms(4); 105 } 106 107 } 108 109 void set() interrupt 4 110 { 111 RI=0; 112 a=SBUF; 113 flag=1; 114 115 } View Code?
?STM32完整代碼:
c代碼.c 文件
1 #include<reg52.h> 2 #include <math.h> 3 #include <stdio.h> 4 #define uint unsigned int 5 #define uchar unsigned char 6 uchar flag ,a ,i; 7 uchar code table[]="I Get "; 8 /// 9 sbit ADDO = P1^5; 10 sbit ADSK = P1^0; 11 unsigned long Count; 12 void delay_50ms(uint t); 13 /*============================================= 14 AD24位數值提取函數 15 一般提取6、7、8位數據 16 =============================================*/ 17 unsigned long ReadCount(void) 18 { 19 // unsigned long Count; 20 unsigned char i; 21 ADSK=0; 22 Count=0; 23 while(ADDO); 24 for (i=0;i<24;i++) 25 { 26 ADSK=1; 27 Count=Count<<1; 28 ADSK=0; 29 if(ADDO) Count++; 30 } 31 ADSK=1; 32 Count=Count^0x800000;//抑或 33 ADSK=0; 34 return(Count); 35 } 36 /*============================================ 37 求平均值函數 38 ===============================================*/ 39 long averageValue(uchar times) 40 { 41 uchar i; 42 long sum = 0; 43 for (i = 0; i < times; i++) 44 { 45 sum += ReadCount(); 46 } 47 48 return sum / times; 49 } 50 /*=============================================== 51 串口初始化函數 52 ===============================================*/ 53 void init() 54 { 55 TMOD=0x20; 56 TH1=0xfd; 57 TL1=0xfd; 58 TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=0; 59 60 } 61 void delay_50ms(uint t) 62 { 63 uint j; 64 for( ;t>0;t--) 65 for(j=6245;j>0;j--); 66 67 } 68 69 void main() 70 { 71 72 unsigned long num; 73 uchar s[25]; 74 init(); 75 while(1) 76 { 77 /************************************/ 78 num=averageValue(20); 79 num=num-8650000; 80 num=num*416; 81 sprintf(s,"稱得重量:%f g",num); 82 83 /************************************/ 84 /*================================================== 85 long val = (averageValue() - _offset);//_offset 86 return (float) val / _scale;//再.H函數中設置scale = 416.f 87 88 =====================================================*/ 89 90 91 92 ES=0;//關閉串口中斷 93 for(i=0;i<25;i++) 94 { 95 SBUF=s[i];//通過串口發送數據 96 while(!TI);//檢查是否發送數據發送完畢 97 TI=0; 98 } 99 delay_50ms(4); 100 } 101 102 } 103 104 void set() interrupt 4 105 { 106 RI=0; 107 a=SBUF; 108 flag=1; 109 110 } View Code?
?.h文件:
1 #ifndef __AD24_H 2 #define __AD24_H 3 #include "stm32f10x.h" 4 #include "delay.h" 5 void ADC24_Configtion(void); 6 long averageValue(unsigned char times); 7 8 #endif View Code?
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
附錄:(此處R1\R2\R3\R4不一定和第二部分的圖2中的R1\R2\R3\R4對應)
?
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
?
-----------------------------------------------------------------------貼應變片-------------------------------------------------------------------------------------------------
?
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
?
貼應變片:
用銼刀和粗砂紙等工具將試件在鋼板上的貼片位置的油污、漆層、銹跡、電鍍層除去,再用細砂紙打磨成 45°交叉紋,之后用鑷子鑷起丙酮棉球將貼片處擦洗干凈,至棉球潔白為止。
?
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------應變片的其他貼法:-----------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
應變片的其他貼法:
?
溫度補償:
?
轉載于:https://www.cnblogs.com/pertor/p/6516638.html
總結
以上是生活随笔為你收集整理的电子称DIY(贴应变片+写代码)的全部內容,希望文章能夠幫你解決所遇到的問題。