|
用stm32做的手勢(shì)識(shí)別裝置,有原理圖和pcb文件,2018年電賽D題。以下為FDC2214部分代碼
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (68.83 KB, 下載次數(shù): 85)
下載附件
2020-5-17 14:25 上傳
51hei.png (75.07 KB, 下載次數(shù): 77)
下載附件
2020-5-17 14:25 上傳
51hei.png (6.6 KB, 下載次數(shù): 76)
下載附件
2020-5-17 14:26 上傳
STM32單片機(jī)源程序如下:
#include "fdc2214.h"
#include "delay.h"
u32 Data_FDC;
void FDC_IIC_Delay(void)
{
delay_us(2);
}
void FDC_GPIO_Init(void)
{
}
void FDC_IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//先使能外設(shè)IO PORTC時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;//端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIO
GPIO_SetBits(GPIOC,GPIO_Pin_4|GPIO_Pin_5); //PC.4,PC.5 輸出高
}
//產(chǎn)生IIC起始信號(hào)
void FDC_IIC_Start(void)
{
FDC_SDA_OUT(); //sda線輸出
FDC_IIC_SDA=1;
FDC_IIC_SCL=1;
FDC_IIC_Delay();
FDC_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
FDC_IIC_Delay();
FDC_IIC_SCL=0;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
}
//產(chǎn)生IIC停止信號(hào)
void FDC_IIC_Stop(void)
{
FDC_SDA_OUT();//sda線輸出
FDC_IIC_SCL=0;
FDC_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
FDC_IIC_Delay();
FDC_IIC_SCL=1;
FDC_IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號(hào)
FDC_IIC_Delay();
}
//等待應(yīng)答信號(hào)到來
//返回值:1,接收應(yīng)答失敗
// 0,接收應(yīng)答成功
u8 FDC_IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
FDC_SDA_IN(); //SDA設(shè)置為輸入
FDC_IIC_SDA=1;FDC_IIC_Delay();
FDC_IIC_SCL=1;FDC_IIC_Delay();
while(FDC_READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
FDC_IIC_Stop();
return 1;
}
}
FDC_IIC_SCL=0;//時(shí)鐘輸出0
return 0;
}
//產(chǎn)生ACK應(yīng)答
//void FDC_IIC_Ack(void)
//{
// FDC_IIC_SCL=0;
// FDC_SDA_OUT();
// FDC_IIC_SDA=0;
// FDC_IIC_Delay();
// FDC_IIC_SCL=1;
// FDC_IIC_Delay();
// FDC_IIC_SCL=0;
//}
//debug
void FDC_IIC_Ack(void)
{
FDC_IIC_SCL=0;
FDC_IIC_SDA=0;
FDC_IIC_Delay();
FDC_IIC_SCL=1;
FDC_IIC_Delay();
FDC_IIC_SCL=0;
FDC_IIC_Delay();
FDC_IIC_SDA=1;
}
//不產(chǎn)生ACK應(yīng)答
void FDC_IIC_NAck(void)
{
FDC_IIC_SCL=0;
FDC_SDA_OUT();
FDC_IIC_SDA=1;
FDC_IIC_Delay();
FDC_IIC_SCL=1;
FDC_IIC_Delay();
FDC_IIC_SCL=0;
}
//IIC發(fā)送一個(gè)字節(jié)
//返回從機(jī)有無應(yīng)答
//1,有應(yīng)答
//0,無應(yīng)答
void FDC_IIC_Send_Byte(u8 txd)
{
u8 t;
FDC_SDA_OUT();
FDC_IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸
for(t=0;t<8;t++)
{
FDC_IIC_SDA=(txd&0x80)>>7;
txd<<=1;
FDC_IIC_SCL=1;
FDC_IIC_Delay();
FDC_IIC_SCL=0;
FDC_IIC_Delay();
}
}
//讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK
u8 FDC_IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
FDC_SDA_IN();//SDA設(shè)置為輸入
for(i=0;i<8;i++ )
{
FDC_IIC_SCL=0;
FDC_IIC_Delay();
FDC_IIC_SCL=1;
receive<<=1;
if(FDC_READ_SDA)receive++;
FDC_IIC_Delay();
}
if (!ack)
FDC_IIC_NAck();//發(fā)送nACK
else
FDC_IIC_Ack(); //發(fā)送ACK
return receive;
}
u8 Set_FDC2214(u8 reg,u8 MSB,u8 LSB)
{
FDC_IIC_Start();
FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|0);//發(fā)送器件地址+寫命令
if(FDC_IIC_Wait_Ack()) //等待應(yīng)答
{
FDC_IIC_Stop();
return 1;
}
FDC_IIC_Send_Byte(reg);//寫寄存器地址
FDC_IIC_Wait_Ack(); //等待應(yīng)答
FDC_IIC_Send_Byte(MSB); //發(fā)送數(shù)據(jù)1
if(FDC_IIC_Wait_Ack()) //等待ACK
{
FDC_IIC_Stop();
return 1;
}
FDC_IIC_Send_Byte(LSB); //發(fā)送數(shù)據(jù)2
if(FDC_IIC_Wait_Ack()) //等待ACK
{
FDC_IIC_Stop();
return 1;
}
FDC_IIC_Stop();
return 0;
}
u16 FDC_Read(u8 reg)
{
u16 res;
FDC_IIC_Start();
FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|0);//發(fā)送器件地址+寫命令
FDC_IIC_Wait_Ack(); //等待應(yīng)答
FDC_IIC_Send_Byte(reg); //寫寄存器地址
FDC_IIC_Wait_Ack(); //等待應(yīng)答
FDC_IIC_Start();
FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|1);//發(fā)送器件地址+讀命令
FDC_IIC_Wait_Ack(); //等待應(yīng)答
res=FDC_IIC_Read_Byte(1)<<8;//讀取數(shù)據(jù),發(fā)送ACK
// FDC_IIC_Ack();
res|=FDC_IIC_Read_Byte(0);//讀取數(shù)據(jù),發(fā)送nACK
FDC_IIC_Stop(); //產(chǎn)生一個(gè)停止條件
return res;
}
u32 FCD2214_ReadCH(u8 index)
{
u32 result;
switch(index)
{
case 0:
result = FDC_Read(DATA_CH0)&0x0FFF;
result = (result<<16)|(FDC_Read(DATA_LSB_CH0));
break;
case 1:
result = FDC_Read(DATA_CH1)&0x0FFF;
result = (result<<16)|(FDC_Read(DATA_LSB_CH1));
break;
case 2:
result = FDC_Read(DATA_CH2)&0x0FFF;
result = (result<<16)|(FDC_Read(DATA_LSB_CH2));
break;
case 3:
result = FDC_Read(DATA_CH3)&0x0FFF;
result = (result<<16)|(FDC_Read(DATA_LSB_CH3));
break;
default:break;
}
result =result&0x0FFFFFFF;
return result;
}
/*FDC2214初始化函數(shù)
*返回值:0:初始化正常
* 1:不正常
*/
u8 FDC2214_Init(void)
{
u16 res,ID_FDC2214;
FDC_GPIO_Init();
FDC_IIC_Init();
res=FDC_Read(MANUFACTURER_ID);//測試設(shè)備讀取是否正常
ID_FDC2214 = FDC_Read(DEVICE_ID);
printf("DEVICE_ID:0X%x\r\n",ID_FDC2214);
if(res==0x5449)
{
//設(shè)置Set_FDC2214寄存器
Set_FDC2214(RCOUNT_CH0,0x34,0xFB);//參考計(jì)數(shù)轉(zhuǎn)換間隔時(shí)間(T=(RCOUNT_CH0*16)/Frefx)
Set_FDC2214(RCOUNT_CH1,0x34,0xFB);
Set_FDC2214(RCOUNT_CH2,0x34,0xFB);
Set_FDC2214(RCOUNT_CH3,0x34,0xFB);
Set_FDC2214(SETTLECOUNT_CH0,0x00,0x1B);//轉(zhuǎn)換之前的穩(wěn)定時(shí)間(T=(SETTLECOUNT_CHx*16)/Frefx)
Set_FDC2214(SETTLECOUNT_CH1,0x00,0x1B);
Set_FDC2214(SETTLECOUNT_CH2,0x00,0x1B);
Set_FDC2214(SETTLECOUNT_CH3,0x00,0x1B);
Set_FDC2214(CLOCK_DIVIDERS_C_CH0,0x20,0x02);//選擇在0.01MHz ~ 10MHz的傳感器頻率
Set_FDC2214(CLOCK_DIVIDERS_C_CH1,0x20,0x02);//Frefx = Fclk = 43.4MHz/2(2分頻)
Set_FDC2214(CLOCK_DIVIDERS_C_CH2,0x20,0x02);//CHx_REF_DIVIDER=2;CHx_FIN_SEL=2
Set_FDC2214(CLOCK_DIVIDERS_C_CH3,0x20,0x02);//CHx_REF_DIVIDER=2;CHx_FIN_SEL=2
Set_FDC2214(DRIVE_CURRENT_CH0,0x78,0x00);//0.146ma(傳感器時(shí)鐘建立+轉(zhuǎn)換時(shí)間的驅(qū)動(dòng)電流)
Set_FDC2214(DRIVE_CURRENT_CH1,0x78,0x00);
Set_FDC2214(DRIVE_CURRENT_CH2,0x78,0x00);
Set_FDC2214(DRIVE_CURRENT_CH3,0x78,0x00);
Set_FDC2214(ERROR_CONFIG,0x00,0x00);//全部禁止錯(cuò)誤匯報(bào)
Set_FDC2214(MUX_CONFIG,0xC2,0x0D);//通道0,1,2 ,3;選擇10Mhz為超過振蕩槽振蕩頻率的最低設(shè)置,多通道,四通道
Set_FDC2214(CONFIG,0x14,0x01);//激活模式,使用內(nèi)部振蕩器做參考頻率,INTB引腳會(huì)隨狀態(tài)寄存器更新被置位
}
else return 1;
return 0;
}
float Cap_Calculate(u8 chx)
{
float Cap;
Data_FDC = FCD2214_ReadCH(chx);
Cap = 232021045.248/(Data_FDC);
return (Cap*Cap);
}
全部資料51hei下載地址:
pcb文件及其原理圖.zip
(15.65 MB, 下載次數(shù): 83)
2020-5-16 17:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
32程序.7z
(209.22 KB, 下載次數(shù): 99)
2020-5-17 14:26 上傳
點(diǎn)擊文件名下載附件
程序 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|