找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2704|回复: 2
收起左侧

STM32+LDC1314源程序 19年电赛的纸张测量的程序

[复制链接]
ID:393086 发表于 2020-1-2 10:13 | 显示全部楼层 |阅读模式
因为ldc1314与fdc2214的部分相似性,所以在ldc1314上面的魔改程序

单片机源程序如下:
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "main.h"
  5. #include "timer.h"
  6. #include "LDC1314.h"
  7. #include "xunji.h"


  8. #define Coin_Data 60   //检测硬币的差值
  9. #define Wire_Data 3   //检测铁丝的差值  
  10. #define Speed_PWM 50
  11. #define flag_beep 4
  12. #define flag_ch0  0
  13. #define flag_ch1  1
  14. #define flag_ch2  2
  15. #define flag_ch3  3
  16. #define flag_ch4  5

  17. static int dif_val1,dif_val2;
  18. int dif_val1=0,dif_val2=0;
  19. uint32_t CH_Dif[4]={0,0,0,0};
  20. u8 step_flag = 0;
  21. u8 key_flag;
  22. uint32_t CH[4]={0};
  23. int val_init,val_10,val_15,val_20,val_30; //初始值
  24. float Step1to10_val,Step10to15_val,Step15to20_val,Step20to30_val;//每张纸的步进值
  25. u8 flag_Last[50]={0};
  26. unsigned long CH0_Data=0,CH1_Data=0,CH2_Data=0,CH3_Data=0;//传感器初始值
  27. int Paper_Num(int *CH_Dif,u8 flag);//测量纸张数量
  28. void Auto_cheak(void); //自检测函数
  29. u8 Key_cheak(void);    //触摸按键检测函数,有触摸按键,返回1
  30. void Cal_Step_val(void);//计算各个步进值
  31. u8 Cal_Paper(int *CH_Dif);//粗略计算纸张数量,返回纸张所在步进区间标志位
  32. int function1(uint32_t CH_Dif1,int dif_val1);//根据采集的数据,计算纸张数量,纸张要求为1~15张
  33. int function2(uint32_t CH_Dif1,int dif_val2);//根据采集的数据,计算纸张数量,纸张要求为16~35张




  34. int main(void)
  35. {       
  36.         uint8_t retVal=0;//传感器自初始化返回值
  37.         int i=0;
  38.         int num=0;
  39.         char *str;
  40.         delay_init();                             //延时函数初始化          
  41.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  42.         OLED_Init();
  43.         OLED_Display_On();
  44.         OLED_Clear();
  45.        
  46.         uart_init(115200);                 //串口初始化为115200
  47.         printf("uart Init_OK\r\n");
  48.         //TIM2_Int_Init();
  49.         //TIM3_Int_Init(799,0);  //10KHz  PWM
  50.         //EXTIX_Init();
  51.         I2C_INIT(); //IIC初始化,模拟IIC,用于ldc1314通信,使用PA11,PA12
  52.         printf("IIC Init_OK\r\n");
  53.         do                                        //LDC1314初始化
  54.         {
  55.                         printf("LCD Init_ing\r\n");
  56.                         retVal=2;
  57.                         retVal = InitLDC1314();//ldc1314初始化,若不成功则一直执行                               
  58.         }while (retVal!= 1)        ;         
  59.         delay_ms(100);


  60.         //Auto_cheak();//自检
  61.         OLED_Clear();
  62.         while(1)
  63.         {
  64.                 OLED_ShowString(0,0,"   Work Mode",16);
  65.                 OLED_ShowString(0,2,"Place Paper...",16);
  66.                 OLED_ShowString(0,4,"Place...     ",16);
  67. //                while(!Key_cheak())
  68. //                {
  69. //                        delay_ms(10);
  70. //                }//等待按键确认
  71.                 OLED_ShowString(0,4,"Place : OK  ",16);//手动确认纸张放好
  72.                 for(i=0;i<50;i++)
  73.                 {
  74.                         LDC_read(CH);
  75.                         CH_Dif[1] += CH[1];
  76.                         delay_ms(10);
  77.                 }
  78.                 CH_Dif[1]=CH_Dif[1]/50;
  79.                 if(CH_Dif[1]<=7638)
  80.                         num=function1(CH_Dif[1],0);
  81.                 else
  82.                         num=function2(CH_Dif[1],0);
  83.                 printf("CH_Dif[1]=%d Paper : %d\r\n",CH_Dif[1],num);
  84. //                while(!Key_cheak())
  85. //                {
  86. //                        delay_ms(10);
  87. //                }//等待按键确认
  88.                 CH_Dif[0]=0;
  89.                 CH_Dif[1]=0;
  90.                 CH_Dif[2]=0;
  91.         }
  92. }



  93. int Paper_Num(int *CH_Dif,u8 flag)
  94. {
  95.         int Num=0;
  96.         switch(flag)
  97.         {
  98.                 case 1://1~10张
  99.                         Num=(CH_Dif[1]-val_init)/Step1to10_val;
  100.                         break;
  101.                 case 2://11~15张
  102.                         Num=(CH_Dif[1]-val_10)/Step10to15_val;
  103.                         break;
  104.                 case 3://16~20张
  105.                         Num=(CH_Dif[1]-val_15)/Step15to20_val;
  106.                         break;
  107.                 case 4://21~30张
  108.                         Num=(CH_Dif[1]-val_20)/Step20to30_val;
  109.                         break;
  110.                 case 5://>30张
  111.                         Num=(CH_Dif[1]-val_30)/Step20to30_val;//待确定
  112.                         break;
  113.                 case 0://短路或错误标识
  114.                         OLED_Clear();
  115.                         OLED_ShowString(0,0,"ERROR Mode",16);
  116.                         break;
  117.                
  118.         }
  119.         return Num;
  120. }
  121. u8 Key_cheak(void)
  122. {
  123.         int i;
  124.         LDC_read(CH);
  125.         for(i=0;i<10;i++)
  126.         {
  127.                 LDC_read(CH);
  128.                 CH_Dif[0] += CH[0];
  129.         }
  130.         CH_Dif[0]=CH_Dif[0]/10;
  131.         printf("Key_cheak CH_Dif[0]=:%d\r\n",CH_Dif[0]);
  132.         if(CH_Dif[0]<31000)
  133.                 return 1;
  134.         else
  135.                 return 0;
  136. }

  137. void Auto_cheak(void)
  138. {
  139.         int i,sum=0;
  140.         printf("Auto_Cheak!\r\n");
  141.         OLED_ShowString(0,0,"Auto_Cheak Mode",16);
  142.         OLED_ShowString(0,2,"Paper_Num:5",16);//自检测5张纸
  143.         OLED_ShowString(0,4,"Cheaking...",16);
  144.         while(!Key_cheak())
  145.         {
  146.                 delay_ms(10);
  147.         }//等待按键确认
  148.        
  149.         delay_ms(1000);//等待测量值稳定
  150.         for(i=0;i<30;i++)
  151.         {
  152.                 LDC_read(CH);
  153.                 sum+=CH[1];                         
  154.                 delay_ms(10);
  155.         }
  156.         val_init=sum/30;
  157.         if(5!=function1(val_init,0))
  158.         {       
  159.                 dif_val1=val_init-(6915+7055)/2;
  160.         }
  161.         sum=0;
  162.         OLED_ShowString(0,4,"Cheak:OK!   ",16);
  163.         //beep
  164.         delay_ms(1000);
  165.         delay_ms(1000);
  166.         delay_ms(1000);
  167.        
  168.   
  169.        
  170.         OLED_ShowString(0,2,"Paper_Num:20",16);//自检测20张纸
  171.         OLED_ShowString(0,4,"Cheaking...!",16);
  172.         while(!Key_cheak())//等待按键确认
  173.                 {delay_ms(10);}
  174.         delay_ms(1000);
  175.         for(i=0;i<30;i++)
  176.         {
  177.                 LDC_read(CH);
  178.                 sum+=CH[1];                         
  179.                 delay_ms(10);
  180.         }
  181.         val_20=sum/30;
  182.         if(20!=function1(val_init,0))
  183.         {       
  184.                 dif_val2=val_init-(7786+7816)/2;
  185.         }
  186.         sum=0;
  187.         OLED_ShowString(0,4,"Cheak:OK!   ",16);
  188.         //beep
  189.         delay_ms(1000);
  190.         delay_ms(1000);
  191.        
  192.        

  193. }

  194. void Cal_Step_val(void)
  195. {
  196.         Step1to10_val=(val_10-val_init)/9;//算出各个区间的步进值
  197.         Step10to15_val=(val_15-val_10)/5;
  198.         Step15to20_val=(val_20-val_15)/5;
  199.         Step20to30_val=(val_30-val_20)/10;
  200. }

  201. u8 Cal_Paper(int *CH_Dif)
  202. {
  203.         if(CH_Dif[1]>(val_init-3) && CH_Dif[1]<(val_10))
  204.                 return 1;
  205.         if(CH_Dif[1]>(val_10) && CH_Dif[1]<(val_15))
  206.                 return 2;
  207.         if(CH_Dif[1]>(val_15) && CH_Dif[1]<(val_20))
  208.                 return 3;
  209.         if(CH_Dif[1]>(val_20) && CH_Dif[1]<(val_30))
  210.                 return 4;
  211.         if(CH_Dif[1]>(val_30))
  212.                 return 5;
  213.         else
  214.                 return 0;//error
  215.        
  216. }

  217. /*此函数用于判断1~15张纸的数量*/
  218. /*输入参数:通道采样值*/
  219. /*数出参数:纸张数量         */
  220. /*   f(x) = p1*x^4 + p2*x^3 + p3*x^2 + p4*x + p5 */
  221. /*                 p1 =     0.02382  (-0.0076, 0.05524)*/
  222. /*      p2 =    -0.08983  (-1.102, 0.9222)*/
  223. /*       p3 =   -15.9  (-26.84, -4.963)*/
  224. /*       p4 =     293.3  (248.3, 338.3)*/
  225. /*       p5 =     5916  (5860, 5972)*/

  226. /* 根据上述公式求得的参数区间*/


  227. int function1(uint32_t CH_Dif1, int dif_val1)
  228. {
  229.         int dif_val=0;
  230.         uint32_t CH_Dif[2]=0;
  231.         CH_Dif[1]=CH_Dif1;
  232.         if(CH_Dif[1]>=6059+dif_val && CH_Dif[1]<=6320+dif_val)
  233.                 return 1;
  234.         else if(CH_Dif[1]>6320+dif_val && CH_Dif[1]<=6549+dif_val)
  235.                 return 2;
  236.         else if(CH_Dif[1]>6549+dif_val && CH_Dif[1]<=6747+dif_val)
  237.                 return 3;
  238.         else if(CH_Dif[1]>6747+dif_val && CH_Dif[1]<=6915+dif_val)
  239.                 return 4;
  240.         else if(CH_Dif[1]>6915+dif_val && CH_Dif[1]<=7055+dif_val)
  241.                 return 5;
  242.         else if(CH_Dif[1]>7055+dif_val && CH_Dif[1]<=7169+dif_val)
  243.                 return 6;
  244.         else if((CH_Dif[1]>(7169+dif_val)) && (CH_Dif[1]<=(7259+dif_val)))
  245.                 return 7;
  246.         else if(CH_Dif[1]>(7260+dif_val) && CH_Dif[1]<=(7329+dif_val))
  247.                 return 8;
  248.         else if(CH_Dif[1]>(7329+dif_val) && CH_Dif[1]<=(7384+dif_val))
  249.                 return 9;
  250.         else if(CH_Dif[1]>7384+dif_val && CH_Dif[1]<=7428+dif_val)
  251.                 return 10;
  252.         else if(CH_Dif[1]>7428+dif_val && CH_Dif[1]<=7466+dif_val)
  253.                 return 11;
  254.         else if(CH_Dif[1]>7466+dif_val && CH_Dif[1]<=7494+dif_val)
  255.                 return 12;
  256.         else if(CH_Dif[1]>7494+dif_val && CH_Dif[1]<=7558+dif_val)//改区间
  257.                 return 13;
  258.         else if(CH_Dif[1]>7558+dif_val && CH_Dif[1]<=7605+dif_val)
  259.                 return 14;
  260.         else if(CH_Dif[1]>7605+dif_val && CH_Dif[1]<=7638+dif_val)
  261.                 return 15;
  262.         else return 999;
  263.        
  264.        
  265.                        
  266. }



  267. int function2(uint32_t CH_Dif1, int dif_val2)
  268. {
  269.         int dif_val=0;
  270.         uint32_t CH_Dif[2]=0;
  271.         CH_Dif[1]=CH_Dif1;
  272.         if(CH_Dif[1]>7638+dif_val && CH_Dif[1]<=7678+dif_val)
  273.                 return 16;
  274.         else if(CH_Dif[1]>7678+dif_val && CH_Dif[1]<=7717+dif_val)
  275.                 return 17;
  276.         else if(CH_Dif[1]>7717+dif_val && CH_Dif[1]<=7753+dif_val)
  277.                 return 18;
  278.         else if(CH_Dif[1]>7753+dif_val && CH_Dif[1]<=7786+dif_val)
  279.                 return 19;
  280.         else if(CH_Dif[1]>7786+dif_val && CH_Dif[1]<=7816+dif_val)
  281.                 return 20;
  282.         else if(CH_Dif[1]>7816+dif_val && CH_Dif[1]<=7844+dif_val)
  283.                 return 21;
  284.         else if(CH_Dif[1]>7844+dif_val && CH_Dif[1]<=7869+dif_val)
  285.                 return 22;
  286.         else if(CH_Dif[1]>7869+dif_val && CH_Dif[1]<=7891+dif_val)
  287.                 return 23;
  288.         else if(CH_Dif[1]>7891+dif_val && CH_Dif[1]<=7911+dif_val)
  289.                 return 24;
  290.         else if(CH_Dif[1]>7911+dif_val && CH_Dif[1]<=7929+dif_val)
  291.                 return 25;
  292.         else if(CH_Dif[1]>7929+dif_val && CH_Dif[1]<=7943+dif_val)
  293.                 return 26;
  294.         else if(CH_Dif[1]>7943+dif_val && CH_Dif[1]<=7959+dif_val)
  295.                 return 27;
  296.         else if(CH_Dif[1]>7959+dif_val && CH_Dif[1]<=7970+dif_val)
  297.                 return 28;
  298.         else if(CH_Dif[1]>7970+dif_val && CH_Dif[1]<=7984+dif_val)
  299.                 return 29;
  300.         else if(CH_Dif[1]>7984+dif_val && CH_Dif[1]<=7995+dif_val)
  301.                 return 30;
  302.         else if(CH_Dif[1]>7995+dif_val && CH_Dif[1]<=8005+dif_val)
  303.                 return 31;
  304.         else if(CH_Dif[1]>8005+dif_val && CH_Dif[1]<=8015+dif_val)
  305.                 return 32;
  306.         else if(CH_Dif[1]>8015+dif_val && CH_Dif[1]<=8026+dif_val)
  307.                 return 33;
  308.         else if(CH_Dif[1]>8026+dif_val && CH_Dif[1]<=8038+dif_val)
  309.                 return 34;
  310.         else if(CH_Dif[1]>8038+dif_val && CH_Dif[1]<=8052+dif_val)
  311.                 return 35;
  312.         else return 999;
  313. }
复制代码

所有资料51hei提供下载:
LDC1314_F1.7z (218.01 KB, 下载次数: 34)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:140644 发表于 2020-1-3 15:14 | 显示全部楼层
功能说明也没有,干什么用的?电器接线是怎么样的。统统没有说明白,不知所云。
回复

使用道具 举报

ID:165291 发表于 2024-8-6 15:49 | 显示全部楼层
用的震荡是什么提供的呢?是外部晶振还是单片机引脚提供的呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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