久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
STM32+FDC2214測試代碼
[打印本頁]
作者:
1425879
時間:
2020-1-1 12:09
標(biāo)題:
STM32+FDC2214測試代碼
電賽FDC2214模塊的程序
單片機源程序如下:
#include "delay.h"
#include "sys.h"
#include "stdio.h"
#include "usart.h"
#include "timer.h"
#include "FDC2214.h"
void FDC2214_GetData(void);
u32 ch0,ch1,ch2,ch3;
u32 shujuchuli(u32 ch0)
{
u8 i;
u32 he=0;
for(i=0;i<=10;i++)
{
he=he+ch0;
}
return (he/10);
}
int main(void)
{
delay_init();//延時函數(shù)初始化
uart_init(9600);//串口初始化
TIM1_36Mhz_Init();//stm32定時器1輸出一個36mhz方波,作為fdc2214的時鐘。如果板載了40mhz的晶振,這個就不需要了。
IIC_Init();
FDC2214_Init();
while(1)
{
FDC2214_GetData();
printf("\r\nCH0~0(%d , %d , %d , %d)",ch0,ch1,ch2,shujuchuli(shujuchuli(shujuchuli(ch0))));
delay_ms(100); //延時300ms
}
}
void FDC2214_GetData(void)
{
FDC2214_GetChannelData(FDC2214_Channel_0, &ch0);
FDC2214_GetChannelData(FDC2214_Channel_1, &ch1);
FDC2214_GetChannelData(FDC2214_Channel_2, &ch2);
FDC2214_GetChannelData(FDC2214_Channel_3, &ch3);
}
復(fù)制代碼
#include "FDC2214.h"
#define PI 3.14159265358979323846
#define ClockFrequency 36000000 //時鐘頻率
uint8_t CHx_FIN_SEL[4];
double fREFx[4];
/*!
* @brief IIC寫FDC2214
* @param Slve_Addr 器件地址
* @param reg 寄存器
* @param data 數(shù)據(jù)
* @since v1.0
* Sample usage: FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, 0xFFFF);
*/
void FDC2214_Write16(uint8_t Slve_Addr, uint8_t reg, uint16_t data)
{
u8 dat;
IIC_Start();
IIC_Send_Byte(Slve_Addr << 1);
IIC_Wait_Ack();
IIC_Send_Byte(reg);
IIC_Wait_Ack();
dat=(data >> 8);
IIC_Send_Byte(dat);
IIC_Wait_Ack();
dat=data & 0xFF;
IIC_Send_Byte(dat);
IIC_Wait_Ack();
IIC_Stop();
}
/*!
* @brief IIC讀FDC2214
* @param Slve_Addr 器件地址
* @param reg 寄存器
* @return 寄存器值
* @since v1.0
* Sample usage: FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
*/
uint16_t FDC2214_Read16(uint8_t Slve_Addr, uint8_t reg)
{
uint16_t temp;
IIC_Start();
IIC_Send_Byte(Slve_Addr << 1);
IIC_Wait_Ack();
IIC_Send_Byte(reg);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte((Slve_Addr << 1) | 0x01);
IIC_Wait_Ack();
temp = (uint16_t)(IIC_Read_Byte(1) << 8);
temp |= IIC_Read_Byte(0);
IIC_Stop();
return temp;
}
/*!
* @brief 讀取FDC2214一個通道的轉(zhuǎn)換值
* @param channel 通道
* @param *data 讀取的數(shù)據(jù)
* @return 0:失敗;1:成功
* @since v1.0
* Sample usage: FDC2214_GetChannelData(FDC2214_Channel_0, &CH0_DATA);
*/
uint8_t FDC2214_GetChannelData(FDC2214_channel_t channel, uint32_t *data)
{
int16_t timeout = 100;
uint8_t dateReg_H;
uint8_t dateReg_L;
uint8_t bitUnreadConv;
uint16_t status;
uint32_t dataRead;
switch(channel)
{
case FDC2214_Channel_0:
dateReg_H = FDC2214_DATA_CH0;
dateReg_L = FDC2214_DATA_LSB_CH0;
bitUnreadConv = 0x0008;
break;
case FDC2214_Channel_1:
dateReg_H = FDC2214_DATA_CH1;
dateReg_L = FDC2214_DATA_LSB_CH1;
bitUnreadConv = 0x0004;
break;
case FDC2214_Channel_2:
dateReg_H = FDC2214_DATA_CH2;
dateReg_L = FDC2214_DATA_LSB_CH2;
bitUnreadConv = 0x0002;
break;
case FDC2214_Channel_3:
dateReg_H = FDC2214_DATA_CH3;
dateReg_L = FDC2214_DATA_LSB_CH3;
bitUnreadConv = 0x0001;
break;
}
status = FDC2214_Read16(FDC2214_Addr, FDC2214_STATUS);//讀取狀態(tài)寄存器的值
while(timeout && !(status & bitUnreadConv))//檢查是否有未讀數(shù)據(jù)
{
status = FDC2214_Read16(FDC2214_Addr, FDC2214_STATUS);
timeout--;
}
if(timeout)
{
dataRead = (uint32_t)(FDC2214_Read16(FDC2214_Addr, dateReg_H) << 16);
dataRead |= FDC2214_Read16(FDC2214_Addr, dateReg_L);
*data = dataRead;
return 1;
}
else
{
//超時
return 0;
}
}
/*!
* @brief 設(shè)置FDC2214一個通道的轉(zhuǎn)換時間,轉(zhuǎn)換時間(tCx)=(CHx_RCOUNT?16) / fREFx。
* @param channel 通道
* @param rcount CHx_RCOUNT
* @since v1.0
* Sample usage: FDC2214_SetRcount(FDC2214_Channel_0, 0x0FFF);
*/
void FDC2214_SetRcount(FDC2214_channel_t channel, uint16_t rcount)
{
if(rcount <= 0x00FF) return;
switch(channel)
{
case FDC2214_Channel_0:
FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH0, rcount);
break;
case FDC2214_Channel_1:
FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH1, rcount);
break;
case FDC2214_Channel_2:
FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH2, rcount);
break;
case FDC2214_Channel_3:
FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH3, rcount);
break;
}
}
/*!
* @brief 設(shè)置FDC2214一個通道的建立時間,使LC傳感器可以在通道x開始轉(zhuǎn)換之前穩(wěn)定下來,建立時間(tSx) = (CHx_SETTLECOUNT?16) ÷ fREFx。
CHx_SETTLECOUNT = 0x00, 0x01時(tSx) = 32 ÷ fREFx。
* @param channel 通道
* @param count CHx_SETTLECOUNT
* @since v1.0
* @note CHx_SETTLECOUNT > Vpk × fREFx × C × π^2 / (32 × IDRIVEX)
* Sample usage: FDC2214_SetSettleCount(FDC2214_Channel_0, 0x00FF);
*/
void FDC2214_SetSettleCount(FDC2214_channel_t channel, uint16_t count)
{
switch(channel)
{
case FDC2214_Channel_0:
FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH0, count);
break;
case FDC2214_Channel_1:
FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH1, count);
break;
case FDC2214_Channel_2:
FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH2, count);
break;
case FDC2214_Channel_3:
FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH3, count);
break;
}
}
/*!
* @brief 設(shè)置FDC2214一個通道的的時鐘頻率,
差分傳感器配置:
0x01 -- 傳感器頻率0.01MHz和8.75MHz
0x02 -- 傳感器頻率5MHz和10MHz
單端傳感器配置:
0x01 -- 傳感器頻率0.01MHz和10MHz
* @param channel 通道
* @param frequency_select 時鐘選擇
* @param divider 分頻器,fREFx = fCLK / CHx_FREF_DIVIDER,
* @note fREFx is > 4 × fSENSOR(外部LC振蕩器頻率)
* @since v1.0
* Sample usage: FDC2214_SetChannelClock(FDC2214_Channel_0, 0x01, 0xFF);
*/
void FDC2214_SetChannelClock(FDC2214_channel_t channel, uint8_t frequency_select, uint16_t divider)
{
uint16_t temp = 0;
temp = (uint16_t)(frequency_select << 12) | (divider & 0x03FF);
CHx_FIN_SEL[channel] = frequency_select;//記錄時鐘選擇
fREFx[channel] = (double)ClockFrequency / divider;//記錄時鐘頻率
switch(channel)
{
case FDC2214_Channel_0:
FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH0, temp);
break;
case FDC2214_Channel_1:
FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH1, temp);
break;
case FDC2214_Channel_2:
FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH2, temp);
break;
case FDC2214_Channel_3:
FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH3, temp);
break;
}
}
/*!
* @brief 配置INTB引腳中斷功能
* @param mode 1:開中斷;0:關(guān)中斷
* @since v1.0
* Sample usage: FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_025);
*/
void FDC2214_SetINTB(uint8_t mode)
{
uint16_t temp = 0;
temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
temp &= 0xFF7F;
if(mode)
temp |= 0x0080;
FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
temp = FDC2214_Read16(FDC2214_Addr, FDC2214_ERROR_CONFIG);
temp &= 0xFFFE;
if(mode)
temp |= 0x0001;
FDC2214_Write16(FDC2214_Addr, FDC2214_ERROR_CONFIG, temp);
}
/*!
* @brief 激活FDC2214的一個通道,單通道模式
* @param channel 通道
* @since v1.0
* Sample usage: FDC2214_SetActiveChannel(FDC2214_Channel_0);
*/
void FDC2214_SetActiveChannel(FDC2214_channel_t channel)
{
uint16_t temp = 0;
temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
temp &= 0x3FFF;
temp |= (uint16_t)(channel << 14);
FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
}
/*!
* @brief 設(shè)置FDC2214的工作模式:正常、睡眠。
* @param mode 0:正常工作;1:睡激活模式選擇。眠
* @since v1.0
* Sample usage: FDC2214_SetSleepMode(0);
*/
void FDC2214_SetSleepMode(uint8_t mode)
{
uint16_t temp = 0;
temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
temp &= 0xDFFF;
if(mode)temp |= 0x2000;
FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
}
/*!
* @brief FDC2214激活模式選擇。
* @param mode 0:全電流激活模式;1:低功率激活模式
* @since v1.0
* Sample usage: FDC2214_SetCurrentMode(1);
*/
void FDC2214_SetCurrentMode(uint8_t mode)
{
uint16_t temp = 0;
temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
temp &= 0xF7FF;
if(mode)
temp |= 0x800;
FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
}
/*!
* @brief 設(shè)置FDC2214時鐘源
* @param src 0:內(nèi)部時鐘源;1:外部時鐘源
* @since v1.0
* Sample usage: FDC2214_SetClockSource(1);
*/
void FDC2214_SetClockSource(uint8_t src)
{
uint16_t temp = 0;
temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
temp &= 0xFDFF;
if(src)
temp |= 0x200;
FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
}
/*!
* @brief 高電流傳感器驅(qū)動,只適用于單通道模式。
* @param mode 0:正常(最大1.5mA);1:高電流傳感器驅(qū)動(>1.5mA)
* @since v1.0
* Sample usage: FDC2214_SetHighCurrentMode(0);
*/
void FDC2214_SetHighCurrentMode(uint8_t mode)
{
uint16_t temp = 0;
temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
temp &= 0xFFBF;
if(mode)
temp |= 0x40;
FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
}
/*!
* @brief 設(shè)置FDC2214的MUX CONFIG寄存器
* @param autoscan 自動掃描模式 0:關(guān)閉,1:打開
* @param channels 自動掃描通道
* @param bandwidth 數(shù)字濾波器帶寬,大于外部LC振蕩器頻率
* @since v1.0
* Sample usage: FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1_2, FDC2214_Bandwidth_10M);
*/
void FDC2214_SetMUX_CONFIG(uint8_t autoscan, FDC2214_channel_sequence_t channels, FDC2214_filter_bandwidth_t bandwidth)
{
uint16_t temp = 0;
if(autoscan)
{
temp = (uint16_t)(autoscan << 15) | (channels << 13) | 0x0208 | bandwidth;
}
else
{
temp = 0x0208 | bandwidth;
}
FDC2214_Write16(FDC2214_Addr, FDC2214_MUX_CONFIG, temp);
}
/*!
* @brief 傳感器復(fù)位
* @since v1.0
* Sample usage: FDC2214_Reset();
*/
void FDC2214_Reset(void)
{
FDC2214_Write16(FDC2214_Addr, FDC2214_RESET_DEV, 0x8000);
}
/*!
* @brief 設(shè)置FDC2214的一個通道傳感器驅(qū)動電流,確保振蕩幅度在1.2V和1.8V之間。
* @param channel 通道
* @param current 電流大小
* @since v1.0
* Sample usage: FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_025);
*/
void FDC2214_SetDriveCurrent(FDC2214_channel_t channel, FDC2214_drive_current_t current)
{
uint16_t temp = 0;
temp = (uint16_t)(current << 11);
switch(channel)
{
case FDC2214_Channel_0:
FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH0, temp);
break;
case FDC2214_Channel_1:
FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH1, temp);
break;
case FDC2214_Channel_2:
FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH2, temp);
break;
case FDC2214_Channel_3:
FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH3, temp);
break;
}
}
/*!
* @brief 計算頻率
* @param channel 通道
* @param datax 讀取的轉(zhuǎn)換值
* @return 頻率,單位Hz
* @since v1.0
* Sample usage: FDC2214_CalculateFrequency(FDC2214_Channel_0, 0xFF);
*/
double FDC2214_CalculateFrequency(FDC2214_channel_t channel, uint32_t datax)
{
double frequency = 0.0;
frequency = (double)(CHx_FIN_SEL[channel] * fREFx[channel] * datax) / 268435456.0;//2^28
return frequency;
}
/*!
* @brief 計算外部電容大小
* @param frequency 頻率大小,單位Hz
* @param inductance 板載電感大小,單位uH
* @param capacitance 板載電容大小,單位pF
* @return 外部電容大小,單位pF
* @since v1.0
* Sample usage: FDC2214_CalculateCapacitance(FDC2214_Channel_0, 6000000, 18, 33);
*/
double FDC2214_CalculateCapacitance(double frequency, float inductance, float capacitance)
{
double cap = 0.0;
cap = (double)(1.0 / (inductance * (2 * PI * frequency) * (2 * PI * frequency)));
return cap;
}
/*!
* @brief FDC2214初始化函數(shù)
* @return 1:成功;0:失敗
* @since v1.0
* Sample usage: FDC2214_Init();
*/
uint8_t FDC2214_Init(void)
{
uint16_t deviceID = 0;
deviceID = FDC2214_Read16(FDC2214_Addr, FDC2214_DEVICE_ID);//讀器件ID
if(deviceID == FDC2214_ID)
{
printf("\r\nFDC2214 ID:%d",deviceID);
FDC2214_Reset();
FDC2214_SetRcount(FDC2214_Channel_0, 5000);//2000us 轉(zhuǎn)換周期
FDC2214_SetRcount(FDC2214_Channel_1, 5000);//2000us 轉(zhuǎn)換周期
FDC2214_SetRcount(FDC2214_Channel_2, 5000);//2000us 轉(zhuǎn)換周期
FDC2214_SetRcount(FDC2214_Channel_3, 5000);//2000us 轉(zhuǎn)換周期
FDC2214_SetSettleCount(FDC2214_Channel_0, 200);//200 cycles 等待時間
FDC2214_SetSettleCount(FDC2214_Channel_1, 200);//200 cycles 等待時間
FDC2214_SetSettleCount(FDC2214_Channel_2, 200);//200 cycles 等待時間
FDC2214_SetSettleCount(FDC2214_Channel_3, 200);//200 cycles 等待時間
FDC2214_SetChannelClock(FDC2214_Channel_0, 2, 1);//設(shè)置時鐘分頻,1分頻,40MHz
FDC2214_SetChannelClock(FDC2214_Channel_1, 2, 1);//設(shè)置時鐘分頻,1分頻,40MHz
FDC2214_SetChannelClock(FDC2214_Channel_2, 2, 1);//設(shè)置時鐘分頻,1分頻,40MHz
FDC2214_SetChannelClock(FDC2214_Channel_3, 2, 1);//設(shè)置時鐘分頻,1分頻,40MHz
FDC2214_SetINTB(0);//關(guān)閉INTB中斷
FDC2214_SetActiveChannel(FDC2214_Channel_0);//開啟通道0 (原來注釋)
FDC2214_SetCurrentMode(0);//全電流激活模式
FDC2214_SetClockSource(1);//外部時鐘源
FDC2214_SetHighCurrentMode(0);//正常電流傳感器驅(qū)動
FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1_2_3, FDC2214_Bandwidth_10M);//打開自動掃描,10MHz帶寬
FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_081);//通道0驅(qū)動電流0.081mA
FDC2214_SetDriveCurrent(FDC2214_Channel_1, FDC2214_Drive_Current_0_081);//通道1驅(qū)動電流0.081mA
FDC2214_SetDriveCurrent(FDC2214_Channel_2, FDC2214_Drive_Current_0_081);//通道2驅(qū)動電流0.081mA
FDC2214_SetDriveCurrent(FDC2214_Channel_3, FDC2214_Drive_Current_0_081);//通道3驅(qū)動電流0.081mA
FDC2214_SetSleepMode(0);//退出睡眠狀態(tài),開始工作
delay_ms(100);
return 1;
}
else
{
printf("\r\nFDC2214 Init Failed!!");
}
return 0;
}
復(fù)制代碼
所有資料51hei提供下載:
FDC2214測試代碼.7z
(191.77 KB, 下載次數(shù): 13)
2020-1-1 12:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久蜜桃av一区二区天堂
|
日韩一区二区三区在线视频
|
日韩欧美手机在线
|
国产高清精品网站
|
成人精品国产
|
亚洲一区中文字幕在线观看
|
国产区精品在线观看
|
天天插天天操
|
亚洲一区精品视频
|
天天天操
|
h肉视频
|
亚洲 欧美 在线 一区
|
国产视频一区在线
|
夏同学福利网
|
看av片网站
|
精品中文在线
|
亚洲高清在线观看
|
一区二区三区四区国产精品
|
www.中文字幕.com
|
国产一二区视频
|
亚洲喷水
|
黄色三级在线播放
|
久久久.com
|
亚洲大片一区
|
男人的天堂视频网站
|
日韩中文字幕一区
|
一区二区在线不卡
|
超碰成人免费
|
亚洲国产精品久久
|
免费看国产片在线观看
|
亚洲 精品 综合 精品 自拍
|
精品在线免费看
|
久久中文免费视频
|
国产精品视频一区二区三区
|
日本特黄a级高清免费大片 国产精品久久性
|
成人区一区二区三区
|
中文字幕一页二页
|
成人在线视频一区
|
日本不卡一区二区三区在线观看
|
中文久久
|
成人福利网站
|