chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux驅(qū)動(dòng)開發(fā)-編寫MMA7660三軸加速度傳感器

DS小龍哥-嵌入式技術(shù) ? 2022-09-17 15:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【摘要】 通過(guò)MMA7660可以做出很多項(xiàng)目: 比如: 老人防跌倒手環(huán)、自行車自動(dòng)剎車燈,智能鬧鐘,烤火爐跌倒自動(dòng)斷電、運(yùn)動(dòng)手環(huán)等等。 這篇文章就介紹如何在Linux下編寫MMA7660三軸加速度芯片的驅(qū)動(dòng),讀取當(dāng)前芯片的方向姿態(tài),得到X,Y,Z三個(gè)軸的數(shù)據(jù)。MMA7660是IIC接口的,當(dāng)前驅(qū)動(dòng)就采用標(biāo)準(zhǔn)的IIC子系統(tǒng)編寫驅(qū)動(dòng),使用字符設(shè)備框架將得到的數(shù)據(jù)上傳遞給應(yīng)用層。

1. MMA7660芯片介紹

MMA7660FC 是 ± 1.5 克的三軸數(shù)字輸出、超低功率、緊湊型電容式微電機(jī)的三軸加速度計(jì),是非常低功耗,小型容性 MEMS傳感器。具有低通濾波器,用于偏移和增益誤差補(bǔ)償, 以及用戶可配置的轉(zhuǎn)換成 6 位分辨率,用戶可配置輸出速率等功能。MMA7660芯片可以通過(guò)中斷引腳(INT)向外通知傳感器數(shù)據(jù)變化、方向、姿態(tài)識(shí)別等信息。模擬工作電壓范圍是 2.4V 至 3.6V,數(shù)字工作電壓范圍是 1.71V 到 3.6V 。常用在手機(jī)、掌上電腦、車載導(dǎo)航,便攜式電腦的防盜,自動(dòng)自行車剎車燈、運(yùn)動(dòng)檢測(cè)手環(huán)、數(shù)碼機(jī)、自動(dòng)叫醒鬧鐘里等等。

特別是計(jì)步的功能是現(xiàn)在最常見,不管是智能手環(huán)、還是手機(jī)都帶有三軸加速度計(jì),可以記錄每天的步數(shù),計(jì)算運(yùn)動(dòng)量等。現(xiàn)在很多的不倒翁,無(wú)人機(jī)、相機(jī)云臺(tái),很多常見的產(chǎn)品里都能看到三軸加速計(jì)的身影。

通過(guò)MMA7660可以做出很多項(xiàng)目: 比如: 老人防跌倒手環(huán)、自行車自動(dòng)剎車燈,智能鬧鐘,烤火爐跌倒自動(dòng)斷電、運(yùn)動(dòng)手環(huán)等等。

這篇文章就介紹如何在Linux下編寫MMA7660三軸加速度芯片的驅(qū)動(dòng),讀取當(dāng)前芯片的方向姿態(tài),得到X,Y,Z三個(gè)軸的數(shù)據(jù)。MMA7660是IIC接口的,當(dāng)前驅(qū)動(dòng)就采用標(biāo)準(zhǔn)的IIC子系統(tǒng)編寫驅(qū)動(dòng),使用字符設(shè)備框架將得到的數(shù)據(jù)上傳遞給應(yīng)用層。

image-20220108211859294image-20220108211941645

2. 硬件連線

當(dāng)前使用的開發(fā)板是友善之臂Tiny4412開發(fā)板,使用三星EXYNOS4412芯片,板子本身自帶了一顆MMA7660芯片,芯片的原理圖如下:

image-20220108211848037image-20220108211911111

內(nèi)核本身有MMA7660的驅(qū)動(dòng),下面是源碼的路徑:

image-20220108212008898image-20220108212025997image-20220108212036925

