久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5156|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

STM32+FDC2214的手勢(shì)識(shí)別裝置程序+原理圖PCB文件

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
用stm32做的手勢(shì)識(shí)別裝置,有原理圖和pcb文件,2018年電賽D題。以下為FDC2214部分代碼
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


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)
32程序.7z (209.22 KB, 下載次數(shù): 99)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:851665 發(fā)表于 2021-7-15 14:55 | 只看該作者
你好,請(qǐng)問有實(shí)物圖嗎?因?yàn)椴恢酪檬裁丛骷?br />
回復(fù)

使用道具 舉報(bào)

板凳
ID:1051480 發(fā)表于 2022-11-11 17:46 | 只看該作者
你好,為什么我這個(gè)初始化,讀取的id一直是0xffff,我焊接的都沒啥問題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕亚洲一区二区三区 | 欧美精品在线一区二区三区 | 亚洲精品国产综合区久久久久久久 | 一级二级三级在线观看 | 欧美日韩专区 | 国产精品久久av | 国产精品日韩欧美一区二区 | 一区二区中文字幕 | 正在播放国产精品 | 欧产日产国产精品视频 | 国产二区视频 | 国产精品美女视频 | 国产免费又色又爽又黄在线观看 | 999精品视频 | 国产精品免费一区二区三区 | 一级a爱片久久毛片 | 欧美一区二区在线播放 | 日韩中文在线观看 | 国产一区91精品张津瑜 | 欧美大片一区二区 | 成人免费视频在线观看 | 日韩欧美在线视频 | 久久中文字幕一区 | 国产成人99久久亚洲综合精品 | 久久国产精品视频 | 狠狠骚| 国产精品成av人在线视午夜片 | 99精品国产一区二区三区 | 精品日韩在线观看 | 国产精品一区一区 | 婷婷丁香在线视频 | 久久久福利 | 日韩精品成人一区二区三区视频 | 久久视频免费看 | 日韩av一区二区在线观看 | 视频一区二区三区在线观看 | 91精品欧美久久久久久久 | 久久国产三级 | 亚洲欧美日韩电影 | 国产农村妇女毛片精品久久麻豆 | 国产精品一区二区av |