找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9765|回复: 10
打印 上一主题 下一主题
收起左侧

基于stm32的电子称设计 附源码

  [复制链接]
跳转到指定楼层
楼主
  使用电阻应变片贴合在形变梁的形变点上,把被测件上的因为重力变化而产生的应变变化转换成电信号,而后通过信号处理电路,进行数据传输。处理电路采用ADS1247芯片,进行信号调理与A/D转换模块和并使用STM32单片机进行控制和数据处理。通过串口通信,将重量数据传输给STC12C5A60S2单片机构建的外围功能模块,实现被测物品重量信息的显示及其他辅助功能。
附有完成的源代码,欢迎各位下载参考。

单片机源程序如下:
  1. #include "system.h"
  2. #include "sht11.h"
  3. #include "ads1118.h"
  4. #include "ads1247.h"
  5. #include "ms5803.h"


  6. #define RTD_DRDY                (GPIOC->IDR & BIT(9))

  7. //测试时屏蔽该参数,从而屏蔽设备检测
  8. //#define NOTEST

  9. //#define TEST_MODE

  10. #define FLASH_ADDRESS 0x807f800

  11. //
  12. //#define NBLE
  13. #define BIT(n) (1<<(n))

  14. #define ADDR 0x2000c000
  15. #define BUF_SIZE        64                                                                                //滑动滤波队列大小
  16. #define SQU_SIZE  127                                                                                //中值滤波队列大小
  17. #define SHIFTERR_THR        20                                                                //误差门限
  18. #define DESHIFT_TIMSLOT                100                                                //去除漂移间隔时间

  19. void USART2_Configuration(USART_TypeDef *);



  20. unsigned char RxBuffer1[40];
  21. unsigned char RxCounter1;

  22. unsigned char P2PUart_TestFlag = 0;                        //P2P命令串口测试接收完成标志
  23. unsigned char Uart3RecFinishFlag = 0;                //串口3接收完成标志
  24. unsigned char Uart2RecFinishFlag = 0;

  25. unsigned char RxBuffer2[20];
  26. unsigned char RxCounter2;
  27. unsigned char RxBuffer3[20];
  28. unsigned char RxCounter3;



  29. signed int Zero_Point = 0;
  30. signed int Ten_Point = 0;
  31. signed int Fifty_Point = 0;
  32. signed int TwoHundred_Point = 0;

  33. //signed int M_Buf[BUF_SIZE];
  34. //signed int S_Buf[SQU_SIZE];
  35. signed int Out_AdcData = 0;
  36. float Slot = 0;

  37. unsigned char Uart2_NEmptyFlag = 0;
  38. unsigned int Uart2_Tim = 0;
  39. unsigned int Tim = 0;

  40. extern vu16 ADCConvertedValue[16];


  41. void Delay_ms(unsigned int Time)
  42. {
  43.         unsigned int n;
  44.         while(Time--)
  45.                 for(n=0;n<1000;n++);
  46. }





  47. void SysTick_IRQHandlar(void)
  48. {

  49. }




  50. unsigned char Str_Cmp(unsigned char *Str1,unsigned char *Str2)
  51. {
  52.         while((*Str1) != '\0')
  53.         {
  54.                 if(*(Str1++) != *(Str2++))
  55.                 {
  56.                         return 0;
  57.                 }
  58.         }
  59.         return 1;
  60. }

  61. unsigned char Str_CmpNum(unsigned char *Str1,unsigned char *Str2,unsigned char Num)
  62. {
  63.         unsigned char n;
  64.         for(n=0;n<Num;n++)
  65.         {
  66.                 if(*(Str1++) != *(Str2++))
  67.                 {
  68.                         return 0;
  69.                 }
  70.         }
  71.         return 1;
  72. }




  73. void Quick_Sort(signed int *start,signed char num)
  74. {
  75.         signed char i=0,j;
  76.         j=num;
  77.        
  78.         if(num <= 0)
  79.                 return;
  80.        
  81.         while(i != j)
  82.         {
  83.                 while(*start <= *(start + j) && i<j)
  84.                 {
  85.                         j--;
  86.                 }
  87.                 while(*start >= *(start + i) && i<j)
  88.                 {
  89.                         i++;
  90.                 }
  91.                 if(i<j)
  92.                 {
  93.                         *(start+i) ^= *(start+j);
  94.                         *(start+j) ^= *(start+i);
  95.                         *(start+i) ^= *(start+j);
  96.                 }
  97.         }
  98.        
  99.         if(i)
  100.         {
  101.                 *start ^= *(start+i);
  102.                 *(start+i) ^= *start;
  103.                 *start ^= *(start+i);
  104.         }
  105.        
  106.         Quick_Sort(start,i-1);
  107.         Quick_Sort(start+i+1,num-i-1);
  108. }


  109. signed int Shift_Revise = 0;
  110. unsigned char DeShift_Tim = 0;
  111. unsigned char DeShift_Counter = 0;
  112. signed int Shift_Err = 0;
  113. signed int Shift_SumErr = 0;
  114. signed int Shift_LastSum = 0;
  115. signed char Shift_Err2[10] = {0,0,0,0,0,0,0,0,0,0};
  116. //signed char Err2_Buf[10];

  117. signed int Last_Val = 0;

  118. void De_Shift(void)
  119. {
  120.         unsigned char n;
  121.         signed int temp = 0;
  122.         Shift_Err = Out_AdcData - Last_Val;
  123.         Last_Val = Out_AdcData;
  124.         if((Shift_Err < SHIFTERR_THR) && (Shift_Err > -SHIFTERR_THR))
  125.         {
  126.                 Shift_SumErr += Shift_Err;
  127. //                DeShift_Tim++;
  128. //                if(DeShift_Tim>10)
  129. //                {
  130. //                        DeShift_Tim = 0;
  131. //                }
  132. //                Shift_Err2[DeShift_Tim] = Shift_SumErr-Shift_LastSum;
  133. //                for(n=0;n<10;n++)
  134. //                {
  135. //                        temp += Shift_Err2[n];
  136. //                }
  137. //                if(temp > 50 || temp < -50)
  138. //                {
  139. //                        Shift_SumErr -= temp;
  140. //                        for(n=0;n<10;n++)
  141. //                        {
  142. //                                Shift_Err2[n] = 0;
  143. //                        }
  144. //                }
  145. //                Shift_LastSum = Shift_SumErr;
  146.         }
  147.         else
  148.         {
  149.                 //DeShift_Tim = 0;
  150.                 Shift_Revise += Shift_SumErr;
  151.         }
  152. //        if(DeShift_Tim > 10)
  153. //        {
  154. //                DeShift_Tim = 0;
  155. //               
  156. //               
  157. //                if(Shift_Err2 > 50 || Shift_Err2 < -50)
  158. //                {
  159. //                        Shift_SumErr -= Shift_Err2;
  160. //                }
  161. //                Shift_LastSum = Shift_SumErr;
  162. //        }
  163. //        if(DeShift_Tim > DESHIFT_TIMSLOT)
  164. //        {
  165. //                DeShift_Tim = 0;
  166. //                Shift_Revise = Shift_SumErr;
  167. //        }

  168. #ifdef        TEST_MODE
  169.         printf("Err %d Error2 %d ",Shift_Err,temp);
  170.         printf("Shift Sum Err is %d ",Shift_SumErr);
  171. #endif
  172. }




  173. void Delay_us(unsigned int nTime)
  174. {
  175.         while(nTime--);
  176. }

  177. void Save_FlashData(void)
  178. {
  179.         unsigned char n;
  180.         signed int temp,temp1,temp2;
  181.         temp = TwoHundred_Point-Zero_Point;
  182.         FLASH_Unlock();
  183.         FLASH_ErasePage(FLASH_ADDRESS);
  184.         FLASH_ProgramHalfWord(FLASH_ADDRESS,0xAA55);
  185.         temp1 = (unsigned int)temp & 0x0000FFFF;
  186.         FLASH_ProgramHalfWord(FLASH_ADDRESS+2,temp1);
  187.         temp2 = (((unsigned int)temp) >> 16) & 0x0000ffFF;
  188.         FLASH_ProgramHalfWord(FLASH_ADDRESS+4,temp2);
  189.         FLASH_ProgramHalfWord(FLASH_ADDRESS+6,0x33CC);
  190.         FLASH_Lock();
  191. #ifdef TEST_MODE
  192.         printf("Two Handred Data is %d ,Zero_Point is %d ,Temp is %d \r\n",TwoHundred_Point,Zero_Point,temp);
  193.         printf("temp1 is %d ,temp2 is %d \r\n",temp1,temp2);
  194.         printf("\r\n....Slot is %f...........\r\n",Slot);
  195. #endif
  196. }

  197. void Read_FlashData(void)
  198. {
  199.         u16 temp[4];
  200.         unsigned int Temp = 0;
  201.         temp[0] = *(u16*)(FLASH_ADDRESS);
  202.         temp[1] = *(u16*)(FLASH_ADDRESS + 2);
  203.         temp[2] = *(u16*)(FLASH_ADDRESS + 4);
  204.         temp[3] = *(u16*)(FLASH_ADDRESS + 6);
  205.         if((temp[0] == 0xAA55) && (temp[3] == 0x33CC))
  206.         {
  207.                
  208.                 Temp = (unsigned int)temp[1];
  209.                 Temp |= (unsigned int)temp[2] << 16;
  210.                 Slot = (float)(signed int)Temp/(float)200;
  211.         #ifdef TEST_MODE
  212.                 printf("Temp1 is %d,Temp2 is %d Temp Data is %d \r\n",temp[1],temp[2],Temp);
  213.                 printf("Flash Read Successfully....Slot is %f...........\r\n",Slot);
  214.         #endif
  215.         }
  216.         else
  217.         {
  218.         #ifdef TEST_MODE
  219.                 printf("Flash Read Failed...............\r\n");
  220.         #endif
  221.         }
  222. }

  223. /**
  224.   * @brief  Main program
  225.   * @param  None
  226.   * @retval None
  227.   */
  228. int  main (void)
  229. {
  230.         unsigned int TIM = 0;
  231.         unsigned int m,n=0,i;
  232.         unsigned char off_p,off_n;
  233.         signed int last_temp,temp,err;
  234.         signed long OutAdc_Buf=0;
  235.         unsigned short j=0;
  236.         signed int *p;
  237.         double calculate;
  238.         signed long cal_buf = 0;
  239.         signed int Sort_Buf[SQU_SIZE];
  240.         unsigned char Sort_Tim=0;
  241.         signed int Filtered_Data = 0;
  242.         signed int Revised_Data = 0;
  243.        
  244.        
  245.         unsigned char Stand_Flag = 0;
  246.         unsigned char Stand_Tim = 0;
  247.         signed int Stand_Buf = 0;
  248.        

  249.        
  250.         float Ten_Slope = 0;
  251.         float Fifty_Slope = 0;
  252.         float TwoHundred_Slope = 0;
  253.        
  254.         unsigned char Init_Counter=60;
  255.        
  256.        
  257. //        signed int disp;
  258.        

  259.         RCC_Configuration();
  260.         NVIC_Configuration();

  261.         GPIO_Configuration();
  262.         Delay_ms(50);
  263.        
  264.                
  265.         USART_Configuration(USART1);
  266. //        USART2_Configuration(USART2);  //配置串口2到控制台
  267. //        USART_Configuration(USART3);

  268.         SysTick_SetReload(9000);
  269.         SysTick_ITConfig(ENABLE);
  270.         SysTick_CounterCmd(SysTick_Counter_Enable);


  271. //        adc_init();
  272.         Delay_ms(50);
  273.        
  274. #ifdef NBLE
  275.         printf("$$$$$$$$44  My Test.... $$$$$$$ \r\n");



  276.         printf("\n\r ############ www.csgsm.com ############ ("__DATE__ " - " __TIME__ ")\n\r\n\r");

  277. #endif

  278. //        EXTI_Configuration();

  279. #ifdef NBLE
  280.         printf("################scanning finish####################### \r\n");
  281. #endif

  282. #ifdef NBLE
  283.         printf("################lwIP stack  finish####################### \r\n");
  284. #endif
  285. //        ADS1118_Init();
  286.        
  287.         LED2(1);

  288.        
  289.         watch_dog_config();                 //看门狗测试

  290.         RTD_Init();

  291.         p = (signed int *)0x2000c000;
  292.         //Ms_Reset();
  293.         //MS5803_Init();
  294.         //RTD_ContinueStart();
  295.         cal_buf = 0;
  296.         for(n=0;n<BUF_SIZE;n++)
  297.         {
  298.                 cal_buf += *(p+n);
  299.         }
  300.         Read_FlashData();
  301.         while(1)
  302.         {
  303.                
  304.                 if(!(GPIOC->IDR & BIT(11)))
  305.                 {
  306.                         Stand_Flag = 1;
  307.                 }
  308.                
  309. //                if(!(GPIOC->IDR & BIT(12)))
  310. //                {
  311. //                        Stand_Flag = 2;
  312. //                }
  313. //               
  314. //                if(!(GPIOD->IDR & BIT(2)))
  315. //                {
  316. //                        Stand_Flag = 3;
  317. //                }
  318.                
  319.                 if(!(GPIOB->IDR & BIT(5)))
  320.                 {
  321.                         Stand_Flag = 4;
  322.                 }
  323.                
  324.                
  325.                 n++;
  326.                 if(n<100)
  327.                 {
  328.                         LED1(1);
  329.                 }
  330.                 else if(n<200)
  331.                 {
  332.                         LED1(0);
  333.                 }
  334.                 else
  335.                 {
  336.                         n=0;
  337.                 }

  338. //        temp = (signed int)RTD_TestOnce();
  339.                
  340.                 TIM++;
  341.                 Sort_Buf[Sort_Tim] = (signed int)RTD_TestOnce();
  342.                 //test_buf[temp_tim] = disp;
  343.                 Sort_Tim++;
  344.                 if(Sort_Tim >= SQU_SIZE)
  345.                 {
  346.                         Quick_Sort(Sort_Buf,SQU_SIZE-1);
  347.                         Sort_Tim = 0;
  348.                        
  349.                         cal_buf -= *(p+j);
  350.                         *(p+j) = Sort_Buf[SQU_SIZE/2];
  351.                         cal_buf += *(p+j);
  352.                         j++;
  353.                         if(j>=BUF_SIZE)
  354.                         {
  355.                                 j=0;
  356.                         }
  357.                 }
  358.                
  359.                 Filtered_Data = cal_buf/BUF_SIZE;
  360.                
  361. //                for(k=0;k<BUF_SIZE;k++)
  362. //                {
  363. //                        cal_buf += M_Buf[k];
  364. //                }
  365.                
  366.                
  367.                
  368.                
  369.                 OutAdc_Buf += Filtered_Data;
  370. //                test_buf[TIM-1] = temp;
  371. //                test = 0;
  372.                 if(TIM >= 500)
  373.                 {
  374.                         if(Init_Counter)
  375.                         {
  376.                                 Init_Counter--;
  377.                                 LED2(Init_Counter%2);
  378.                                 if(!Init_Counter)
  379.                                 {
  380.                                         Stand_Flag = 1;
  381.                                         LED2(1);
  382.                                 }
  383.                         }

  384.                        
  385.                         De_Shift();
  386.                        
  387.                         Out_AdcData = OutAdc_Buf/500;
  388.                         OutAdc_Buf = 0;
  389.                        
  390.                         Revised_Data = Out_AdcData-Shift_SumErr;
  391.                        
  392.                         TIM = 0;
  393. //                        if(Revised_Data<Ten_Point)
  394. //                        {
  395. //                                calculate = ((double)Revised_Data-Zero_Point)/Ten_Slope;
  396. //                        }
  397. //                        else if(Revised_Data<Fifty_Point)
  398. //                        {
  399. //                                calculate = ((double)Revised_Data-Ten_Point)/Fifty_Slope+10;
  400. //                        }
  401. //                        else if(Revised_Data<TwoHundred_Point)
  402. //                        {
  403. //                                calculate = ((double)Revised_Data-Fifty_Point)/TwoHundred_Slope+50;
  404. //                        }
  405. //                        else
  406. //                        {
  407. //                                calculate = ((double)Revised_Data-TwoHundred_Point)/TwoHundred_Slope+200;
  408. //                        }
  409.                        
  410.                         calculate = ((double)Revised_Data-Zero_Point)/Slot;
  411.                        
  412.                        
  413.                        
  414.                         if(Stand_Flag)
  415.                         {
  416.                                 LED2(0);
  417.                                 Stand_Tim++;
  418.                                 Stand_Buf += Revised_Data;
  419.                                
  420.                                 if(Stand_Tim >= 20)
  421.                                 {
  422.                                         switch(Stand_Flag)
  423.                                         {
  424.                                                 case 1:                //零点校准
  425.                                                 {
  426.                                                         Zero_Point = Stand_Buf/20;
  427.                                                         Stand_Buf = 0;
  428.                                                 }break;
  429. //                                                case 2:                //10克斜率校准
  430. //                                                {
  431. //                                                        Ten_Point = Stand_Buf/20;
  432. //                                                        Ten_Slope = (float)(Ten_Point-Zero_Point)/(float)10;
  433. ……………………

  434. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
stm32的电子称程序.rar (4.74 MB, 下载次数: 186)



评分

参与人数 1黑币 +5 收起 理由
hehe001 + 5 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:288218 发表于 2018-3-9 15:33 | 只看该作者
想下载学习下
回复

使用道具 举报

板凳
ID:278048 发表于 2018-3-9 18:05 | 只看该作者
有点难
回复

使用道具 举报

地板
ID:86633 发表于 2018-5-15 20:13 | 只看该作者
可以 挺好的资料
回复

使用道具 举报

5#
ID:63853 发表于 2018-6-12 18:02 | 只看该作者
可以学习了                  
回复

使用道具 举报

6#
ID:365239 发表于 2018-7-6 22:36 | 只看该作者
想要下载学习一下
回复

使用道具 举报

7#
ID:64765 发表于 2018-9-26 14:28 | 只看该作者
好资料,非常感谢
回复

使用道具 举报

8#
ID:245179 发表于 2018-9-28 15:39 | 只看该作者
“进行信号调理与A/D转换模块和并使用STM32单片机进行控制和数据处理。通过串口通信,将重量数据传输给STC12C5A60S2单片机构建的外围功能模块”   为什么要同时采用stm32和stc12单片机呀。   单独采用stm32解决不了么?
回复

使用道具 举报

9#
ID:767040 发表于 2020-6-1 23:28 | 只看该作者
有原理图吗
回复

使用道具 举报

10#
ID:766192 发表于 2020-6-3 00:44 来自手机 | 只看该作者
仿真图哪个版本proteus
回复

使用道具 举报

11#
ID:774222 发表于 2020-12-9 14:54 来自手机 | 只看该作者
liuzhen111 发表于 2020-6-1 23:28
有原理图吗

没有,只有程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表