设为首页
收藏本站
开启辅助访问
登录
注册
只需一步,快速开始
首页
BBS
在线充值
搜索
工控币获得方法
联系方式
搜索
搜索
本版
帖子
用户
工控论坛
»
首页
›
电子技术
›
STM32/8
›
STM32+FDC2214的手势识别装置程序+原理图PCB文件 ...
返回列表
发新帖
STM32+FDC2214的手势识别装置程序+原理图PCB文件
[复制链接]
0
|
0
|
2020-5-19 00:59:20
|
显示全部楼层
|
阅读模式
用stm32做的手势识别装置,有原理图和pcb文件,2018年电赛D题。以下为FDC2214部分代码
Altium Designer画的原理图和PCB图如下:(附件中可下载工程文件)
pcb文件及其原理图.zip
(15.65 MB, 售价: 1 工控币)
2020-5-19 00:57 上传
点击文件名下载附件
STM32 FDC2214的手势识别程序源码.zip
(331.42 KB, 售价: 1 工控币)
2020-5-19 00:57 上传
点击文件名下载附件
部分stm32程序源码
#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);//先使能外设IO PORTC时钟
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); //根据设定参数初始化GPIO
GPIO_SetBits(GPIOC,GPIO_Pin_4|GPIO_Pin_5); //PC.4,PC.5 输出高
}
//产生IIC起始信号
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总线,准备发送或接收数据
}
//产生IIC停止信号
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;//发送I2C总线结束信号
FDC_IIC_Delay();
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 FDC_IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
FDC_SDA_IN(); //SDA设置为输入
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;//时钟输出0
return 0;
}
//产生ACK应答
//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;
}
//不产生ACK应答
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发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void FDC_IIC_Send_Byte(u8 txd)
{
u8 t;
FDC_SDA_OUT();
FDC_IIC_SCL=0;//拉低时钟开始数据传输
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个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 FDC_IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
FDC_SDA_IN();//SDA设置为输入
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();//发送nACK
else
FDC_IIC_Ack(); //发送ACK
return receive;
}
u8 Set_FDC2214(u8 reg,u8 MSB,u8 LSB)
{
FDC_IIC_Start();
FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|0);//发送器件地址+写命令
if(FDC_IIC_Wait_Ack()) //等待应答
{
FDC_IIC_Stop();
return 1;
}
FDC_IIC_Send_Byte(reg);//写寄存器地址
FDC_IIC_Wait_Ack(); //等待应答
FDC_IIC_Send_Byte(MSB); //发送数据1
if(FDC_IIC_Wait_Ack()) //等待ACK
{
FDC_IIC_Stop();
return 1;
}
FDC_IIC_Send_Byte(LSB); //发送数据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);//发送器件地址+写命令
FDC_IIC_Wait_Ack(); //等待应答
FDC_IIC_Send_Byte(reg); //写寄存器地址
FDC_IIC_Wait_Ack(); //等待应答
FDC_IIC_Start();
FDC_IIC_Send_Byte((FDC2214_ADDR<<1)|1);//发送器件地址+读命令
FDC_IIC_Wait_Ack(); //等待应答
res=FDC_IIC_Read_Byte(1)<<8;//读取数据,发送ACK
// FDC_IIC_Ack();
res|=FDC_IIC_Read_Byte(0);//读取数据,发送nACK
FDC_IIC_Stop(); //产生一个停止条件
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初始化函数
*返回值:0:初始化正常
* 1:不正常
*/
u8 FDC2214_Init(void)
{
u16 res,ID_FDC2214;
FDC_GPIO_Init();
FDC_IIC_Init();
res=FDC_Read(MANUFACTURER_ID);//测试设备读取是否正常
ID_FDC2214 = FDC_Read(DEVICE_ID);
printf("DEVICE_ID:0X%x\r\n",ID_FDC2214);
if(res==0x5449)
{
//设置Set_FDC2214寄存器
Set_FDC2214(RCOUNT_CH0,0x34,0xFB);//参考计数转换间隔时间(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);//转换之前的稳定时间(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(传感器时钟建立+转换时间的驱动电流)
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);//全部禁止错误汇报
Set_FDC2214(MUX_CONFIG,0xC2,0x0D);//通道0,1,2 ,3;选择10Mhz为超过振荡槽振荡频率的最低设置,多通道,四通道
Set_FDC2214(CONFIG,0x14,0x01);//激活模式,使用内部振荡器做参考频率,INTB引脚会随状态寄存器更新被置位
}
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);
}
复制代码
手势
,
fdc2214
,
pcb
,
stm32
,
手势识别
相关帖子
•
基于51单片机数字电压表 程序 原理图 pcb 详细设计文档
•
STM32+LabVIEW的USB数据采集与显示源程序
•
STM32示波器程序ILI9341_IO模拟源程序+Proteus仿真
•
STM32F407 FLAC软解压 源程序
•
用PROTEUS8.9仿真实现STM32 ADC一路连续转换,值显示在LCD12864上
•
Proteus实现stm32单片机的闪烁灯实验程序
•
STM32控制4个LED灯循环点亮源程序和Proteus仿真
•
STM32音频产生器Proteus仿真程序
•
用STM32F103C8T6去读取JY901的串口数据 源程序
•
基于STM32和ucos系统的室内环境检测源程序
回复
使用道具
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
路漫漫
194
主题
199
帖子
74
积分
初级会员
初级会员, 积分 74, 距离下一级还需 426 积分
初级会员, 积分 74, 距离下一级还需 426 积分
工控币
74
加好友
发消息
回复楼主
返回列表
电子技术综合讨论
单片机嵌入式
EDA设计仿真
STM32/8
51单片机
上位机开发及系统管理
Labview
Multisim仿真
图文推荐
用Fanuc Karel语言实现三点建坐标系
2021-01-04
用CH341A做的USB转SPI_232_485_TTL转换器 PCB+SCH文件 烧写器源
2020-12-14
51单片机采集温度通过串口发送到labview上位机采集曲线显示
2020-12-13
基于组态王的占空比PID算法温度控制系统设计 含源码和文档
2020-12-13
基于LabVIEW的电动车速度监测和控制系统上位机程序设计
2020-12-08
热门排行
1
HOLLiAS MACS V6.5.2用户组态手册
2
labview汽车仪表仿真vi
3
基于51单片机数字电压表 程序 原理图 pcb
4
谁有Simatic net v16的激活工具 EBK不行啊
5
西门子PLC电气设计与编程自学宝典双色版 [
6
西门子G120变频器精英训练营视频教程
7
博途TIA Portal V16+UPD1
8
西门子S7-200 SMART 精英训练营视频教程(5
9
HMI人机交互设计大师课程(七集)
10
有没有 GE plc PME9.0版本的中文对照表