标题:
STM32+LDC1314源程序 19年电赛的纸张测量的程序
[打印本页]
作者:
qwerQWER1
时间:
2020-1-2 10:13
标题:
STM32+LDC1314源程序 19年电赛的纸张测量的程序
因为ldc1314与fdc2214的部分相似性,所以在ldc1314上面的魔改程序
单片机源程序如下:
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "main.h"
#include "timer.h"
#include "LDC1314.h"
#include "xunji.h"
#define Coin_Data 60 //检测硬币的差值
#define Wire_Data 3 //检测铁丝的差值
#define Speed_PWM 50
#define flag_beep 4
#define flag_ch0 0
#define flag_ch1 1
#define flag_ch2 2
#define flag_ch3 3
#define flag_ch4 5
static int dif_val1,dif_val2;
int dif_val1=0,dif_val2=0;
uint32_t CH_Dif[4]={0,0,0,0};
u8 step_flag = 0;
u8 key_flag;
uint32_t CH[4]={0};
int val_init,val_10,val_15,val_20,val_30; //初始值
float Step1to10_val,Step10to15_val,Step15to20_val,Step20to30_val;//每张纸的步进值
u8 flag_Last[50]={0};
unsigned long CH0_Data=0,CH1_Data=0,CH2_Data=0,CH3_Data=0;//传感器初始值
int Paper_Num(int *CH_Dif,u8 flag);//测量纸张数量
void Auto_cheak(void); //自检测函数
u8 Key_cheak(void); //触摸按键检测函数,有触摸按键,返回1
void Cal_Step_val(void);//计算各个步进值
u8 Cal_Paper(int *CH_Dif);//粗略计算纸张数量,返回纸张所在步进区间标志位
int function1(uint32_t CH_Dif1,int dif_val1);//根据采集的数据,计算纸张数量,纸张要求为1~15张
int function2(uint32_t CH_Dif1,int dif_val2);//根据采集的数据,计算纸张数量,纸张要求为16~35张
int main(void)
{
uint8_t retVal=0;//传感器自初始化返回值
int i=0;
int num=0;
char *str;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
OLED_Init();
OLED_Display_On();
OLED_Clear();
uart_init(115200); //串口初始化为115200
printf("uart Init_OK\r\n");
//TIM2_Int_Init();
//TIM3_Int_Init(799,0); //10KHz PWM
//EXTIX_Init();
I2C_INIT(); //IIC初始化,模拟IIC,用于ldc1314通信,使用PA11,PA12
printf("IIC Init_OK\r\n");
do //LDC1314初始化
{
printf("LCD Init_ing\r\n");
retVal=2;
retVal = InitLDC1314();//ldc1314初始化,若不成功则一直执行
}while (retVal!= 1) ;
delay_ms(100);
//Auto_cheak();//自检
OLED_Clear();
while(1)
{
OLED_ShowString(0,0," Work Mode",16);
OLED_ShowString(0,2,"Place Paper...",16);
OLED_ShowString(0,4,"Place... ",16);
// while(!Key_cheak())
// {
// delay_ms(10);
// }//等待按键确认
OLED_ShowString(0,4,"Place : OK ",16);//手动确认纸张放好
for(i=0;i<50;i++)
{
LDC_read(CH);
CH_Dif[1] += CH[1];
delay_ms(10);
}
CH_Dif[1]=CH_Dif[1]/50;
if(CH_Dif[1]<=7638)
num=function1(CH_Dif[1],0);
else
num=function2(CH_Dif[1],0);
printf("CH_Dif[1]=%d Paper : %d\r\n",CH_Dif[1],num);
// while(!Key_cheak())
// {
// delay_ms(10);
// }//等待按键确认
CH_Dif[0]=0;
CH_Dif[1]=0;
CH_Dif[2]=0;
}
}
int Paper_Num(int *CH_Dif,u8 flag)
{
int Num=0;
switch(flag)
{
case 1://1~10张
Num=(CH_Dif[1]-val_init)/Step1to10_val;
break;
case 2://11~15张
Num=(CH_Dif[1]-val_10)/Step10to15_val;
break;
case 3://16~20张
Num=(CH_Dif[1]-val_15)/Step15to20_val;
break;
case 4://21~30张
Num=(CH_Dif[1]-val_20)/Step20to30_val;
break;
case 5://>30张
Num=(CH_Dif[1]-val_30)/Step20to30_val;//待确定
break;
case 0://短路或错误标识
OLED_Clear();
OLED_ShowString(0,0,"ERROR Mode",16);
break;
}
return Num;
}
u8 Key_cheak(void)
{
int i;
LDC_read(CH);
for(i=0;i<10;i++)
{
LDC_read(CH);
CH_Dif[0] += CH[0];
}
CH_Dif[0]=CH_Dif[0]/10;
printf("Key_cheak CH_Dif[0]=:%d\r\n",CH_Dif[0]);
if(CH_Dif[0]<31000)
return 1;
else
return 0;
}
void Auto_cheak(void)
{
int i,sum=0;
printf("Auto_Cheak!\r\n");
OLED_ShowString(0,0,"Auto_Cheak Mode",16);
OLED_ShowString(0,2,"Paper_Num:5",16);//自检测5张纸
OLED_ShowString(0,4,"Cheaking...",16);
while(!Key_cheak())
{
delay_ms(10);
}//等待按键确认
delay_ms(1000);//等待测量值稳定
for(i=0;i<30;i++)
{
LDC_read(CH);
sum+=CH[1];
delay_ms(10);
}
val_init=sum/30;
if(5!=function1(val_init,0))
{
dif_val1=val_init-(6915+7055)/2;
}
sum=0;
OLED_ShowString(0,4,"Cheak:OK! ",16);
//beep
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
OLED_ShowString(0,2,"Paper_Num:20",16);//自检测20张纸
OLED_ShowString(0,4,"Cheaking...!",16);
while(!Key_cheak())//等待按键确认
{delay_ms(10);}
delay_ms(1000);
for(i=0;i<30;i++)
{
LDC_read(CH);
sum+=CH[1];
delay_ms(10);
}
val_20=sum/30;
if(20!=function1(val_init,0))
{
dif_val2=val_init-(7786+7816)/2;
}
sum=0;
OLED_ShowString(0,4,"Cheak:OK! ",16);
//beep
delay_ms(1000);
delay_ms(1000);
}
void Cal_Step_val(void)
{
Step1to10_val=(val_10-val_init)/9;//算出各个区间的步进值
Step10to15_val=(val_15-val_10)/5;
Step15to20_val=(val_20-val_15)/5;
Step20to30_val=(val_30-val_20)/10;
}
u8 Cal_Paper(int *CH_Dif)
{
if(CH_Dif[1]>(val_init-3) && CH_Dif[1]<(val_10))
return 1;
if(CH_Dif[1]>(val_10) && CH_Dif[1]<(val_15))
return 2;
if(CH_Dif[1]>(val_15) && CH_Dif[1]<(val_20))
return 3;
if(CH_Dif[1]>(val_20) && CH_Dif[1]<(val_30))
return 4;
if(CH_Dif[1]>(val_30))
return 5;
else
return 0;//error
}
/*此函数用于判断1~15张纸的数量*/
/*输入参数:通道采样值*/
/*数出参数:纸张数量 */
/* f(x) = p1*x^4 + p2*x^3 + p3*x^2 + p4*x + p5 */
/* p1 = 0.02382 (-0.0076, 0.05524)*/
/* p2 = -0.08983 (-1.102, 0.9222)*/
/* p3 = -15.9 (-26.84, -4.963)*/
/* p4 = 293.3 (248.3, 338.3)*/
/* p5 = 5916 (5860, 5972)*/
/* 根据上述公式求得的参数区间*/
int function1(uint32_t CH_Dif1, int dif_val1)
{
int dif_val=0;
uint32_t CH_Dif[2]=0;
CH_Dif[1]=CH_Dif1;
if(CH_Dif[1]>=6059+dif_val && CH_Dif[1]<=6320+dif_val)
return 1;
else if(CH_Dif[1]>6320+dif_val && CH_Dif[1]<=6549+dif_val)
return 2;
else if(CH_Dif[1]>6549+dif_val && CH_Dif[1]<=6747+dif_val)
return 3;
else if(CH_Dif[1]>6747+dif_val && CH_Dif[1]<=6915+dif_val)
return 4;
else if(CH_Dif[1]>6915+dif_val && CH_Dif[1]<=7055+dif_val)
return 5;
else if(CH_Dif[1]>7055+dif_val && CH_Dif[1]<=7169+dif_val)
return 6;
else if((CH_Dif[1]>(7169+dif_val)) && (CH_Dif[1]<=(7259+dif_val)))
return 7;
else if(CH_Dif[1]>(7260+dif_val) && CH_Dif[1]<=(7329+dif_val))
return 8;
else if(CH_Dif[1]>(7329+dif_val) && CH_Dif[1]<=(7384+dif_val))
return 9;
else if(CH_Dif[1]>7384+dif_val && CH_Dif[1]<=7428+dif_val)
return 10;
else if(CH_Dif[1]>7428+dif_val && CH_Dif[1]<=7466+dif_val)
return 11;
else if(CH_Dif[1]>7466+dif_val && CH_Dif[1]<=7494+dif_val)
return 12;
else if(CH_Dif[1]>7494+dif_val && CH_Dif[1]<=7558+dif_val)//改区间
return 13;
else if(CH_Dif[1]>7558+dif_val && CH_Dif[1]<=7605+dif_val)
return 14;
else if(CH_Dif[1]>7605+dif_val && CH_Dif[1]<=7638+dif_val)
return 15;
else return 999;
}
int function2(uint32_t CH_Dif1, int dif_val2)
{
int dif_val=0;
uint32_t CH_Dif[2]=0;
CH_Dif[1]=CH_Dif1;
if(CH_Dif[1]>7638+dif_val && CH_Dif[1]<=7678+dif_val)
return 16;
else if(CH_Dif[1]>7678+dif_val && CH_Dif[1]<=7717+dif_val)
return 17;
else if(CH_Dif[1]>7717+dif_val && CH_Dif[1]<=7753+dif_val)
return 18;
else if(CH_Dif[1]>7753+dif_val && CH_Dif[1]<=7786+dif_val)
return 19;
else if(CH_Dif[1]>7786+dif_val && CH_Dif[1]<=7816+dif_val)
return 20;
else if(CH_Dif[1]>7816+dif_val && CH_Dif[1]<=7844+dif_val)
return 21;
else if(CH_Dif[1]>7844+dif_val && CH_Dif[1]<=7869+dif_val)
return 22;
else if(CH_Dif[1]>7869+dif_val && CH_Dif[1]<=7891+dif_val)
return 23;
else if(CH_Dif[1]>7891+dif_val && CH_Dif[1]<=7911+dif_val)
return 24;
else if(CH_Dif[1]>7911+dif_val && CH_Dif[1]<=7929+dif_val)
return 25;
else if(CH_Dif[1]>7929+dif_val && CH_Dif[1]<=7943+dif_val)
return 26;
else if(CH_Dif[1]>7943+dif_val && CH_Dif[1]<=7959+dif_val)
return 27;
else if(CH_Dif[1]>7959+dif_val && CH_Dif[1]<=7970+dif_val)
return 28;
else if(CH_Dif[1]>7970+dif_val && CH_Dif[1]<=7984+dif_val)
return 29;
else if(CH_Dif[1]>7984+dif_val && CH_Dif[1]<=7995+dif_val)
return 30;
else if(CH_Dif[1]>7995+dif_val && CH_Dif[1]<=8005+dif_val)
return 31;
else if(CH_Dif[1]>8005+dif_val && CH_Dif[1]<=8015+dif_val)
return 32;
else if(CH_Dif[1]>8015+dif_val && CH_Dif[1]<=8026+dif_val)
return 33;
else if(CH_Dif[1]>8026+dif_val && CH_Dif[1]<=8038+dif_val)
return 34;
else if(CH_Dif[1]>8038+dif_val && CH_Dif[1]<=8052+dif_val)
return 35;
else return 999;
}
复制代码
所有资料51hei提供下载:
LDC1314_F1.7z
(218.01 KB, 下载次数: 34)
2020-1-2 13:10 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
czhaii
时间:
2020-1-3 15:14
功能说明也没有,干什么用的?电器接线是怎么样的。统统没有说明白,不知所云。
作者:
timeabcd
时间:
2024-8-6 15:49
用的震荡是什么提供的呢?是外部晶振还是单片机引脚提供的呢?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1