该装置基于ARM Cortex-M内核,主控制器采用STM32F103C8T6单片机,电容采集装置使用FDC2214电容数字转化器,电容极板使用同纸张直接接触的覆铜板,电容数字转换器将采集到的数据通过IIC协议传输给单片机,单片机通过前期纸张数量校准存取每一张纸的电容值从而建立数据阈值区间表,即相邻两张纸的电容值取中值得到后一张纸的下限阈值,通过后期测量对比前期校准建立的数据阈值区间表,从而实现非线性运算来识别纸张数量,该装置能在5秒内将测量结果显示在OLED屏幕上。
代码
主函数代码
#include "bsp.h"
#include "key.h"
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "oled.h"
#include "usart.h"
#include "beep.h"
#include "math.h"
#include "stdio.h"
//无纸张报警函数
void error(void)
{
OLED_Clear(); //清屏
OLED_ShowCHinese(36, 0, 19); //极
OLED_ShowCHinese(54, 0, 20); //板
OLED_ShowCHinese(72, 0, 23); //短
OLED_ShowCHinese(90, 0, 24); //路
}
//主函数
int main()
{
int ChValue[4] = {
0}; //清理通道
u32 FF=0; //前一张频率值0
u32 FF1=0; //后一张频率值1
u32 ffLast=0; //间距检查标志
u8 resultSign=0; //安全间距标志
u8 key; //
u8 keySign=0; //初始化按键标志
//程序手动数值校准,存取1-50纸张频率数值,可根据不同机械结构环境进行校准
u16 valueBuf[51]={
1000, 3728,4494,5219,5702,6182,6688,7050,7396,7823,8266
,8757,9246,9571,9891,10179,10482,10974,11376,11604,11893
,12169,12410,12682,12949,13203,13459,13697,13937,14180,14418
,14651,14906,15129,15178,15272,15495,15707,15760,15790,15984
,16209,16302,16502,16687,16737,16797,16847,16943,17126,18000};
// u16 valueBuf[61]={1000, 5500,6470,7186,7726,8287,8818,9319,9779,10250,10567,
// 10873,11364,11695,11986,12418,12863,13169,13439,13688,
// 13959,14223,14301,14532,14775,14994,15264,15537,15764,15987,
// 16251,16493,16880,16780,17018,17216,17295,17509,17717,17794,
// 17870,18072,18262,18322,18382,18562,18746,18805,18860,18910,19085,
// 19265,19314,19356,19404,19579,19752,19794,19839,19873,19911};
u8 bufCount=0; //初始化数组元素计数标志符
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
BEEP_Init(); //初始化蜂鸣器端口
KEY_Init(); //初始化与按键连接的硬件接口
OLED_Init(); //初始化OLED
OLED_Clear();
// 主界面
OLED_ShowCHinese(0, 0, 0); //纸
OLED_ShowCHinese(16, 0, 1); //张
OLED_ShowCHinese(32, 0, 2); //计
OLED_ShowCHinese(48, 0, 3); //数
OLED_ShowCHinese(54 + 10, 0, 4); //显
OLED_ShowCHinese(80, 0, 5); //示
OLED_ShowCHinese(96, 0, 6); //装
OLED_ShowCHinese(112, 0, 7); //置
OLED_ShowCHinese(16, 6, 9); //启
OLED_ShowCHinese(32, 6, 10); //动
OLED_ShowCHinese(80, 6, 29); //校
OLED_ShowCHinese(96, 6, 30); //准
delay_ms(8000);
uart_init(115200); //串口初始化
IIC_Init(); //iIC初始化
//InitSingleFDC2214();//初始化单通道
InitMultiFDC2214();//初始化多路复用
BEEP = 0;
while(1)
{
ChValue[1] = FDC2X14ReadCH(0X02);//读取FDC2214通道二的数据
printf("%d\r\n", FF = ChValue[1]);//串口打印,并将频率值转送给频率标志0
OLED_ShowCHinese(0, 4, 27); //频
OLED_ShowCHinese(18, 4, 28); //率
OLED_ShowString(36,4,":",16);
// OLED_ShowString(0,4,"parameter:",16);
OLED_ShowNum(54, 4, FF, 8, 16);
// OLED_ShowNum(54, 6, ffLast, 8, 16);
// OLED_ShowNum(0, 6, KEY1_PRES, 1, 16);
// OLED_ShowNum(32, 6, KEY2_PRES, 1, 16);
//检查区间长度,安全间距为5
if (FF>ffLast)
{
if(FF-ffLast<=5)
resultSign=1;
}
else
{
if(ffLast-FF<=5)
resultSign=1;
}
ffLast=FF;
delay_ms(2);
key = KEY_Scan(); //得到键值
delay_ms(100);
//进行测量和校准
if(key)
{
//区分是检测模式还算校准模式
switch(key)
{
case KEY1_PRES: //检测模式
//delay_ms(10);
OLED_Clear(); //清屏
///
OLED_ShowCHinese(36, 0, 11); //测
OLED_ShowCHinese(54, 0, 12); //试
OLED_ShowCHinese(72, 0, 13); //结
OLED_ShowCHinese(90, 0, 14); //果
//delay_ms(8000);
OLED_ShowCHinese(0, 2, 15); //纸
OLED_ShowCHinese(18, 2