如果加載自己編寫的驅(qū)動(dòng),還需要去掉原來(lái)內(nèi)核自帶的驅(qū)動(dòng),不然無(wú)法匹配。

Device Drivers  --->
	<*> Hardware Monitoring support  --->  
        <*>   Freescale MMA7660 Accelerometer   (將*號(hào)去掉,編譯內(nèi)核、燒寫內(nèi)核即可)
image-20220108212133903

3. 源代碼

3.1 mma7660設(shè)備端代碼: IIC子系統(tǒng)

#include 
#include 
#include 
#include 
#include 
#include 
#include 

static struct i2c_client *i2cClient = NULL;

static unsigned short  i2c_addr_list[]= {0x4c, I2C_CLIENT_END};/*地址隊(duì)列*/

/*
1. 獲取控制器(總線)
2. 探測(cè)設(shè)備是否存在
3. 定義一個(gè)名字用于找到驅(qū)動(dòng)端
 */
static int __init mma7660_dev_init(void)
{
	/*mach-tiny4412.c*/
	struct i2c_adapter *i2c_adap=NULL;  /*獲取到的總線存放在這個(gè)結(jié)構(gòu)體*/
	struct i2c_board_info i2c_info;     /*設(shè)備描述結(jié)構(gòu)體,里面存放著設(shè)備的名字還有地址*/

	/*1. 獲取IIC控制器*/
	i2c_adap = i2c_get_adapter(3);     /*要使用IIC_3號(hào)總線*/
	if(!i2c_adap)
	{
		printk("獲取IIC控制器信息失敗!\n");
		return -1;
	}
	
	memset(&i2c_info,0,sizeof(struct i2c_board_info));      	/*清空結(jié)構(gòu)體*/
	strlcpy(i2c_info.type,"mma7660_drv",I2C_NAME_SIZE);    /*名稱的賦值*/
	i2c_info.irq=EXYNOS4_GPX3(1); /*中斷IO口*/

	/*2. 創(chuàng)建IIC設(shè)備客戶端*/
	i2cClient = i2c_new_probed_device(i2c_adap,&i2c_info,i2c_addr_list,NULL);
	if(!i2cClient)
	{
		printk("mma7660_探測(cè)地址出現(xiàn)錯(cuò)誤!!\n");
		return -1;
	}

	i2c_put_adapter(i2c_adap);/*設(shè)置模塊使用計(jì)數(shù)*/
	
	printk("mma7660_dev_init!!\n");
	return 0;
}
static void __exit mma7660_dev_exit(void)//平臺(tái)設(shè)備端的出口函數(shù)
{
	printk(" mma7660_dev_exit ok!!\n");

	/*注銷設(shè)備*/
	i2c_unregister_device(i2cClient);

	/*釋放*/
	i2c_release_client(i2cClient);
}
module_init(mma7660_dev_init);
module_exit(mma7660_dev_exit);
MODULE_LICENSE("GPL");

3.2 mma7660驅(qū)動(dòng)端代碼: IIC子系統(tǒng)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/* MMA7760 Registers */
#define MMA7660_XOUT			0x00	// 6-bit output value X
#define MMA7660_YOUT			0x01	// 6-bit output value Y
#define MMA7660_ZOUT			0x02	// 6-bit output value Z
#define MMA7660_TILT			0x03	// Tilt status
#define MMA7660_SRST			0x04	// Sampling Rate Status
#define MMA7660_SPCNT			0x05	// Sleep Count
#define MMA7660_INTSU			0x06	// Interrupt Setup
#define MMA7660_MODE			0x07	// Mode
#define MMA7660_SR				0x08	// Auto-Wake/Sleep and Debounce Filter
#define MMA7660_PDET			0x09	// Tap Detection
#define MMA7660_PD				0x0a	// Tap Debounce Count

