娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

在GD32F310G-START開發(fā)板上讀取三軸加速度計(jì)

發(fā)布者:EtherealGaze最新更新時(shí)間:2024-11-11 來源: elecfans關(guān)鍵字:三軸加速度計(jì)  MCU 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

我拿到的開發(fā)板實(shí)際板載的 MCU 是 GD32F310G8,QFN28pin 封裝,基于 ARM CORTEX M4 內(nèi)核,主頻 72MHz, 芯片內(nèi)置 64KB flash,8KB SRAM, 兩路 I2C 外設(shè)。


整體概述

首先感謝極術(shù)社區(qū)給我試用GD32開發(fā)板的機(jī)會,讓我體驗(yàn)一下近幾年國產(chǎn)MCU開發(fā)體驗(yàn)。該芯片是基于arm cortex-M4內(nèi)核,主頻72Mhz,flash 64k,ram 8k,以及豐富的外設(shè)。

本次試用是一個讀取三軸加速度計(jì)的實(shí)驗(yàn),主要使用的是硬件iic。

硬件連接

傳感器介紹

SC7A20 是一款高精度 12bit 數(shù)字三軸加速度傳感器芯片,內(nèi)置功能 更豐富,功耗更低,體積更小,測量更精確。

芯片通過 IC2/SPI 接口與 MCU 通信,加速度測量數(shù)據(jù)以中斷方式或 查詢方式獲取。INT1和INT2中斷管腳提供多種內(nèi)部自動檢測的中斷信號, 適應(yīng)多種運(yùn)動檢測場合,中斷源包括 6D/4D 方向檢測中斷信號、自由落體 檢測中斷信號、睡眠和喚醒檢測中斷信號、單擊和雙擊檢測中斷信號。

芯片內(nèi)置高精度校準(zhǔn)模塊,對傳感器的失調(diào)誤差和增益誤差進(jìn)行精確補(bǔ)償。 ±2G、±4G、±8G 和±16G 四種可調(diào)整的全量程測量范圍,靈活測量外 部加速度,輸出數(shù)據(jù)率 1HZ 和 400HZ 間可選。

軟件功能

該軟件主要使用了GD32開發(fā)板的硬件iic,外部中斷以及串口,這三部分功能,串口的配置在其他文章的當(dāng)中已經(jīng)有敘述,本文只主要介紹iic和外部中斷的使用.

硬件iic

初始化gpio

poYBAGMtgqCAENdTAADYMDp2gJQ927.png


配置硬件iic

pYYBAGMtgrKANlA0AACpU0eW9Ys853.png

根據(jù)廠商提供的庫函數(shù)(具體參考gd32f3x0_i2c.c文件),我們可以很容易的初始化iic。剩下的就是對傳感器進(jìn)行配置了,該傳感器需要配置寄存器較多,廠商直接提供了一份demo程序,只需要適配讀取寫入的接口就可以很快的使用了。

pYYBAGMtgsiAZ6_LAADBYOow3zU754.png

我需要做的就是把iic的讀取和寫入進(jìn)行適配適配函數(shù)如下:


void I2C_LeaderWrite(uint16_t followerAddress, , uint8_t targetAddress, uint8_t *txBuff,

                     uint8_t numBytes) {

    /* wait until I2C bus is idle */

    while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY))

        ;

    /* send a start condition to I2C bus */

    i2c_start_on_bus(I2C0);

    /* wait until SBSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND))

        ;

    /* send slave address to I2C bus */

    i2c_master_addressing(I2C0, followerAddress, I2C_TRANSMITTER);

    /* wait until ADDSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))

        ;

    /* clear ADDSEND bit */

    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);

    /* wait until the transmit data buffer is empty */

    while (!i2c_flag_get(I2C0, I2C_FLAG_TBE))

        ;


    for (i = 0; i < numBytes; i++) {

        /* data transmission */

        i2c_data_transmit(I2C0, txBuff[i]);

        /* wait until the TBE bit is set */

        while (!i2c_flag_get(I2C0, I2C_FLAG_TBE))

            ;

    }

    /* send a stop condition to I2C bus */

    i2c_stop_on_bus(I2C0);

    /* wait until stop condition generate */

    while (I2C_CTL0(I2C0) & 0x0200)

        ;

}

