|
內(nèi)容包含2019一些大賽題目,以及相關(guān)的了解。主要是F題電容的程序?qū)崿F(xiàn),采用F4系列單片機(jī),有FDC2214的模塊的原理圖和PCB。分享給大家。
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (46.13 KB, 下載次數(shù): 114)
下載附件
2020-10-19 04:53 上傳
51hei.png (23.62 KB, 下載次數(shù): 78)
下載附件
2020-10-19 04:53 上傳
51hei.png (2.99 KB, 下載次數(shù): 102)
下載附件
2020-10-19 04:53 上傳
單片機(jī)源程序如下:
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "myiic.h"
- #include "FDC2X2X_CMD.h"
- #include "FDC2214.h"
- #include "led.h"
- #include "key.h"
- #include "oled.h"
- #include "beep.h"
- #include "exti.h"
- #include "24cxx.h"
- #define ROUND_TO_UINT16(x) ((uint16_t)(x)+0.5)>(x)? ((uint16_t)(x)):((uint16_t)(x)+1) //將浮點(diǎn)數(shù)x四舍五入為uint16_t
- #define MAX_SIZE 100 //最大容量---紙張數(shù)
- #define GAP_MS 50 //校準(zhǔn)測量采樣時間間隔
- #define DATA_ACQUIRE_NUMBER 20 //數(shù)據(jù)采集數(shù)
- #define CH 1 //通道數(shù)
- #define duty_wideth 0.5 //濾波窗寬度調(diào)整系數(shù)
- u8 Flag_Work=0,Flag_Calibration=0; //Flag_Work :工作標(biāo)志位。Flag_Work=0,設(shè)備處于待機(jī)狀態(tài);Flag_Work=1,設(shè)備處于測量狀態(tài)。
- float Cap; //Cap :設(shè)備兩極板間電容值,屏幕上實(shí)時顯示
- int Paper_Number; //Paper_Number:設(shè)備最終計(jì)算得到的A4紙張數(shù)
- __align(4) u8 dtbuf[50]; //打印緩存器 __align(4)
- float Data_Raw[DATA_ACQUIRE_NUMBER],Data_Level[MAX_SIZE],data_acquire[DATA_ACQUIRE_NUMBER];
- //排序函數(shù)
- void bubble(float a[],int n)
- {
- int i,j;
- for(i=0; i<n-1; i++)
- {
- for(j=n-1; j>i; j--)
- {
- if(a[j]<a[j-1])
- {
- float t=a[j];
- a[j]=a[j-1];
- a[j-1]=t;
- }
- }
- }
- }
- //短路檢測函數(shù)
- void Danger_Test()
- {
- if(Cap<0)
- {
- OLED_ShowString(0,0," Danger !!! ",16);
- BEEP=1;
- }
- }
- //啟動測量函數(shù)
- void Start_Measure()
- {
- int i,j,k,index_min=0,counter,sum_effective;
- float variance_high,variance_low,sum_div_sqr,div,div_sqr,sum,baseline,div_min,div_max,high_limit,low_limit,average_effective,data_measure_effective[MAX_SIZE];
- if(Flag_Work==1) //如果KEY1按鍵按下,觸發(fā)外部中斷(工作標(biāo)志位置1),進(jìn)入此程序,程序進(jìn)入測量狀態(tài)
- {
- LED1=0; //LED1:測量指示燈
- for(i=0; i<DATA_ACQUIRE_NUMBER; i++)
- {
- Cap=FDC2214_read_CHx(CH); //Cap為設(shè)備所采的電容值
- data_acquire[i]=Cap;
- delay_ms(GAP_MS);
- }
- bubble(data_acquire,DATA_ACQUIRE_NUMBER);
- for(j=0; j<DATA_ACQUIRE_NUMBER; j++)
- {
- sum+=data_acquire[j];
- }
- baseline=sum/(float)DATA_ACQUIRE_NUMBER;
- div_min=(float)duty_wideth*(baseline-data_acquire[0]);
- div_max=(float)duty_wideth*(data_acquire[DATA_ACQUIRE_NUMBER-1]-baseline);
- high_limit=baseline+div_max;
- low_limit=baseline-div_min;
- counter=0;
- sum_effective=0.0f;
- for(k=0; k<DATA_ACQUIRE_NUMBER; k++)
- {
- Cap=FDC2214_read_CHx(CH);
- delay_ms(GAP_MS);
- if((Cap>low_limit)&&(Cap<high_limit))
- {
- data_measure_effective[counter]=Cap;
- sum_effective+=Cap;
- counter++;
- }
- }
- average_effective=sum_effective/(float)counter;
- for(i=0; i<MAX_SIZE; i++)
- {
- if(average_effective>Data_Level[i])
- break;
- }
- sum_div_sqr=0.0f;
- for(j=0; j<counter; j++)
- {
- div=data_measure_effective[j]-Data_Level[i-1];
- if(div<0)
- div=-div;
- else div=div;
- div_sqr=div*div;
- sum_div_sqr+=div_sqr;
- }
- variance_high=sum_div_sqr/(float)counter;
- for(j=0; j<counter; j++)
- {
- div=data_measure_effective[j]-Data_Level[i];
- if(div<0)
- div=-div;
- else div=div;
- div_sqr=div*div;
- sum_div_sqr+=div_sqr;
- }
- variance_low=sum_div_sqr/(float)counter;
- if(i>=1)
-
- {
- if(variance_high>variance_low)
- index_min=i;
- else
- index_min=i-1;
- }
- Paper_Number=index_min+1; //下標(biāo)+1得到紙張數(shù)
- OLED_ShowNum(0,4,Paper_Number,10,16); //OLED顯示紙張數(shù)
- BEEP=1;
- delay_ms(500);
- BEEP=0;
- LED1=1;
- Flag_Work=0; //將工作標(biāo)志位置0,測試儀進(jìn)入待機(jī)狀態(tài)
- }
- }
- //校準(zhǔn)函數(shù)
- void Calibration()
- {
- int i,j,k,counter;
- float sum,sum_effective,baseline,high_limit,low_limit,div_min,div_max;
- Flag_Calibration=0; //校準(zhǔn)標(biāo)志位,KEY2按鍵置1,相當(dāng)于確定
- OLED_ShowString(0,0," Calibration ",16);
- for(i=0; i<MAX_SIZE; i++) //循環(huán)校準(zhǔn)不同數(shù)量紙的電容值
- {
- sprintf((char *)dtbuf,"Place %d paper.",i+1);
- OLED_ShowString(0,2,dtbuf,16);
- OLED_ShowString(0,6," Press KEY2 !!!",16);
- while(Flag_Calibration==0)
- {
- Cap=FDC2214_read_CHx(CH);
- sprintf((char *)dtbuf,"Cap:%4.4f pF",Cap);
- OLED_ShowString(0,4,dtbuf,16);
- }
- sum=0;
- for(j=0; j<DATA_ACQUIRE_NUMBER; j++) //采集DATA_ACQUIRE_NUMBER次數(shù)據(jù)并取平均值存入AT24C02
- {
- Cap=FDC2214_read_CHx(CH);
- Data_Raw[j]=Cap;
- delay_ms(GAP_MS);
- }
- bubble(Data_Raw,DATA_ACQUIRE_NUMBER);
- for(j=0; j<DATA_ACQUIRE_NUMBER; j++)
- {
- sum+=Data_Raw[j];
- }
- baseline=sum/(float)DATA_ACQUIRE_NUMBER;
- div_min=(float)duty_wideth*(baseline-Data_Raw[0]);
- div_max=(float)duty_wideth*(Data_Raw[DATA_ACQUIRE_NUMBER-1]-baseline);
- high_limit=baseline+div_max;
- low_limit=baseline-div_min;
- counter=0;
- sum_effective=0.0f;
- for(k=0; k<DATA_ACQUIRE_NUMBER; k++)
- {
- Cap=FDC2214_read_CHx(CH);
- delay_ms(GAP_MS);
- if((Cap>low_limit)&&(Cap<high_limit))
- {
- sum_effective+=Cap;
- counter++;
- }
- }
- Data_Level[i]=sum_effective/(float)counter;
-
- if(i==0)
- {
- storFloatData DATA_LEVEL= { Data_Level[i] }; //向AT24C02寫入數(shù)據(jù)
- Storage_WriteFloatNum(4*i,DATA_LEVEL);
- BEEP=1;
- delay_ms(500);
- BEEP=0;
- }
-
- if(i>=1)
- {
- if(Data_Level[i]<Data_Level[i-1])
- {
- storFloatData DATA_LEVEL= { Data_Level[i] }; //向AT24C02寫入數(shù)據(jù)
- Storage_WriteFloatNum(4*i,DATA_LEVEL);
- BEEP=1;
- delay_ms(500);
- BEEP=0;
- }
- else
- {
- i=i-1;
- BEEP=1;
- delay_ms(200);
- BEEP=0;
- delay_ms(200);
- BEEP=1;
- delay_ms(200);
- BEEP=0;
- }
- }
- Flag_Calibration=0;
- }
- OLED_Clear();
- OLED_ShowString(0,2,"Calibration OK!!",16);
- BEEP=1; //校驗(yàn)通過后蜂鳴器響2秒
- delay_ms(2000);
- BEEP=0;
- OLED_Clear();
- }
- //循環(huán)讀取AT24C02數(shù)據(jù)函數(shù)
- void Read_AT24C02()
- {
- int i;
- for(i=0; i<MAX_SIZE; i++)
- {
- storFloatData DATA=Storage_ReadFloatNum(4*i);
- Data_Level[i]=DATA.value; //錄入到Data_Level數(shù)組
- }
- }
- int main()
- {
- delay_init(168); //延時函數(shù)初始化
- uart_init(115200); //串口初始化為115200
- LED_Init();
- KEY_Init();
- BEEP_Init();
- OLED_Init();
- EXTIX_Init();
- AT24CXX_Init();
- FDC2214_Init();
- Read_AT24C02(); //上電復(fù)位后讀取AT24C02中存儲的紙張數(shù)的電容值均值(做比對參考電容值)
- OLED_Clear();
- while(1)
- {
- Cap=FDC2214_read_CHx(CH); //讀取電容值
- //----------OLED第一行顯示內(nèi)容-------------//
- OLED_ShowString(0,0,"|Paper Counter|",16);
- //----------OLED第二行顯示內(nèi)容-------------//
- OLED_ShowString(0,2,"----------------",16);
- //----------OLED第三行顯示內(nèi)容-------------//實(shí)時電容值
- sprintf((char *)dtbuf,"Cap:%4.4f",Cap);
- OLED_ShowString(0,4,dtbuf,16);
- OLED_ShowString(112,4,"pF",16);
- //----------OLED第四行顯示內(nèi)容-------------//紙張數(shù)
- OLED_ShowString(0,6,"Number:",16);
- OLED_ShowNum(56,6,Paper_Number,9,16);
- if(Flag_Calibration==1) //如果KEY2鍵按下,觸發(fā)中斷進(jìn)入校準(zhǔn)狀態(tài),不能退出(可復(fù)位重新開始)
- {
- Calibration(); //校準(zhǔn)函數(shù)
- Flag_Calibration=0;
- }
- LED0=0; //LED0:待機(jī)指示燈--待機(jī)狀態(tài)常亮
- BEEP=0; //蜂鳴器,待機(jī)狀態(tài)不響
- Danger_Test(); //短路檢測
- Start_Measure(); //啟動測量
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
FDC2214_PCB.zip
(5.44 MB, 下載次數(shù): 99)
2020-10-18 20:32 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
Paper_Counter_V4.0.7z
(330.13 KB, 下載次數(shù): 105)
2020-10-19 04:55 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|