static const struct i2c_device_id mma7660_id[] =
{
	{"mma7660_drv",0}, /*設(shè)備端的名字,0表示不需要私有數(shù)據(jù)*/
	{}
};
static u32 mma7660_irq; /*觸摸屏的中斷編號(hào)*/
static struct i2c_client *mma7660_client=NULL;
static int	last_tilt = 0;

#define __need_retry(__v)	(__v & (1 << 6))
#define __is_negative(__v)	(__v & (1 << 5))

static const char *mma7660_bafro[] = {
	"未知", "前面", "背面"
};

static const char *mma7660_pola[] = {
	"未知",
	"左面", "向右",
	"保留", "保留",
	"向下", "向上",
	"保留",
};

/*
函數(shù)功能:讀取一個(gè)字節(jié)的數(shù)據(jù)
*/
static int mma7660_read_tilt(struct i2c_client *client, int *tilt)
{
	int val;
	do {
		val = i2c_smbus_read_byte_data(client, MMA7660_TILT);
	} while (__need_retry(val));
	*tilt = (val & 0xff);
	return 0;
}
/*
函數(shù)功能: 讀取XYZ坐標(biāo)數(shù)據(jù)
*/
static int mma7660_read_xyz(struct i2c_client *client, int idx, int *xyz)
{
	int val;
	do {
		val = i2c_smbus_read_byte_data(client, idx + MMA7660_XOUT);
	} while (__need_retry(val));
	*xyz = __is_negative(val) ? (val | ~0x3f) : (val & 0x3f);
	return 0;
}
/*
工作隊(duì)列處理函數(shù)
*/
static void mma7660_worker(struct work_struct *work)
{
	int bafro, pola, shake, tap;
	int val = 0;

	mma7660_read_tilt(mma7660_client,&val);

	/* TODO: report it ? */
	bafro = val & 0x03;
	if (bafro != (last_tilt & 0x03)) {
		printk("%s\n", mma7660_bafro[bafro]);
	}

	pola = (val >> 2) & 0x07;
	if (pola != ((last_tilt >> 2) & 0x07)) {
		printk("%s\n", mma7660_pola[pola]);
	}

	shake = (val >> 5) & 0x01;
	if (shake && shake != ((last_tilt >> 5) & 0x01)) {
		printk("Shake\n");
	}

	tap = (val >> 7) & 0x01;
	if (tap && tap != ((last_tilt >> 7) & 0x01)) {
		printk("Tap\n");
	}

	/* Save current status */
	last_tilt = val;
	
	int axis[3];
	int i;
	for (i = 0; i < 3; i++)
	{
		mma7660_read_xyz(mma7660_client, i, &axis[i]);
	}
	printk("ABS_X=%d\n",axis[0]);
	printk("ABS_Y=%d\n",axis[1]);
	printk("ABS_Z=%d\n",axis[2]);
}
/*
函數(shù)功能: mma7660初始化
*/
static int mma7660_initialize(struct i2c_client *client)
{
	int val;

	/* Using test mode to probe chip */
	i2c_smbus_write_byte_data(client, MMA7660_MODE, 0x00);
	mdelay(10);
	i2c_smbus_write_byte_data(client, MMA7660_MODE, 0x04);
	mdelay(10);
	i2c_smbus_write_byte_data(client, MMA7660_XOUT, 0x3f);
	i2c_smbus_write_byte_data(client, MMA7660_YOUT, 0x01);
	i2c_smbus_write_byte_data(client, MMA7660_ZOUT, 0x15);
	val = i2c_smbus_read_byte_data(client, MMA7660_ZOUT);
	if (val != 0x15) {
		dev_err(&client->dev, "no device\n");
		return -ENODEV;
	}

	/* Goto standby mode for configuration */
	i2c_smbus_write_byte_data(client, MMA7660_MODE, 0x00);
	mdelay(10);

	/* Sample rate: 64Hz / 16Hz; Filt: 3 samples  */
	i2c_smbus_write_byte_data(client, MMA7660_SR, ((2<<5) | (1<<3) | 1));

	/* Sleep count */
	i2c_smbus_write_byte_data(client, MMA7660_SPCNT, 0xA0);

	/* Tap detect and debounce ~4ms */
	i2c_smbus_write_byte_data(client, MMA7660_PDET, 4);
	i2c_smbus_write_byte_data(client, MMA7660_PD, 15);

	/* Enable interrupt except exiting Auto-Sleep */
	i2c_smbus_write_byte_data(client, MMA7660_INTSU, 0xe7);

	/* IPP, Auto-wake, auto-sleep and standby */
	i2c_smbus_write_byte_data(client, MMA7660_MODE, 0x59);
	mdelay(10);

	/* Save current tilt status */
	mma7660_read_tilt(client, &last_tilt);

	mma7660_client = client;
	return 0;
}
/*
靜態(tài)方式初始化工作隊(duì)列
*/
DECLARE_WORK(mma7660_work,mma7660_worker);
static irqreturn_t mma7660_interrupt(int irq, void *dev_id)
{
	/*調(diào)度共享工作隊(duì)列*/
	schedule_work(&mma7660_work);
	return IRQ_HANDLED;
}
/*
匹配成功時(shí)調(diào)用
*/
static int mma7660_probe(struct i2c_client *client, const struct i2c_device_id *device_id)
{
	printk("mma7660_probe!!!\n");
	printk("驅(qū)動(dòng)端IIC匹配的地址=0x%x\n",client->addr);
	
	mma7660_client=client;
	
	/*1. 注冊(cè)中斷*/
	mma7660_irq=gpio_to_irq(client->irq);/*獲取中斷編號(hào)*/
    if(request_irq(mma7660_irq,mma7660_interrupt,IRQF_TRIGGER_FALLING,"mma7660_irq",NULL)!=0)
    {
		printk("mma7660_中斷注冊(cè)失敗!\n");
	}
	
	/*2. 初始化mma7660*/
	if(mma7660_initialize(client) < 0)
	{
		printk(" 初始化mma7660失敗!\n");
	}
    return 0;
}
static int mma7660_remove(struct i2c_client *client)
{
	free_irq(mma7660_irq,NULL);
	printk("mma7660_remove!!!\n");
	return 0;
}
struct i2c_driver i2c_drv =
{
	.driver =
	{
		.name = "mma7660",
		.owner = THIS_MODULE,
	},	
	.probe = mma7660_probe,   //探測(cè)函數(shù)
	.remove = mma7660_remove, //資源卸載
	.id_table = mma7660_id,   //里面有一個(gè)名字的參數(shù)用來(lái)匹配設(shè)備端名字
};
static int __init mma7660_drv_init(void)
{
	/*向iic總線注冊(cè)一個(gè)驅(qū)動(dòng)*/
	i2c_add_driver(&i2c_drv);
	return 0;
}