void I2C_LeaderRead(uint16_t followerAddress, uint8_t targetAddress, uint8_t *rxBuff,

                    uint8_t numBytes) {

    /* wait until I2C bus is idle */

    while (i2c_flag_get(I2C0, I2C_FLAG_I2CBSY))

        ;


    /* send a start condition to I2C bus */

    i2c_start_on_bus(I2C0);


    /* wait until SBSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND))

        ;


    /* send slave address to I2C bus */

    i2c_master_addressing(I2C0, followerAddress, I2C_TRANSMITTER);


    /* wait until ADDSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))

        ;


    /* clear the ADDSEND bit */

    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);


    /* wait until the transmit data buffer is empty */

    while (SET != i2c_flag_get(I2C0, I2C_FLAG_TBE))

        ;


    /* enable I2C0*/

    i2c_enable(I2C0);


    /* send the EEPROM's internal address to write to */

    i2c_data_transmit(I2C0, targetAddress);


    /* wait until BTC bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_BTC))

        ;


    /* send a start condition to I2C bus */

    i2c_start_on_bus(I2C0);


    /* wait until SBSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_SBSEND))

        ;


    /* send slave address to I2C bus */

    i2c_master_addressing(I2C0, followerAddress, I2C_RECEIVER);


    /* wait until ADDSEND bit is set */

    while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND))

        ;


    /* clear the ADDSEND bit */

    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);


    /* while there is data to be read */

    for (int i = 0; i < numBytes; i++) {

        /* code */


        /* read a data from I2C_DATA */

        rxBuff[i++] = i2c_data_receive(I2C0);

        /* send a stop condition */

        i2c_stop_on_bus(I2C0);

    }


    /* wait until the stop condition is finished */

    while (I2C_CTL0(I2C0) & 0x0200)

        ;


    /* enable acknowledge */

    i2c_ack_config(I2C0, I2C_ACK_ENABLE);


    i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT);

}


然后把這兩個函數(shù)適配:

poYBAGMtgtqAJ3rOAAB9FKfsQfM576.png

然后對傳感器進(jìn)行設(shè)置

poYBAGMtgvyAM0GkAADiuobSYW4011.png

外部中斷


使用外部中斷可以使用用于喚醒mcu,這對設(shè)計(jì)低功耗的產(chǎn)品很有意義,當(dāng)傳感器超過設(shè)定的閾值的時(shí)候,那么就會產(chǎn)生一個中斷來通知mcu,需要進(jìn)一步的處理數(shù)據(jù),外部中斷的配置如下所示:


void exit_wakeup_interrupt_config(void)

{

     /* configure the priority group */

    nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);


    /* enable the key wakeup clock */

    rcu_periph_clock_enable(RCU_GPIOA);

    rcu_periph_clock_enable(RCU_CFGCMP);


    /* configure button pin as input */

    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);


    /* enable and set key wakeup EXTI interrupt to the higher priority */

    nvic_irq_enable(EXTI0_1_IRQn, 2U, 0U);


    /* connect key wakeup EXTI line to key GPIO pin */

    syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);


    /* configure key wakeup EXTI line */

    exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);

    exti_interrupt_flag_clear(EXTI_0);

}


數(shù)據(jù)處理

由于我們使用的是三軸傳感器,對于姿態(tài)位置的計(jì)算并不是很精確,因此,此處只用簡單角度計(jì)算,傾角的計(jì)算原理如下

poYBAGMtgxqAX2ZzAADMRlEI1A4650.png


pYYBAGMtgymATucYAAAfnX5F69k016.png


計(jì)算代碼如下:


#define DEG_TO_RAD(x) ((x) * 0.01745329252)

#define RAD_TO_DEG(x) ((x) * 57.2957795131)

void angle_calculation() {

    double pitch, roll, paw;

    pitch = atan(xyz_mg[X] / sqrt(pow(xyz_mg[Y], 2) + pow(xyz_mg[Z], 2)));

    roll = atan(xyz_mg[Y] / sqrt(pow(xyz_mg[X], 2) + pow(xyz_mg[Z], 2)));

    paw = atan(sqrt(pow(xyz_mg[X], 2) + pow(xyz_mg[Y], 2)) / xyz_mg[Z]);


    printf('[RAD]pitch:%.2f | roll:%.2f | paw:%.2f rn', pitch, roll, paw);

    printf('[DEG]pitch:%.2f° | roll:%.2f° | paw:%.2f° rn', RAD_TO_DEG(pitch), RAD_TO_DEG(roll),

           RAD_TO_DEG(paw));

}


關(guān)鍵字:三軸加速度計(jì)  MCU 引用地址:在GD32F310G-START開發(fā)板上讀取三軸加速度計(jì)

上一篇:GD32MCU最小系統(tǒng)構(gòu)成條件
下一篇:STM32 MPU是什么產(chǎn)品?了解嵌入式系統(tǒng)中微處理器的新變化

推薦閱讀最新更新時(shí)間:2025-07-04 10:18