static void __exit mma7660_drv_exit(void)
{
	/*從iic總線注銷一個(gè)驅(qū)動(dòng)*/
	i2c_del_driver(&i2c_drv);
}

module_init(mma7660_drv_init);
module_exit(mma7660_drv_exit);
MODULE_LICENSE("GPL");
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11710

    瀏覽量

    218692
  • 加速度傳感器
    +關(guān)注

    關(guān)注

    12

    文章

    492

    瀏覽量

    56548
  • mma7660
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    7486
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    TDK InvenSense IAM - 20381HT:高性能汽車級(jí)加速度計(jì)的卓越之選

    TDK InvenSense IAM - 20381HT:高性能汽車級(jí)加速度計(jì)的卓越之選 在汽車電子領(lǐng)域,對(duì)于高性能、小尺寸且功能豐富的傳感器需求日益增長(zhǎng)。TDK InvenSen
    的頭像 發(fā)表于 12-25 17:15 ?504次閱讀

    TDK InvenSense ICM - 42370 - P:高性能加速度計(jì)的深度剖析

    TDK InvenSense ICM - 42370 - P:高性能加速度計(jì)的深度剖析 在當(dāng)今的電子設(shè)備設(shè)計(jì)領(lǐng)域,高性能、低功耗的傳感器需求日益增長(zhǎng)。TDK InvenSense的
    的頭像 發(fā)表于 12-25 17:10 ?420次閱讀

    探索NXP FXLS8964AF 3低g加速度計(jì):特性、應(yīng)用與設(shè)計(jì)要點(diǎn)

    探索NXP FXLS8964AF 3低g加速度計(jì):特性、應(yīng)用與設(shè)計(jì)要點(diǎn) 在汽車電子領(lǐng)域,對(duì)于高性能、低功耗的傳感器需求日益增長(zhǎng)。NXP的FXLS8964AF 3低g
    的頭像 發(fā)表于 12-25 10:20 ?320次閱讀

    深入解析FXLS8961AF:汽車應(yīng)用中的3低g加速度計(jì)

    深入解析FXLS8961AF:汽車應(yīng)用中的3低g加速度計(jì) 在汽車電子領(lǐng)域,傳感器技術(shù)的發(fā)展日新月異。其中,3加速度計(jì)在汽車安全和便利性應(yīng)
    的頭像 發(fā)表于 12-24 13:55 ?297次閱讀

    883M數(shù)字MEMS加速度計(jì)和溫度傳感器技術(shù)解析

    在電子工程領(lǐng)域,傳感器的性能和特性對(duì)于系統(tǒng)設(shè)計(jì)至關(guān)重要。今天我們來(lái)詳細(xì)解析一下883M數(shù)字MEMS加速度計(jì)和溫度傳感器的相關(guān)技術(shù)規(guī)格。
    的頭像 發(fā)表于 12-09 15:47 ?455次閱讀
    883M數(shù)字<b class='flag-5'>三</b><b class='flag-5'>軸</b>MEMS<b class='flag-5'>加速度</b>計(jì)和溫度<b class='flag-5'>傳感器</b>技術(shù)解析

    mems加速度傳感器都有哪些類型?這種mems加速度計(jì)各有什么利弊?

    MEMS加速度計(jì)是近年來(lái)發(fā)展起來(lái)的一種新型加速度計(jì)。它使用振動(dòng)梁作為加速度傳感器。振動(dòng)梁由硅或石英晶體材料制成,并通過(guò)靜電或壓電作用以共振頻率振動(dòng)。雙端梁以振動(dòng)
    的頭像 發(fā)表于 10-22 15:04 ?498次閱讀

    【技術(shù)】如何正確理解加速度傳感器頻率響應(yīng)特性?

    加速度傳感器的各項(xiàng)指標(biāo)中,頻率響應(yīng)是個(gè)非常重要的參數(shù),它是傳感器提供線性反應(yīng)的頻率范圍。本文著重從頻率響應(yīng)出發(fā)帶領(lǐng)大家更深入了解加速度傳感器
    的頭像 發(fā)表于 10-22 12:11 ?953次閱讀
    【技術(shù)】如何正確理解<b class='flag-5'>加速度</b><b class='flag-5'>傳感器</b>頻率響應(yīng)特性?

    加速度傳感器需要考慮的五大因素

    在嚴(yán)苛和復(fù)雜的環(huán)境中研究、開發(fā)和測(cè)試產(chǎn)品時(shí),加速度傳感器能夠提供寶貴的數(shù)據(jù)。但在某些行業(yè),采集數(shù)據(jù)(特別是高g值下的測(cè)量)可能比較困難。因?yàn)?b class='flag-5'>加速度
    的頭像 發(fā)表于 10-20 14:14 ?404次閱讀
    <b class='flag-5'>加速度</b><b class='flag-5'>傳感器</b>需要考慮的五大因素

    沖擊加速度傳感器462系列:精準(zhǔn)捕捉極端環(huán)境下的動(dòng)態(tài)沖擊--森瑟科技

    在工業(yè)測(cè)試、運(yùn)動(dòng)學(xué)研究和爆炸沖擊監(jiān)測(cè)等領(lǐng)域,對(duì)高g值沖擊加速度的精確測(cè)量至關(guān)重要。Senther推出的462系列沖擊加速度傳感器,憑借其
    的頭像 發(fā)表于 09-22 16:22 ?1131次閱讀
    <b class='flag-5'>三</b><b class='flag-5'>軸</b>沖擊<b class='flag-5'>加速度</b><b class='flag-5'>傳感器</b>462系列:精準(zhǔn)捕捉極端環(huán)境下的動(dòng)態(tài)沖擊--森瑟科技

    Murata加速度傳感器的FAQ

    Q:加速度傳感器與傾斜傳感器有何區(qū)別?A:Murata的傾斜傳感器加速度傳感器,都以相同的ME
    的頭像 發(fā)表于 09-10 12:02 ?729次閱讀
    Murata<b class='flag-5'>加速度</b><b class='flag-5'>傳感器</b>的FAQ

    如何利用加速度傳感器測(cè)量頻率

    在當(dāng)代社會(huì),技術(shù)的飛速發(fā)展猶如一道閃電,照亮了各行各業(yè)的發(fā)展之路。無(wú)線加速度傳感器,、在眾多領(lǐng)域中發(fā)揮著不可或缺的關(guān)鍵作用。在工業(yè)自動(dòng)化的領(lǐng)域,這些
    的頭像 發(fā)表于 08-04 08:45 ?566次閱讀
    如何利用<b class='flag-5'>三</b><b class='flag-5'>軸</b><b class='flag-5'>加速度</b><b class='flag-5'>傳感器</b>測(cè)量頻率

    貿(mào)澤開售提供精確工業(yè)狀態(tài)監(jiān)測(cè)維護(hù)的 Amphenol Wilcoxon 883M數(shù)字MEMS加速度計(jì)

    數(shù)字微機(jī)電系統(tǒng)?(MEMS) 加速度計(jì)。該高精度傳感器可為狀態(tài)監(jiān)測(cè)維護(hù)和故障診斷提供全面的振動(dòng)分析。883M MEMS加速度計(jì)專為旋轉(zhuǎn)機(jī)
    的頭像 發(fā)表于 07-23 16:13 ?1526次閱讀
    貿(mào)澤開售提供精確工業(yè)狀態(tài)監(jiān)測(cè)維護(hù)的 Amphenol Wilcoxon 883M數(shù)字<b class='flag-5'>三</b><b class='flag-5'>軸</b>MEMS<b class='flag-5'>加速度</b>計(jì)

    加速度傳感器的應(yīng)用與選購(gòu)技巧

    加速度傳感器是一種能夠測(cè)量加速力的電子設(shè)備,其核心工作原理基于牛頓的第二運(yùn)動(dòng)定律。當(dāng)傳感器感受到外部加速度時(shí),其內(nèi)部的電子器件會(huì)發(fā)生變化,進(jìn)
    的頭像 發(fā)表于 03-17 16:47 ?1395次閱讀
    <b class='flag-5'>加速度</b><b class='flag-5'>傳感器</b>的應(yīng)用與選購(gòu)技巧

    加速度傳感器的工作原理和應(yīng)用

    當(dāng)你的手機(jī)屏幕隨著手腕轉(zhuǎn)動(dòng)自動(dòng)切換橫豎屏,當(dāng)智能手環(huán)精確記錄下每天的步數(shù),當(dāng)汽車遭遇碰撞的瞬間安全氣囊閃電般彈出——這些看似“智能”的反應(yīng),其實(shí)都源于一個(gè)指甲蓋大小的裝置: 加速度傳感器 。它如同
    的頭像 發(fā)表于 02-27 19:59 ?2100次閱讀