基于加速度計(jì)SCA3000和LPC2210的傾斜角傳感器設(shè)計(jì)
由加速度傳感器測量傾斜角的途徑很多,文獻(xiàn)中提出了一種基于兩軸加速度傳感器ADXL213的傾角測量裝置,實(shí)現(xiàn)了全擺幅高精度測量,并能在運(yùn)動車輛中抵消前進(jìn)方向加速度,實(shí)現(xiàn)運(yùn)動中單方向高精度測量。文獻(xiàn)中同樣運(yùn)用兩軸壓力傳感器實(shí)現(xiàn)單方向全擺幅傾角測量文獻(xiàn)。文獻(xiàn)中運(yùn)用兩軸加速度傳感器ADXL202實(shí)現(xiàn)了全方位,45°擺幅內(nèi)低誤差傾斜角測量。文獻(xiàn)中運(yùn)用液態(tài)兩軸傾斜角傳感器實(shí)現(xiàn)全方位、低擺幅、高精度傾斜角傳感器。單軸加速度傳感器只能實(shí)現(xiàn)單方向,低擺幅傾斜角測量,兩軸傾斜角傳感器,方向和擺幅不能兼顧。本文將討論采用三軸微加速度傳感器實(shí)現(xiàn)智能化傾斜角傳感器方法。 1 傾斜角測量原理 對于軸加速度傳感器,當(dāng)它的傳感方向和重力加速度方向一致時(shí),假如
[單片機(jī)]
基于<font color='red'>三</font><font color='red'>軸</font><font color='red'>加速度計(jì)</font>SCA3000和LPC2210的傾斜角傳感器設(shè)計(jì)
英飛凌將CAPSENSE?集成到PSOC? HV MCU中 用于智能傳感器和執(zhí)行器
6月12日,英飛凌科技股份公司(Infineon Technologies AG)推出PSOC 4 HVMS產(chǎn)品系列,進(jìn)一步擴(kuò)展其PSOC? 4 HV微控制器(MCU)平臺。該系列產(chǎn)品針對空間受限的傳感或執(zhí)行器應(yīng)用進(jìn)行了優(yōu)化,將高壓功能和先進(jìn)的模擬傳感功能集成到標(biāo)準(zhǔn)微控制器中,只需極少的外部元件即可連接汽車電池和車載網(wǎng)絡(luò)。 圖片來源:英飛凌 在汽車市場,功能安全正日益被應(yīng)用于低端微控制器應(yīng)用。與此同時(shí),汽車設(shè)計(jì)師正致力于為空間受限的應(yīng)用開發(fā)緊湊、高度集成的控制單元。人們對智能、美觀的內(nèi)飾以及更佳駕駛體驗(yàn)的需求日益增長,也推動了對能夠在嚴(yán)苛條件下可靠工作的強(qiáng)大電容式感應(yīng)解決方案的需求。為了滿足這一需求,英飛凌推出PSOC
[汽車電子]
英飛凌將CAPSENSE?集成到PSOC? HV <font color='red'>MCU</font>中 用于智能傳感器和執(zhí)行器
車用MCU是從1到N的長期主義過程
汽車產(chǎn)業(yè)正在經(jīng)歷著巨大的變革,并體現(xiàn)出高速的增長勢頭。在這場變革中,背后對應(yīng)著兩個底層邏輯,第一是全球化從1到N的需求;第二,平臺化才是性價(jià)的保證。兆易創(chuàng)新科技集團(tuán)股份有限公司汽車產(chǎn)品部負(fù)責(zé)人何芳指出,一款芯片能否滿足客戶的需求,取決于這幾個階梯,第一階梯是可靠性,這是從1到N的關(guān)鍵;第二階梯是OTA,產(chǎn)品設(shè)計(jì)時(shí)需要定義如何支持未來10-15年汽車性能的OTA功能;第三階梯是可拓展性,幫助客戶更好地實(shí)現(xiàn)功能增加;第四階梯是平臺化,這是保證性價(jià)比、出口體系的關(guān)鍵一環(huán)。 然而,國內(nèi)企業(yè)由于發(fā)展歷程積累相較國外企業(yè)還比較短,同樣規(guī)格的產(chǎn)品在性價(jià)比上優(yōu)勢不高,那要如何找到適合自己的0到1?何芳指出:“首先要了解客戶未來在電子電氣
[汽車電子]
車用<font color='red'>MCU</font>是從1到N的長期主義過程
車規(guī)MCU市場“重構(gòu)”!群雄環(huán)伺下,中國本土廠商「蓄勢突圍」
在整車EE架構(gòu)加速升級的大背景之下,全球車規(guī)MCU市場已經(jīng)進(jìn)入了重塑期,中國本土車規(guī)MCU廠商正在蓄勢突圍。 9月25日,兆易創(chuàng)新GigaDevice(股票代碼 603986)重磅推出全新一代車規(guī)級MCU GD32A7系列。據(jù)悉,GD32A7系列搭載了超高性能Arm? Cortex?-M7內(nèi)核,并且集成了優(yōu)異的性能、增強(qiáng)的安全升級、豐富的外設(shè)接口,可以滿足車身域控(BDC)、車身控制(BCM)、遠(yuǎn)程通信終端(T-BOX)、車燈控制(Lighting)、電池管理(BMS)、車載充電機(jī)(OBC)、底盤應(yīng)用(Chassis)、直流變換器(DC-DC)等多種應(yīng)用場景。 眾所周知,由于技術(shù)壁壘高、研發(fā)難度大等原因,我國車規(guī)級M
[汽車電子]
車規(guī)<font color='red'>MCU</font>市場“重構(gòu)”!群雄環(huán)伺下,中國本土廠商「蓄勢突圍」
基于stm32單片機(jī)的通用定時(shí)器配置
stm32單片機(jī)的定時(shí)器資源相當(dāng)豐富,它的定時(shí)器分為高級控制定時(shí)器、通用定時(shí)器和基本定時(shí)器,具體這些定時(shí)器資源在哪個系列的片子有就得看不同的片子的手冊了。他們具體有什么區(qū)別,我也是剛接觸這個,看他的數(shù)據(jù)手冊介紹也是茫然,主要是剛開始摸,那些功能都沒用到,反正用做定時(shí)作用的話哪種定時(shí)器都行。在這我就把我自己配置通用定時(shí)器的方法及心得簡短做個總結(jié),以防以后忘記了。我配置的是定時(shí)器2(TIM2)。 通用定時(shí)器的時(shí)鐘可來自于外部或內(nèi)部,選用默認(rèn)即是采用內(nèi)部的。通用定時(shí)器的時(shí)鐘來源為APB1總線,所以首先,得將APB1外設(shè)時(shí)鐘打開。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)
[單片機(jī)]
基于51單片機(jī),蜂鳴器和led每秒1滴1亮的程序
#include reg52.h #define uchar unsigned char #define uint unsigned int int seccnt,m=0; char tzsta,msta; sbit led=P2^0; sbit beep=P1^5; void ini()//定時(shí)器0 { seccnt=0; msta=tzsta=0; TMOD=0x01; TH0=0x0FF; TL0=0x9C; TR0=1; } void on()//蜂鳴器和燈的功能 { if(m =500) { beep=~beep; } if(m =100
[單片機(jī)]
蜂鳴器播放DOREMI+普中51單片機(jī)+江科大自化協(xié)
現(xiàn)象 在無源蜂鳴器上循環(huán)演奏低音“DO、RE、MI、FA、SO、LA、SI”這7個音調(diào)。 參考程序 1 主函數(shù) #include REGX52.H #include delayms.h #include timer0.h sbit Buzzer = P2^5; //音調(diào)與頻率對照表,低中高:1,1#,2,2#,3,4,4#,5,5#,6,6#,7 //unsigned int FreqTable ={ // 63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528, // 64580,64633,64684,647
[單片機(jī)]
MCU CPU 區(qū)別
MCU(Micro Controller Unit),又稱單片微型計(jì)算機(jī)(Single Chip Microcomputer),簡稱單片機(jī),是指隨著大規(guī)模集成電路的出現(xiàn)及其發(fā)展,將計(jì)算機(jī)的CPU、RAM、ROM、定時(shí)數(shù)器和多種I/O接口集成在一片芯片上,形成芯片級的計(jì)算機(jī)。 MCU按其存儲器類型可分為無片內(nèi)ROM型和帶片內(nèi)ROM型兩種。對于無片內(nèi)ROM型的芯片,必須外接EPROM才能應(yīng)用(典型芯片為8031)。帶片內(nèi)ROM型的芯片又分為片內(nèi)EPROM型(典型芯片為87C51)、MASK片內(nèi)掩模ROM型(典型芯片為8051)、片內(nèi)FLASH型(典型芯片為89C51)等類型 CPU是中央處理單元(Central Processing
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 台州市| 万州区| 皮山县| 白城市| 灯塔市| 化隆| 乐清市| 保定市| 万荣县| 晋中市| 莲花县| 长治市| 西平县| 石林| 灌南县| 绥宁县| 聂拉木县| 阳朔县| 浦江县| 尉犁县| 临江市| 沂水县| 璧山县| 永嘉县| 琼中| 苗栗市| 牙克石市| 威海市| 思茅市| 南投县| 昌都县| 霍邱县| 抚宁县| 邮箱| 塔城市| 西盟| 博野县| 尚志市| 九龙坡区| 博罗县| 新密市|